From 41c865ee101b60e6b023fc2fecc72069819da7e9 Mon Sep 17 00:00:00 2001 From: Curtis Malainey Date: Mon, 6 Jul 2020 11:51:30 -0700 Subject: [PATCH 001/290] platforms: add missing platform geminilake Signed-off-by: Curtis Malainey --- platforms/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platforms/index.rst b/platforms/index.rst index c5b05ea7..5c5a4b2c 100644 --- a/platforms/index.rst +++ b/platforms/index.rst @@ -17,7 +17,7 @@ Platform and board specific support is continually added to the SOF project as d "Intel Baytrail / Merrifield", "Xtensa HiFi2 EP", "1 @ 50 - 400MHz", "96KB IRAM / 192KB DRAM", "3 x SSP (I2S, PCM)" "Intel Cherrytrail / Braswell", "Xtensa HiFi2 EP", "1 @ 50 - 400MHz", "96KB IRAM / 192KB DRAM", "6 x SSP (I2S, PCM)" "Intel Broadwell", "Xtensa HiFi2 EP", "1 @ 50 - 400MHz", "320KB IRAM / 640KB DRAM", "2 x SSP (I2S, PCM)" - "Intel Apollolake", "Xtensa HiFi3", "2 @ 100 - 400MHz", "128KB LP SRAM / 512KB HP SRAM", "6 x SSP (I2S, PCM), HDA, DMIC" + "Intel Apollolake / Geminilake", "Xtensa HiFi3", "2 @ 100 - 400MHz", "128KB LP SRAM / 512KB HP SRAM", "6 x SSP (I2S, PCM), HDA, DMIC" "Intel Cannonlake / Whiskeylake / Cometlake", "Xtensa HiFi3", "4 @ 120 - 400MHz", "64KB LP / 3008KB HP SRAM", "3 x SSP (I2S, PCM), HDA, DMIC, Soundwire" "Intel Suecreek", "Xtensa HiFi3", "2 @ 120 - 400MHz", "64KB LP SRAM / 4096KB HP SRAM", "6 x SSP (I2S, PCM), DMIC" "Intel Icelake", "Xtensa HiFi3", "4 @ 120 - 400MHz", "64KB LP SRAM / 3008KB HP SRAM", "6 x SSP (I2S, PCM), HDA, DMIC, Soundwire" From 7aeeaf050238731f446fce76a9d78c95f25b0d9e Mon Sep 17 00:00:00 2001 From: Tomasz Lauda Date: Tue, 7 Jul 2020 09:12:21 +0200 Subject: [PATCH 002/290] memory: add section about shared data Describes shared data concept and possible ways of implementation. Signed-off-by: Tomasz Lauda --- developer_guides/firmware/mem-mgmt.rst | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/developer_guides/firmware/mem-mgmt.rst b/developer_guides/firmware/mem-mgmt.rst index e55a1a97..0031c7a8 100644 --- a/developer_guides/firmware/mem-mgmt.rst +++ b/developer_guides/firmware/mem-mgmt.rst @@ -62,3 +62,28 @@ Runtime Zone Buffer Zone *********** + +Shared Data +************* + +By shared data we mean piece of memory, which is supposed to be accessed by different DSP cores. There are two ways of declaring data as shared depending on the type: + +* Static global variables should be marked with ``SHARED_DATA`` definition. + +* Heap data should be allocated with flag ``SOF_MEM_FLAG_SHARED``. + +Every read and write access to the shared data should be committed using dedicated ``platform_shared_commit`` function. It is used for keeping data synchronized. NOTE: There is no such thing as read only access. Shared data needs to be synchronized even after just reading. + +Both ``SHARED_DATA`` macro and ``platform_shared_commit`` function are platform specific and could be implemented differently on different platforms. There are two general approaches that can be used based on available hardware support: + +1. Platform uses L1 cache, but also supports uncached memory region: + + * ``SHARED_DATA`` puts data into dedicated firmware section, which is accessed using uncache. + + * ``platform_shared_commit`` does nothing. + +2. Platform uses L1 cache and doesn't support uncached memory region: + + * ``SHARED_DATA`` does nothing. + + * ``platform_shared_commit`` writebacks and invalidates cache. From acbe52be57ef45922e99831f9799b094de2fa7a2 Mon Sep 17 00:00:00 2001 From: Deb Taylor Date: Tue, 7 Jul 2020 11:02:33 -0400 Subject: [PATCH 003/290] Grammatical edits to the memory management page. Signed-off-by: Deb Taylor --- developer_guides/firmware/mem-mgmt.rst | 49 ++++++++++++++++---------- 1 file changed, 31 insertions(+), 18 deletions(-) diff --git a/developer_guides/firmware/mem-mgmt.rst b/developer_guides/firmware/mem-mgmt.rst index 0031c7a8..8d243ce1 100644 --- a/developer_guides/firmware/mem-mgmt.rst +++ b/developer_guides/firmware/mem-mgmt.rst @@ -25,28 +25,31 @@ Buffer Zone System Zone *********** - -System zone receives a series of allocations during the system initialization -phase. Since no memory is freed until the system (core) goes down, the -allocation mechanism may be simple, ensuring that a sufficient offset to the beginning of free space left is maintained. +The system zone receives a series of allocations during the system +initialization phase. Since no memory is freed until the system (core) goes +down, the allocation mechanism may be simple, ensuring that a sufficient +offset to the beginning of free space left is maintained. .. graphviz:: images/system-zone.dot :caption: System Zone -All system level components (schedulers, work queues, etc.) allocate their +All system-level components (schedulers, work queues, etc.) allocate their memory blocks from the system heap. Separation between the system heap and -runtime heap(s) may be further hardened in case an access control for user mode vs. kernel mode is supported by the architecture/platform. +runtime heap(s) may be further hardened in case an access control for user +mode vs. kernel mode is supported by the architecture/platform. Extensions for SMP Architectures ================================ -Each CPU (core) may own a dedicated system heap. The memory assigned for system heaps is distributed asymmetrically on CAVS platforms: a large heap for the master core (#0) and smaller ones for other cores (#1+). +Each CPU (core) may own a dedicated system heap. The memory assigned for +system heaps is distributed asymmetrically on CAVS platforms: a large heap +for the master core (#0) and smaller ones for other cores (#1+). When a core goes down, the entire heap can be freed by moving back the free space offset to the beginning of the heap. The heap can be aligned with memory bank(s) to provide better control over -the power consumption. Once a core goes down, memory banks allocated for +power consumption. Once a core goes down, memory banks allocated for its system heap can be powered off as well. Runtime Zone @@ -54,8 +57,8 @@ Runtime Zone * Provides flexible ``malloc``/``free`` operations. -* Since the runtime zone is separated from the system zone, any adjustments - and complex usage scenarios do not interface with the system allocations. +* Since the runtime zone is separated from the system zone, adjustment + and complex usage scenarios do not interface with system allocations. .. graphviz:: images/runtime-zone.dot :caption: Runtime Zone @@ -63,26 +66,36 @@ Runtime Zone Buffer Zone *********** +Information is forthcoming. + Shared Data ************* -By shared data we mean piece of memory, which is supposed to be accessed by different DSP cores. There are two ways of declaring data as shared depending on the type: +Shared data refers to a piece of memory that can be accessed by different +DSP cores. Data can be declared as shared in one of two ways, depending on +its type: -* Static global variables should be marked with ``SHARED_DATA`` definition. +* Static global variables are marked with the ``SHARED_DATA`` definition. -* Heap data should be allocated with flag ``SOF_MEM_FLAG_SHARED``. +* Heap data is allocated with the ``SOF_MEM_FLAG_SHARED`` flag. -Every read and write access to the shared data should be committed using dedicated ``platform_shared_commit`` function. It is used for keeping data synchronized. NOTE: There is no such thing as read only access. Shared data needs to be synchronized even after just reading. +To keep data synchronized, commit very read and write access to the shared +data by using the dedicated ``platform_shared_commit`` function. Note that +read-only access does not exist and that shared data must be synchronized +even after just reading. -Both ``SHARED_DATA`` macro and ``platform_shared_commit`` function are platform specific and could be implemented differently on different platforms. There are two general approaches that can be used based on available hardware support: +Both the ``SHARED_DATA`` macro and the ``platform_shared_commit`` function +are platform-specific and can be implemented differently on different +platforms. Two general approaches can be used, based on available hardware +support: -1. Platform uses L1 cache, but also supports uncached memory region: +1. Platform uses L1 cache, but also supports uncached memory regions: - * ``SHARED_DATA`` puts data into dedicated firmware section, which is accessed using uncache. + * ``SHARED_DATA`` puts data into a dedicated firmware section that is accessed using uncache. * ``platform_shared_commit`` does nothing. -2. Platform uses L1 cache and doesn't support uncached memory region: +2. Platform uses L1 cache and doesn't support uncached memory regions: * ``SHARED_DATA`` does nothing. From b8cc6d87363a194a96cae74e91c1905f87fc0ffc Mon Sep 17 00:00:00 2001 From: Deb Taylor Date: Tue, 7 Jul 2020 16:29:33 -0400 Subject: [PATCH 004/290] Removed references to master/slave; replaced with primary/secondary Signed-off-by: Deb Taylor --- .../dsp/intel/cavs-boot/cavs-dsp-boot-overview.rst | 4 +++- architectures/dsp/intel/smp/index.rst | 10 ++++++---- .../linux_driver/architecture/sof_driver_arch.rst | 3 ++- developer_guides/topology/topology.rst | 4 +++- platforms/intel-cavs/commons/work-queue.rst | 13 ++++++++----- 5 files changed, 22 insertions(+), 12 deletions(-) diff --git a/architectures/dsp/intel/cavs-boot/cavs-dsp-boot-overview.rst b/architectures/dsp/intel/cavs-boot/cavs-dsp-boot-overview.rst index e846bbc4..79adf3f0 100644 --- a/architectures/dsp/intel/cavs-boot/cavs-dsp-boot-overview.rst +++ b/architectures/dsp/intel/cavs-boot/cavs-dsp-boot-overview.rst @@ -16,7 +16,7 @@ There are two main DSP boot flows: IPC Communication with DSP ROM ****************************** -Once the master DSP core (#0) is powered up and reset by the host driver, an +Once the primary DSP core (#0) is powered up and reset by the host driver, an IPC communication with the DSP ROM is required in order to set the boot options (see Boot Path Control Messages for details and list of platforms that require this step). It is a one-way message that does not require a response @@ -125,3 +125,5 @@ Booting with Boot Loader .. uml:: images/boot-ldr-flow.pu :caption: SOF Boot Loader Flow + +.. comment "master" has been replaced with "primary" \ No newline at end of file diff --git a/architectures/dsp/intel/smp/index.rst b/architectures/dsp/intel/smp/index.rst index 49a6753f..cf6e49d1 100644 --- a/architectures/dsp/intel/smp/index.rst +++ b/architectures/dsp/intel/smp/index.rst @@ -44,19 +44,21 @@ This structure contains pointers to the XTOS data along with struct idc *idc; }; -``struct core_context`` is allocated by master core for slave cores before -slave core boot. Address of the ``struct core_context`` is written into -``THREADPTR`` processor register, which can later be retrieved by slave core +``struct core_context`` is allocated by primary core for secondary cores before +secondary core boot. Address of the ``struct core_context`` is written into +``THREADPTR`` processor register, which can later be retrieved by the secondary core after boot. Every core has its own instance of ``THREADPTR``, so ``struct core_context`` address can be read anytime at any place of the code. Communication between cores *************************** -Master core can communicate with slave cores by sending messages using +Secondary core can communicate with primary cores by sending messages using IDC mechanism. This mechanism is pretty much the same as IPC. Important data can be sent in two 32-bit IDC registers. Cores use interrupts to register for the incoming messages. .. uml:: ../images/idc-send-message.pu +.. comment "master" has been replaced with "primary" +.. comment "slave" has been replaced with "secondary" \ No newline at end of file diff --git a/developer_guides/linux_driver/architecture/sof_driver_arch.rst b/developer_guides/linux_driver/architecture/sof_driver_arch.rst index 4d478125..ba09f110 100644 --- a/developer_guides/linux_driver/architecture/sof_driver_arch.rst +++ b/developer_guides/linux_driver/architecture/sof_driver_arch.rst @@ -105,7 +105,7 @@ SOF on both the host and the DSP serializes the sending of their IPC messages. T SPI === -IPC messages have the same structure as in the PCI case, but they are sent and received over an SPI bus. The SPI transfer is always initiated by the SPI master, which is the host. Therefore, the DSP cannot send asynchronous messages to the host using only the SPI bus. To overcome this limitation, an additional GPIO line is used by the DSP to trigger an interrupt on the host to request it to read out an IPC message. Support for such devices is still experimental in SOF. Details will be added later. +IPC messages have the same structure as in the PCI case, but they are sent and received over an SPI bus. The SPI transfer is always initiated by the SPI primary, which is the host. Therefore, the DSP cannot send asynchronous messages to the host using only the SPI bus. To overcome this limitation, an additional GPIO line is used by the DSP to trigger an interrupt on the host to request it to read out an IPC message. Support for such devices is still experimental in SOF. Details will be added later. iMX IPC ======= @@ -345,3 +345,4 @@ Sending position update IPC from the firmware to the host is a generic method to In order to debug issues with IOC/DPIB, the force IPC position kernel debug config can be selected. On Intel SKL- platforms, the stream position update IPC is used whether or not this option is selected. +.. comment "master" has been replaced with "primary" \ No newline at end of file diff --git a/developer_guides/topology/topology.rst b/developer_guides/topology/topology.rst index 452e06c2..745f4339 100644 --- a/developer_guides/topology/topology.rst +++ b/developer_guides/topology/topology.rst @@ -260,7 +260,7 @@ macro: where: | **format**: is the SSP format ex: I2S or DSP_A or DSP_B etc -| **mclk**: master clock in Hz +| **mclk**: primary clock in Hz | **bclk**: bit clock in Hz | **fsync**: frame sync | **TDM**: TDM info including the slots, width, tx mask and rx mask @@ -611,3 +611,5 @@ actually push both messages to a dot file: .. _M4: http://www.gnu.org/software/m4/m4.html .. _here: https://www.alsa-project.org/main/index.php/ALSA_topology .. _SOFT: https://github.com/thesofproject/soft + +.. comment "master" has been replaced with "primary" \ No newline at end of file diff --git a/platforms/intel-cavs/commons/work-queue.rst b/platforms/intel-cavs/commons/work-queue.rst index 7b47f463..bdd74005 100644 --- a/platforms/intel-cavs/commons/work-queue.rst +++ b/platforms/intel-cavs/commons/work-queue.rst @@ -7,12 +7,12 @@ On CAVS platforms, the wall clock is used as a time source for multiple work queues (one work queue instance per active core). Since enough comparators are not available, all instances register to a shared -interrupt where one comparator is used to wake up all. The master core +interrupt where one comparator is used to wake up all. The primary core re-programs the wall clock to the next wake event. Its work queue operates in -*master mode*. Work queues running on other cores are attached to the shared -time source on CAVS SMP platforms; these are configured to the *slave mode*. On +*primary mode*. Work queues running on other cores are attached to the shared +time source on CAVS SMP platforms; these are configured to the *secondary mode*. On other SMP platforms where multiple independent time sources are available, all -queues can be configured in *master mode*. +queues can be configured in *primary mode*. Synchronous SysTick on All Cores ******************************** @@ -34,7 +34,7 @@ queues, thus making pipelines scheduling fully *systick aligned*. In the case of more complex topologies, pipelines that start/terminate with a component other then dai can be also driven by work queues. -.. note:: Work queue master/slave mode vs. independent mode configurable by +.. note:: Work queue primary/secondary mode vs. independent mode configurable by CONFIG @ compile time. The work queue min tick (1ms/0.33ms/1us) is configurable @ run-time so that the current mode is still fully supported. @@ -43,3 +43,6 @@ component other then dai can be also driven by work queues. .. uml:: images/work-smp-cavs.pu :caption: Work queue flow for CAVS SMP + +.. comment "master" has been replaced with "primary" +.. comment "slave" has been replaced with "secondary" From a4c5e518a37085fba76934fec85197b44aab02c8 Mon Sep 17 00:00:00 2001 From: Deb Taylor Date: Wed, 8 Jul 2020 09:26:05 -0400 Subject: [PATCH 005/290] Replace "master" with "primary" in Mem Mangt doc Signed-off-by: Deb Taylor --- developer_guides/firmware/mem-mgmt.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/developer_guides/firmware/mem-mgmt.rst b/developer_guides/firmware/mem-mgmt.rst index 8d243ce1..447257d6 100644 --- a/developer_guides/firmware/mem-mgmt.rst +++ b/developer_guides/firmware/mem-mgmt.rst @@ -43,7 +43,7 @@ Extensions for SMP Architectures Each CPU (core) may own a dedicated system heap. The memory assigned for system heaps is distributed asymmetrically on CAVS platforms: a large heap -for the master core (#0) and smaller ones for other cores (#1+). +for the primary core (#0) and smaller ones for other cores (#1+). When a core goes down, the entire heap can be freed by moving back the free space offset to the beginning of the heap. From e0d9d5b2961cbd9978e5e6e2ab6e557ce4ff0160 Mon Sep 17 00:00:00 2001 From: Deb Taylor Date: Wed, 8 Jul 2020 10:24:33 -0400 Subject: [PATCH 006/290] Changed "master" in Topology and SOF Arch docs Signed-off-by: Deb Taylor --- .../linux_driver/architecture/sof_driver_arch.rst | 6 ++---- developer_guides/topology/topology.rst | 4 ++-- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/developer_guides/linux_driver/architecture/sof_driver_arch.rst b/developer_guides/linux_driver/architecture/sof_driver_arch.rst index ba09f110..60e6ec76 100644 --- a/developer_guides/linux_driver/architecture/sof_driver_arch.rst +++ b/developer_guides/linux_driver/architecture/sof_driver_arch.rst @@ -105,7 +105,7 @@ SOF on both the host and the DSP serializes the sending of their IPC messages. T SPI === -IPC messages have the same structure as in the PCI case, but they are sent and received over an SPI bus. The SPI transfer is always initiated by the SPI primary, which is the host. Therefore, the DSP cannot send asynchronous messages to the host using only the SPI bus. To overcome this limitation, an additional GPIO line is used by the DSP to trigger an interrupt on the host to request it to read out an IPC message. Support for such devices is still experimental in SOF. Details will be added later. +IPC messages have the same structure as in the PCI case, but they are sent and received over an SPI bus. The SPI transfer is always initiated by the host. Therefore, the DSP cannot send asynchronous messages to the host using only the SPI bus. To overcome this limitation, an additional GPIO line is used by the DSP to trigger an interrupt on the host to request it to read out an IPC message. Support for such devices is still experimental in SOF. Details will be added later. iMX IPC ======= @@ -343,6 +343,4 @@ Force IPC Position Sending position update IPC from the firmware to the host is a generic method to generate period interrupts to meet the requirement from the ALSA IRQ mode (e.g. ``snd_pcm_period_elapsed()``). On some HDA-integrated platforms (e.g. Intel SKL+ ones), this interrupt can be generated using the `HDA `_ period IOC (interrupt on complete) and the real-time buffer pointers can be read back from the DPIB (DMA Pointer In Buffer). On these platforms, the position update IPC is only the fallback choice and is not used by default. -In order to debug issues with IOC/DPIB, the force IPC position kernel debug config can be selected. On Intel SKL- platforms, the stream position update IPC is used whether or not this option is selected. - -.. comment "master" has been replaced with "primary" \ No newline at end of file +In order to debug issues with IOC/DPIB, the force IPC position kernel debug config can be selected. On Intel SKL- platforms, the stream position update IPC is used whether or not this option is selected. \ No newline at end of file diff --git a/developer_guides/topology/topology.rst b/developer_guides/topology/topology.rst index 745f4339..66441650 100644 --- a/developer_guides/topology/topology.rst +++ b/developer_guides/topology/topology.rst @@ -260,7 +260,7 @@ macro: where: | **format**: is the SSP format ex: I2S or DSP_A or DSP_B etc -| **mclk**: primary clock in Hz +| **mclk**: main clock in Hz | **bclk**: bit clock in Hz | **fsync**: frame sync | **TDM**: TDM info including the slots, width, tx mask and rx mask @@ -612,4 +612,4 @@ actually push both messages to a dot file: .. _here: https://www.alsa-project.org/main/index.php/ALSA_topology .. _SOFT: https://github.com/thesofproject/soft -.. comment "master" has been replaced with "primary" \ No newline at end of file +.. comment "master" has been replaced with "main" \ No newline at end of file From f5f2c28b74f4cef220977928199a4cbd11b2a7b4 Mon Sep 17 00:00:00 2001 From: Kai Vehmanen Date: Thu, 9 Jul 2020 14:04:30 +0300 Subject: [PATCH 007/290] doc: do not hide doxygen group documention Adjust the CSS rules to not hide API group documentation such as the text we have in include/ipc/header.h. In Breathe output for doxygen groups,
tags are used to show the group name. These do not look nice and do not relay any useful info, so better to keep them hidden still. Co-developed-by: Marcin Maka Co-developed-by: Kevin Putnam Signed-off-by: Kai Vehmanen --- static/sof-custom.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/sof-custom.css b/static/sof-custom.css index f13450f0..c822a6b9 100644 --- a/static/sof-custom.css +++ b/static/sof-custom.css @@ -77,7 +77,7 @@ th,td { } /* tweak for doxygen-generated API headings (for RTD theme) */ -.rst-content dl.group>dt, .rst-content dl.group>dd>p { +.rst-content dl.group>dt { display:none !important; } .rst-content dl.group { From 6b4725732692f094a864fc3179455cdcdd00b7fe Mon Sep 17 00:00:00 2001 From: Tomasz Lauda Date: Fri, 10 Jul 2020 10:22:38 +0200 Subject: [PATCH 008/290] schedulers: add section about different schedulers Adds description regarding different supported schedulers. Signed-off-by: Tomasz Lauda --- .../firmware/images/edf-scheduler-deps.pu | 6 +++ .../firmware/images/edf-scheduler-flow.pu | 21 +++++++++ .../firmware/images/ll-scheduler-deps.pu | 30 +++++++++++++ .../firmware/images/ll-scheduler-flow.pu | 26 +++++++++++ .../firmware/images/scheduler-ops.pu | 19 ++++++++ developer_guides/firmware/index.rst | 1 + developer_guides/firmware/schedulers.rst | 44 +++++++++++++++++++ 7 files changed, 147 insertions(+) create mode 100644 developer_guides/firmware/images/edf-scheduler-deps.pu create mode 100644 developer_guides/firmware/images/edf-scheduler-flow.pu create mode 100644 developer_guides/firmware/images/ll-scheduler-deps.pu create mode 100644 developer_guides/firmware/images/ll-scheduler-flow.pu create mode 100644 developer_guides/firmware/images/scheduler-ops.pu create mode 100644 developer_guides/firmware/schedulers.rst diff --git a/developer_guides/firmware/images/edf-scheduler-deps.pu b/developer_guides/firmware/images/edf-scheduler-deps.pu new file mode 100644 index 00000000..89bd4137 --- /dev/null +++ b/developer_guides/firmware/images/edf-scheduler-deps.pu @@ -0,0 +1,6 @@ +class "edf_schedule_data" as edf { + - list : list + - clock + - irq +} +hide edf methods diff --git a/developer_guides/firmware/images/edf-scheduler-flow.pu b/developer_guides/firmware/images/edf-scheduler-flow.pu new file mode 100644 index 00000000..db1b44db --- /dev/null +++ b/developer_guides/firmware/images/edf-scheduler-flow.pu @@ -0,0 +1,21 @@ +actor client as c + +participant edf_scheduler as edf +participant interrupt_driver as int + +-> edf : scheduler_init() + activate edf + edf -> int : interrupt_register(edf_scheduler_run) + deactivate edf +<-- edf +... +c -> edf : schedule_task(&task) + activate edf + edf -> int : interrupt_set() + deactivate edf +c <-- edf + +edf <- int : edf_scheduler_run() + activate edf + edf -> edf : schedule_task_running() + edf -> edf : schedule_task_complete() diff --git a/developer_guides/firmware/images/ll-scheduler-deps.pu b/developer_guides/firmware/images/ll-scheduler-deps.pu new file mode 100644 index 00000000..5ff8f402 --- /dev/null +++ b/developer_guides/firmware/images/ll-scheduler-deps.pu @@ -0,0 +1,30 @@ +class "ll_schedule_data" as lsd { + - tasks : list + - num_tasks + - pcd + - domain +} +hide lsd methods + +class "ll_schedule_domain" as lsdom { + - last_tick + - lock + - total_num_tasks + - num_clients + - ticks_per_ms + - type + - clk + - synchronous + - priv_data + - registered : array + - enabled : array + + domain_register() + + domain_unregister() + + domain_enable() + + domain_disable() + + domain_set() + + domain_clear() + + domain_is_pending() +} + +lsd *-- lsdom : contains diff --git a/developer_guides/firmware/images/ll-scheduler-flow.pu b/developer_guides/firmware/images/ll-scheduler-flow.pu new file mode 100644 index 00000000..fafdd382 --- /dev/null +++ b/developer_guides/firmware/images/ll-scheduler-flow.pu @@ -0,0 +1,26 @@ +actor client as c + +participant ll_scheduler as ls +participant ll_schedule_domain as lsd + +-> lsd : domain_init +<-- lsd : domain + +-> ls : scheduler_init(&domain) +<-- ls +... +c -> ls : schedule_task(&task) + activate ls + ls -> lsd : domain_register(schedule_ll_tasks_run) + ls -> lsd : domain_enable() + deactivate ls +c <-- ls +... +ls <- lsd : schedule_ll_tasks_run() + activate ls + ls -> lsd : domain_disable() + loop schedule_ll_is_pending() + ls -> ls : schedule_ll_tasks_execute() + end loop + ls -> lsd : domain_enable() + deactivate ls diff --git a/developer_guides/firmware/images/scheduler-ops.pu b/developer_guides/firmware/images/scheduler-ops.pu new file mode 100644 index 00000000..80bf07b1 --- /dev/null +++ b/developer_guides/firmware/images/scheduler-ops.pu @@ -0,0 +1,19 @@ +class "scheduler_ops" { + .. Mandatory .. + + schedule_task() + + schedule_task_cancel() + + schedule_task_free() + .. Optional .. + + schedule_task_running() + + schedule_task_complete() + + reschedule_task() + + scheduler_free() + + scheduler_run() +} + +enum schedule_types { + SOF_SCHEDULE_EDF + SOF_SCHEDULE_LL_TIMER + SOF_SCHEDULE_LL_DMA +} +hide schedule_types methods diff --git a/developer_guides/firmware/index.rst b/developer_guides/firmware/index.rst index fa7c1bcb..d212e3b9 100644 --- a/developer_guides/firmware/index.rst +++ b/developer_guides/firmware/index.rst @@ -11,6 +11,7 @@ Developer guides and information for firmware development. component-tutorial/tut-intro mem-mgmt pm-runtime/index + schedulers work-queue drivers/index components/index diff --git a/developer_guides/firmware/schedulers.rst b/developer_guides/firmware/schedulers.rst new file mode 100644 index 00000000..310d6206 --- /dev/null +++ b/developer_guides/firmware/schedulers.rst @@ -0,0 +1,44 @@ +.. _schedulers: + +Schedulers +########## + +Scheduler Registration +********************** + +Schedule API is an abstract layer, which allows for scheduler registration, task creation and scheduling. New schedulers can be added by extending list of already defined schedule types. Currently supported types are: ``SOF_SCHEDULE_EDF``, ``SOF_SCHEDULE_LL_TIMER`` and ``SOF_SCHEDULE_LL_DMA``. Every newly added scheduler should implement at least mandatory subset of ``scheduler_ops``. + +.. uml:: images/scheduler-ops.pu + :caption: Scheduler operations + +Function ``scheduler_init`` needs to be called in order to register scheduler with given ``type``, ``scheduler_ops`` and custom scheduler's data. Scheduling is as simple as initializing task with ``schedule_task_init`` and passing such object later on to scheduler operations. + +Low Latency Scheduler +********************* + +Low latency scheduler executes all registered tasks one after another based on their initial priority and period of execution. This kind of task chain is called in critical section, so there is no possibility of any system interrupt preemption. This means, that every client of the scheduler should be aware of the task's expected DSP utilization and not try to register long running processings, which may lead to system instability. + +Low latency scheduler requires low latency schedule domain in order to be initialized. Every domain means different type of interrupt source running the scheduler. Currently there are three domains supported: timer, DMA multiple channels based and DMA single channel based. Timer domain is just simple timer based interrupt asserting after specified number of cycles. The difference between DMA multiple and single channel based domains is that for multiple channels the scheduler will run after every channel interrupt and for single based only on interrupt coming from one of the channels. Appropriate DMA channel is selected based on the order of task registration and also based on the task's period. + +It's worth noting that domains are shared among all DSP cores, but low latency schedulers are instantiated per core. + +.. uml:: images/ll-scheduler-deps.pu + :caption: Low latency scheduler dependencies + +.. uml:: images/ll-scheduler-flow.pu + :caption: Basic low latency scheduler flow + +EDF Scheduler +************* + +EDF scheduler executes all registered tasks based on their deadline. Every EDF task has its own private stack, which allows to support full preemption. It means that the task with earlier deadline can easily pause the execution of the task with higher deadline, execute first, and return to the preempted task after that. EDF tasks run on passive irq level, so they can be preempted by every interrupt. + +EDF scheduler is instantiated per core. + +.. uml:: images/edf-scheduler-deps.pu + :caption: EDF scheduler structure + +.. uml:: images/edf-scheduler-flow.pu + :caption: Basic EDF scheduler flow + + From c6be3e054e1c6bf877a312fb7b3e551e50e86e77 Mon Sep 17 00:00:00 2001 From: Tomasz Lauda Date: Fri, 10 Jul 2020 12:30:57 +0200 Subject: [PATCH 009/290] work-queue: remove deprecated chapter Removes no longer valid chapter about work-queues. Signed-off-by: Tomasz Lauda --- .../firmware/images/work-queue-deps.pu | 40 ------------------- .../firmware/images/work-schedule.pu | 26 ------------ developer_guides/firmware/index.rst | 1 - developer_guides/firmware/work-queue.rst | 30 -------------- 4 files changed, 97 deletions(-) delete mode 100644 developer_guides/firmware/images/work-queue-deps.pu delete mode 100644 developer_guides/firmware/images/work-schedule.pu delete mode 100644 developer_guides/firmware/work-queue.rst diff --git a/developer_guides/firmware/images/work-queue-deps.pu b/developer_guides/firmware/images/work-queue-deps.pu deleted file mode 100644 index d9c20f44..00000000 --- a/developer_guides/firmware/images/work-queue-deps.pu +++ /dev/null @@ -1,40 +0,0 @@ -class "struct work" as s_work { - cb - cb_data - timeout - flags -} -hide s_work methods - -enum flags { - SYNC - ASYNC -} -hide flags methods - -class "struct work_queue_timesource" as s_wq_timesource -hide s_wq_timesource methods -hide s_wq_timesource attributes - -class "work_queue" as wq { - + work_schedule() - + work_reschedule() - + work_cancel() - - is_work_pending() - - work_next_timeout() - - run_work() - - work : list -} - -class client #a1a1ca -hide client methods -hide client attributes - -wq o- s_work -wq <- s_wq_timesource : provides timer INT - -s_work - flags - -client -> s_work : (1) creates -client ---> wq : (2) schedules work -wq ---> client : (3) calls cb(cb_data) upon timeout diff --git a/developer_guides/firmware/images/work-schedule.pu b/developer_guides/firmware/images/work-schedule.pu deleted file mode 100644 index 6be68be6..00000000 --- a/developer_guides/firmware/images/work-schedule.pu +++ /dev/null @@ -1,26 +0,0 @@ -actor client as c - -participant work_queue as wq -participant timer as t - --> wq : work_new_queue - wq -> t : timer_register(queue_run) -<-- wq - -c -> wq : work_schedule(&work) - activate wq - - wq -> wq : queue_reschedule() - activate wq - wq -> wq : queue_get_next_timeout() : timeout - wq -> t : work_set_timer(timeout) - deactivate wq -c <-- wq -deactivate wq -... -wq <- t : queue_run() - activate wq - loop is_work_pending() - wq -> wq : run_work() - end loop - wq -> wq : queue_reschedule() diff --git a/developer_guides/firmware/index.rst b/developer_guides/firmware/index.rst index d212e3b9..9584ee4f 100644 --- a/developer_guides/firmware/index.rst +++ b/developer_guides/firmware/index.rst @@ -12,7 +12,6 @@ Developer guides and information for firmware development. mem-mgmt pm-runtime/index schedulers - work-queue drivers/index components/index pipelines/index diff --git a/developer_guides/firmware/work-queue.rst b/developer_guides/firmware/work-queue.rst deleted file mode 100644 index f3be4a97..00000000 --- a/developer_guides/firmware/work-queue.rst +++ /dev/null @@ -1,30 +0,0 @@ -.. _work-queue: - -Work Queue -########## - -A work queue service provides a timer API for other FW parts. A timer API -client (a component, device, etc.) registers a callback and specifies when the -callback should be invoked. - -Refer to TBD for full API specification. - -A source of time for the work queue is implemented by the specific platform -and depends on the underlying architecture and the HW capabilities which -determine the resolution of the timer. - -.. uml:: images/work-queue-deps.pu - :caption: Work queue dependencies - -Basic Work Queue Flow -********************* - -.. uml:: images/work-schedule.pu - :caption: Basic work queue flow - -Extensions for SMP Architectures -******************************** - -CPUs with platforms built on the SMP architecture contain only one work queue -instance. A client registers its callback in the queue instance that is running -on the CPU that the callback is supposed to run. From 92c73e20979cd96b1e3b481e6a1529816a309a03 Mon Sep 17 00:00:00 2001 From: Deb Taylor Date: Tue, 14 Jul 2020 22:21:14 -0400 Subject: [PATCH 010/290] Grammatical edits to the schedulers doc Signed-off-by: Deb Taylor --- developer_guides/firmware/schedulers.rst | 43 +++++++++++++++++++----- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/developer_guides/firmware/schedulers.rst b/developer_guides/firmware/schedulers.rst index 310d6206..3070599c 100644 --- a/developer_guides/firmware/schedulers.rst +++ b/developer_guides/firmware/schedulers.rst @@ -6,21 +6,41 @@ Schedulers Scheduler Registration ********************** -Schedule API is an abstract layer, which allows for scheduler registration, task creation and scheduling. New schedulers can be added by extending list of already defined schedule types. Currently supported types are: ``SOF_SCHEDULE_EDF``, ``SOF_SCHEDULE_LL_TIMER`` and ``SOF_SCHEDULE_LL_DMA``. Every newly added scheduler should implement at least mandatory subset of ``scheduler_ops``. +The Schedule API is an abstract layer that allows for scheduler +registration, task creation, and scheduling. New schedulers can be added by +extending a list of pre-defined schedule types. Currently supported types +are: ``SOF_SCHEDULE_EDF``, ``SOF_SCHEDULE_LL_TIMER`` and ``SOF_SCHEDULE_LL_DMA``. Every newly-added scheduler should implement at least +a mandatory subset of ``scheduler_ops``. .. uml:: images/scheduler-ops.pu :caption: Scheduler operations -Function ``scheduler_init`` needs to be called in order to register scheduler with given ``type``, ``scheduler_ops`` and custom scheduler's data. Scheduling is as simple as initializing task with ``schedule_task_init`` and passing such object later on to scheduler operations. +The ``scheduler_init`` function must called in order to register the +scheduler with a given ``type``, ``scheduler_ops``, and the custom +scheduler's data. Scheduling is as simple as initializing a task with ``schedule_task_init`` and passing such an object later on to scheduler +operations. Low Latency Scheduler ********************* -Low latency scheduler executes all registered tasks one after another based on their initial priority and period of execution. This kind of task chain is called in critical section, so there is no possibility of any system interrupt preemption. This means, that every client of the scheduler should be aware of the task's expected DSP utilization and not try to register long running processings, which may lead to system instability. - -Low latency scheduler requires low latency schedule domain in order to be initialized. Every domain means different type of interrupt source running the scheduler. Currently there are three domains supported: timer, DMA multiple channels based and DMA single channel based. Timer domain is just simple timer based interrupt asserting after specified number of cycles. The difference between DMA multiple and single channel based domains is that for multiple channels the scheduler will run after every channel interrupt and for single based only on interrupt coming from one of the channels. Appropriate DMA channel is selected based on the order of task registration and also based on the task's period. - -It's worth noting that domains are shared among all DSP cores, but low latency schedulers are instantiated per core. +The low latency scheduler executes all registered tasks concurrently based +on their initial priorities and periods of execution. This task chain is a *critical section* which removes any possibility of a system interrupt +preemption. Thus, every client of the scheduler should be aware of the +task's expected DSP utilization and try not to register long-running +processings which can lead to system instability. + +The low latency scheduler requires a low latency schedule domain in order to +be initialized. Each domain includes a different type of interrupt source +that runs the scheduler. Three domains are supported: timer, DMA multiple +channels, and DMA single channel. The timer domain is a simple timer-based +interrupt that occurs after a specified number of cycles. Schedulers for the +DMA multiple channels domain run after every channel interrupt. DMA single +channels run only on interrupts coming from one of the channels. The +appropriate DMA channel is selected based on the order of task registration +and also the task's period. + +Note that even though the domains are shared among all DSP cores, the low +latency schedulers are instantiated per core. .. uml:: images/ll-scheduler-deps.pu :caption: Low latency scheduler dependencies @@ -31,9 +51,14 @@ It's worth noting that domains are shared among all DSP cores, but low latency s EDF Scheduler ************* -EDF scheduler executes all registered tasks based on their deadline. Every EDF task has its own private stack, which allows to support full preemption. It means that the task with earlier deadline can easily pause the execution of the task with higher deadline, execute first, and return to the preempted task after that. EDF tasks run on passive irq level, so they can be preempted by every interrupt. +The EDF scheduler executes all registered tasks based on their deadlines. +Every EDF task has its own private stack which allows for full preemption +support. The task with an earlier deadline can easily pause the execution of +the task with a higher deadline, execute first, and return to the preempted +task after that. Since EDF tasks run on a passive irq level, they can be +preempted by every interrupt. -EDF scheduler is instantiated per core. +The EDF scheduler is instantiated per core. .. uml:: images/edf-scheduler-deps.pu :caption: EDF scheduler structure From 8378246ecb47344283e3d1046921a943b2d7e2e6 Mon Sep 17 00:00:00 2001 From: Yong Zhi Date: Mon, 30 Mar 2020 16:57:26 -0500 Subject: [PATCH 011/290] probes: Add more details on how to use the feature Add few more necessary details to enable first time user for effective use of the probes debug capability. Signed-off-by: Yong Zhi --- .../debugability/probes/index.rst | 73 ++++++++++++++++++- 1 file changed, 70 insertions(+), 3 deletions(-) diff --git a/developer_guides/debugability/probes/index.rst b/developer_guides/debugability/probes/index.rst index bc33e3d2..47a80639 100644 --- a/developer_guides/debugability/probes/index.rst +++ b/developer_guides/debugability/probes/index.rst @@ -17,7 +17,14 @@ Requirements Enabling Probes *************** -- Enable the Linux kernel configuration option: ``DEBUG_FS`` +- Enable the following Linux kernel configuration options: + + .. code-block:: bash + + CONFIG_DEBUG_FS=y + CONFIG_SND_SOC_SOF_DEBUG_PROBES=y + CONFIG_SND_SOC_SOF_HDA_PROBES=y + - Enable the Probe module in the SOF firmware kconfig using this command: .. code-block:: bash @@ -39,6 +46,20 @@ of extraction. - Start the crecord tool to prepare the extraction stream (read the crecord readme file) + + .. code-block:: bash + + crecord -c0 -d23 -b8192 -f4 -FS32_LE -R48000 -C4 /tmp/extract.dat + + Usage::: + + -d : device ID, equals 23 in above example. + -b : buffer size. For probes, this size will be part of probe initialization IPC + and denote extraction stream buffer size on host side. + -f : fragments is basically number of periods for compress stream. + + The rest of the parameters are don't-cares for driver. + - Use ``aplay`` to start the playback stream - (optionally) Pause the playback stream - Add probe points via the ``debugfs`` "probe_points" entry in ``/sys/kernel/debug/sof`` @@ -49,8 +70,54 @@ of extraction. echo 7,1,0 > probe_points + Please refer to host side struct sof_probe_point_desc defined in ``sound/soc/sof/probe.h`` + or struct probe_point in ``/src/include/ipc/probe.h`` from sof for the meaning of the triplets: + + .. code-block:: c + + /** + * Description of probe point + */ + struct probe_point { + uint32_t buffer_id; /**< ID of buffer to which probe is attached */ + uint32_t purpose; /**< PROBE_PURPOSE_EXTRACTION or PROBE_PURPOSE_INJECTION */ + uint32_t stream_tag; /**< Stream tag of DMA via which data will be provided for injection. + * For extraction purposes, stream tag is ignored when received, + * but returned actual extraction stream tag via INFO function. + */ + } __attribute__((packed)); + + In the above example, 7 stands for the ``buffer_id`` which is a monolithic counter + value follows component instantiation order. + + One way to find out the right instance of ``buffer_id`` is to enable dev_dbg in ``sound/sound/soc/sof/topology.c`` + and search for widget id from the following messages: + + .. code-block:: c + + dev_dbg(scomp->dev, "tplg: ready widget id %d pipe %d type %d name : %s stream %s\n", + swidget->comp_id, index, swidget->id, tw->name, + strnlen(tw->sname, SNDRV_CTL_ELEM_ID_NAME_MAXLEN) > 0 + ? tw->sname : "none"); + - (optionally) Unpause the playback stream - Close the playback stream when done - Close the crecord tool -- (optionally) Parse data using the probes app from sof tools; check the - probes app help (-h) for usage info. As a result, you will receive PCM wave files for each probe point. + +Data parsing +************ + +To construct actual waves from dumped binary, please follow the instructions at +`Build SOF from scratch: Step 4: Build Topology and Tools `__ to build sof-probes, use ``-p`` for parse. + +Example of usage and ouput: + + .. code-block:: bash + + $ ./sof-probes -p /tmp/extract.dat + sof-probes: Parsing file: /tmp/extract.dat + sof-probes: Creating wave file for buffer id: 7 + sof-probes: done + +As a result, file buffer_7.wav is generated under the *tools/build_tools/probes* folder, +the wave file can then be examined with your tool of choice like ``Audacity``. From 7738260ecfb1c91deee4c1456e6cdc9e56deec3f Mon Sep 17 00:00:00 2001 From: Marcin Maka Date: Thu, 16 Jul 2020 21:22:40 +0200 Subject: [PATCH 012/290] debugability: sof-ri-info: update examples Update example output with content produced by the latest version of sof-ri-info. Format of module info was changed significantly and outdated examples may confuse a reader. Signed-off-by: Marcin Maka --- .../ri-info/output_full_bytes.txt | 94 +++++++--------- .../debugability/ri-info/output_headers.txt | 32 ++++-- .../debugability/ri-info/output_verbose.txt | 104 +++++++++--------- 3 files changed, 109 insertions(+), 121 deletions(-) diff --git a/developer_guides/debugability/ri-info/output_full_bytes.txt b/developer_guides/debugability/ri-info/output_full_bytes.txt index a6c418e0..66880cfe 100644 --- a/developer_guides/debugability/ri-info/output_full_bytes.txt +++ b/developer_guides/debugability/ri-info/output_full_bytes.txt @@ -1,73 +1,53 @@ -$ python ./sof_ri_info.py --no_colors --full_bytes sof-cnl-v1.4.2.ri -SOF Binary sof-cnl-v1.4.2.ri size 0x46000 +$ python ./sof_ri_info.py --no_colors --full_bytes sof-cnl.ri +SOF Binary sof-cnl.ri size 0x5b000 - CSE Manifest ver 0x101 checksum 0x42 partition name ADSP + CSE Manifest ver 0x101 checksum 0xf1 partition name ADSP - ADSP.man (CSS Manifest) type 0x4 ver 0x10000 date 2020/01/22 + ADSP.man (CSS Manifest) type 0x4 ver 0x10000 date 2020/07/16 Rsvd0 0x0 Modulus size (dwords) 64 - 85 00 e1 68 aa eb d2 07 1b 7c 5e ed d6 e7 e5 f9 c1 0e 47 d4 4c ab 8c f0 e8 ee 8b 40 36 35 58 8f f4 6f fc fd 0f dd 55 8b 45 8c f0 47 dc b4 ac 21 3b 4b 20 e6 81 b3 cc 90 d4 5e f1 a4 9b 68 52 c8 f1 2d f9 c4 77 c6 4d a9 90 c7 10 fd 43 c8 4b 6b 23 5e 92 f5 8f ac d5 7d 60 27 36 7c 21 4e 21 99 de cb c0 45 f3 04 22 b8 7d 16 68 40 f9 5c f0 b9 7e 8c 05 b6 fc 28 bb 3d d8 ff b6 a4 d4 54 27 3b 1a 42 4e f5 a6 a8 -5e 44 e2 9e ed 68 6a 27 60 13 8d 2f 27 70 cd 57 c9 18 a3 b0 30 a1 f4 e6 32 12 89 2a af 40 a5 fd 52 f1 aa 8a a4 ef 20 3d 10 a3 70 f2 39 c5 05 99 22 10 81 83 6e 45 a4 f3 5a 9d 6a b8 88 fe 69 40 d1 b1 cb 2a db 28 05 de 54 bf 3d 86 5f 39 8b c1 f4 af 00 61 86 01 fa 22 ac f6 2c a4 17 6a a7 d8 0a 8c 9f bf 1f 62 b2 2e 68 52 3f 82 8f e5 28 4d db b5 5a 96 28 27 19 af 43 b9 + 85 00 e1 68 aa eb d2 07 1b 7c 5e ed d6 e7 e5 f9 c1 0e 47 d4 4c ab 8c f0 e8 ee 8b 40 36 35 58 8f f4 6f fc fd 0f dd 55 8b 45 8c f0 47 dc b4 ac 21 3b 4b 20 e6 81 b3 cc 90 d4 5e f1 a4 9b 68 52 c8 f1 2d f9 c4 77 c6 4d a9 90 c7 10 fd 43 c8 4b 6b 23 5e 92 f5 8f ac d5 7d 60 27 36 7c 21 4e 21 99 de cb c0 45 f3 04 22 b8 7d 16 68 40 f9 5c f0 b9 7e 8c 05 b6 fc 28 bb 3d d8 ff b6 a4 d4 54 27 3b 1a 42 4e f5 a6 a8 5e 44 e2 9e ed 68 6a 27 60 13 8d 2f 27 70 cd 57 c9 18 a3 b0 30 a1 f4 e6 32 12 89 2a af 40 a5 fd 52 f1 aa 8a a4 ef 20 3d 10 a3 70 f2 39 c5 05 99 22 10 81 83 6e 45 a4 f3 5a 9d 6a b8 88 fe 69 40 d1 b1 cb 2a db 28 05 de 54 bf 3d 86 5f 39 8b c1 f4 af 00 61 86 01 fa 22 ac f6 2c a4 17 6a a7 d8 0a 8c 9f bf 1f 62 b2 2e 68 52 3f 82 8f e5 28 4d db b5 5a 96 28 27 19 af 43 b9 Exponent size (dwords) 1 01 00 01 00 Signature - 4a d3 c8 3e a1 e2 19 63 a2 ea 51 aa 60 42 98 f6 1b bf 41 a9 df de d7 4f 56 b7 90 d3 4f 70 db a9 3a 3d 30 71 27 e9 72 0b 6d 50 a4 76 6b 0b dc 07 7b ac 91 d3 d4 d0 9e da ee a0 9b c2 5b 01 e0 bc 3f 5c 36 33 f5 d2 a1 9d b1 03 44 fb 5d 5d ae 82 63 51 80 31 15 52 36 85 fd e4 40 d2 0a b1 47 c1 d9 fa 33 f2 97 76 4a 1e 64 19 78 bf b2 df be 9b 61 14 f1 64 c9 53 e4 40 a1 77 2b 59 7b bb 00 80 42 aa 87 d9 17 a9 -d2 06 d5 27 52 8a 6d 52 f3 59 2b d6 bc 60 c9 98 85 73 fe d3 28 00 5b 91 26 3a de 2f e6 a4 d3 6f 14 34 14 d8 b2 8d 06 cb 26 df 97 d7 6d f0 e1 83 bf 66 6d 98 37 fb 50 fa b4 1d b5 d6 62 bc 81 f4 09 53 31 c6 1b 7e 47 9f 4a fd d8 0b e8 9e a2 fa 57 ee 6b a9 c5 b1 d0 03 c7 3c 6a 9a 71 31 2b be 44 4c 60 28 e4 d9 79 71 ef 66 85 ec 0a 30 29 10 7d 33 78 2b 91 5c 0d 7f f5 91 + 86 67 47 b1 d5 00 7a e9 11 61 47 3a aa fe d1 df a2 9a 52 56 d6 fc 1a 4c 01 2d a0 cf 92 2e 14 3e 0b 60 29 4e 1e 42 f5 29 ba a2 57 da 73 54 f1 be 75 63 cb 41 c5 8f 8a ec 98 5b 49 61 19 c3 a9 5b e6 d6 6b 72 2e 8c 5c 30 af f6 9b 33 50 6f 3b 44 cc 82 90 a6 bc 09 38 75 99 d8 81 e0 42 e2 9d bb ad 6c 8a 0c e9 bb 06 d3 c7 d1 25 82 24 07 b8 10 3d 53 ca 3b 1d 82 f3 55 97 39 1f ad 25 7a dc 1b 8d 85 bb 54 6f 15 3f ed e0 a6 3e 18 20 d9 15 69 0e da b7 b5 f3 d7 8c 56 ad 8b be 7a dc 2f ba 33 59 a0 95 f4 b3 42 db c5 77 4a d0 f3 3c d0 39 47 54 0e 58 87 6b 50 b0 22 6d 78 bd d8 62 7b 04 24 95 e6 00 49 72 c6 bc fb 13 03 1c 3e 95 e2 51 da 83 30 6d 49 19 76 a2 7b 28 68 d9 97 32 85 c3 e7 f6 b4 f1 13 a6 c2 27 a1 a2 fc c0 9b a9 1a 62 9b dd 3f c5 81 6a 70 a5 3f f5 30 10 9c 56 16 f1 90 Plat Fw Auth Extension name ADSP vcn 0x0 bitmap 00 00 00 00 08 00 00 00 00 00 00 00 00 00 00 00 svn 0x0 - Other Extension type 0x50534441 length 0x46000 + Other Extension type 0x50534441 length 0x5b000 - cavs0015.met (ADSP Metadata File Extension) ver 0x0 base offset 0x2000 limit offset 0x47b80 + cavs0015.met (ADSP Metadata File Extension) ver 0x0 base offset 0x2000 limit offset 0x5cb80 IMR type 0x3 Attributes 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 - cavs0015 (ADSP Manifest) name ADSPFW build ver 1.4.0.1 feature mask 0x1ff image flags 0x0 - HW buffers base address 0x0 length 0x0 - Load offset 0x30000 - - Module Entry - sig $AME - mod_name BRNGUP - uuid 2b79e4f3-4675-f649-89df-3bc194a91aeb - type 0x21 ( loadable LL ) - hash 9d e2 3d c4 53 36 b9 26 8c 33 6b 32 92 36 9a 14 6f f1 74 9a 9c 8a 09 70 f5 0b 4a 5c 04 a0 96 b1 - entry_point 0xb0038000 - cfg_offset 0 - cfg_count 0 - affinity_mask 0x3 - instance_max_count 1 - instance_stack_size 0x1 - seg_0 flags 0x1001f ( contents alloc load readonly code type=0 pages=1 ) - seg_0 v_base_addr 0xb0038000 - seg_0 file_offset 0x8000 - seg_1 flags 0x1012f ( contents alloc load readonly data type=1 pages=1 ) - seg_1 v_base_addr 0xb0039000 - seg_1 file_offset 0x9000 - seg_2 flags 0xf00 ( type=15 pages=0 ) - seg_2 v_base_addr 0x0 - seg_2 file_offset 0x0 - - Module Entry - sig $AME - mod_name BASEFW - uuid 0e398c32-5ade-ba4b-93b1-c50432280ee4 - type 0x21 ( loadable LL ) - hash 61 73 4b 78 b1 1e 49 5a ea e6 14 e8 05 e9 80 4d a9 df 8c 69 ad a5 a4 42 11 bb fb ae af ba 31 f8 - entry_point 0xbe00c400 - cfg_offset 0 - cfg_count 0 - affinity_mask 0x3 - instance_max_count 1 - instance_stack_size 0x1 - seg_0 flags 0x23001f ( contents alloc load readonly code type=0 pages=35 ) - seg_0 v_base_addr 0xbe00c000 - seg_0 file_offset 0xa000 - seg_1 flags 0x19012f ( contents alloc load readonly data type=1 pages=25 ) - seg_1 v_base_addr 0xbe02f000 - seg_1 file_offset 0x2d000 - seg_2 flags 0xb80202 ( alloc type=2 pages=184 ) - seg_2 v_base_addr 0xbe048000 - seg_2 file_offset 0x0 \ No newline at end of file + cavs0015 + + cavs0015 (ADSP Manifest) name ADSPFW build ver 1.5.0.1 feature mask 0x1ff image flags 0x0 + HW buffers base address 0x0 length 0x0 + Load offset 0x30000 + + BRNGUP 2b79e4f3-4675-f649-89df-3bc194a91aeb + entry point 0xb0038000 type 0x21 ( loadable LL ) + cfg offset 0 count 0 affinity 0x3 instance max count 1 stack size 0x1 + .text 0xb0038000 file offset 0x8000 flags 0x1001f ( contents alloc load readonly code type=0 pages=1 ) + .rodata 0xb0039000 file offset 0x9000 flags 0x1012f ( contents alloc load readonly data type=1 pages=1 ) + .bss 0x0 file offset 0x0 flags 0xf00 ( type=15 pages=0 ) + + BASEFW 0e398c32-5ade-ba4b-93b1-c50432280ee4 + entry point 0xbe00c400 type 0x21 ( loadable LL ) + cfg offset 0 count 0 affinity 0x3 instance max count 1 stack size 0x1 + .text 0xbe00c000 file offset 0xa000 flags 0x2d001f ( contents alloc load readonly code type=0 pages=45 ) + .rodata 0xbe039000 file offset 0x37000 flags 0x24012f ( contents alloc load readonly data type=1 pages=36 ) + .bss 0xbe05d000 file offset 0x0 flags 0xa30202 ( alloc type=2 pages=163 ) + +Intel Cannonlake + imr 0xb0000000 (8192 + 136579200 0.01% used) + BRNGUP.text 0xb0038000 (4096) + BRNGUP.rodata 0xb0039000 (4096) + l2 hpsram 0xbe000000 (999424 + 2146304 31.77% used) + BASEFW.text 0xbe00c000 (184320) + BASEFW.rodata 0xbe039000 (147456) + BASEFW.bss 0xbe05d000 (667648) + l2 lpsram 0xbe800000 (65536) diff --git a/developer_guides/debugability/ri-info/output_headers.txt b/developer_guides/debugability/ri-info/output_headers.txt index 0701cdac..8f99f6cb 100644 --- a/developer_guides/debugability/ri-info/output_headers.txt +++ b/developer_guides/debugability/ri-info/output_headers.txt @@ -1,27 +1,39 @@ -$ python ./sof_ri_info.py --no_colors --headers sof-cnl-v1.4.2.ri -SOF Binary sof-cnl-v1.4.2.ri size 0x46000 +$ python ./sof_ri_info.py --no_colors --headers sof-cnl.ri +SOF Binary sof-cnl.ri size 0x5b000 - CSE Manifest ver 0x101 checksum 0x42 partition name ADSP + CSE Manifest ver 0x101 checksum 0xf1 partition name ADSP - ADSP.man (CSS Manifest) type 0x4 ver 0x10000 date 2020/01/22 + ADSP.man (CSS Manifest) type 0x4 ver 0x10000 date 2020/07/16 Rsvd0 0x0 Modulus size (dwords) 64 85 00 e1 68 aa eb d2 07 ... 5a 96 28 27 19 af 43 b9 (Community key) Exponent size (dwords) 1 01 00 01 00 Signature - 4a d3 c8 3e a1 e2 19 63 ... 78 2b 91 5c 0d 7f f5 91 + 86 67 47 b1 d5 00 7a e9 ... f5 30 10 9c 56 16 f1 90 Plat Fw Auth Extension name ADSP vcn 0x0 bitmap 00 00 00 00 08 00 00 00 00 00 00 00 00 00 00 00 svn 0x0 - Other Extension type 0x50534441 length 0x46000 + Other Extension type 0x50534441 length 0x5b000 - cavs0015.met (ADSP Metadata File Extension) ver 0x0 base offset 0x2000 limit offset 0x47b80 + cavs0015.met (ADSP Metadata File Extension) ver 0x0 base offset 0x2000 limit offset 0x5cb80 IMR type 0x3 Attributes 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 - cavs0015 (ADSP Manifest) name ADSPFW build ver 1.4.0.1 feature mask 0x1ff image flags 0x0 - HW buffers base address 0x0 length 0x0 - Load offset 0x30000 \ No newline at end of file + cavs0015 + + cavs0015 (ADSP Manifest) name ADSPFW build ver 1.5.0.1 feature mask 0x1ff image flags 0x0 + HW buffers base address 0x0 length 0x0 + Load offset 0x30000 + +Intel Cannonlake + imr 0xb0000000 (8192 + 136579200 0.01% used) + BRNGUP.text 0xb0038000 (4096) + BRNGUP.rodata 0xb0039000 (4096) + l2 hpsram 0xbe000000 (999424 + 2146304 31.77% used) + BASEFW.text 0xbe00c000 (184320) + BASEFW.rodata 0xbe039000 (147456) + BASEFW.bss 0xbe05d000 (667648) + l2 lpsram 0xbe800000 (65536) diff --git a/developer_guides/debugability/ri-info/output_verbose.txt b/developer_guides/debugability/ri-info/output_verbose.txt index 5ed20e59..5b7315c7 100644 --- a/developer_guides/debugability/ri-info/output_verbose.txt +++ b/developer_guides/debugability/ri-info/output_verbose.txt @@ -1,80 +1,76 @@ -$ python ./sof_ri_info.py --no_colors -v sof-cnl-v1.4.2.ri -Reading SOF ri image sof-cnl-v1.4.2.ri -File size 0x46000 (286720) +$ python ./sof_ri_info.py --no_colors -v sof-cnl.ri +Reading SOF ri image sof-cnl.ri +File size 0x5b000 (372736) +0x0 Looking for Extended Manifest 0x0 info: Extended Manifest not found (sig = $CPD) +0x0 Looking for CSE Manifest 0x0 CSE Manifest ($CPD) +0x8 # of entries 3 +0x10 Looking for CSE Manifest entry +0x28 CSE Entry name ADSP.man length 888 +0x58 Parsing CSS Manifest 0x58 CSS Manifest type 4 +0x58 Parsing CSS Manifest type 4 +0x2dc Parsing CSS Manifest extensions end 0x3d0 +0x2e0 Reading extension type 0xf +0x350 Reading extension type 0x50534441 +0x28 Looking for CSE Manifest entry +0x40 CSE Entry name cavs0015.met length 96 +0x40 Looking for CSE Manifest entry +0x58 CSE Entry name cavs0015 length 371584 0x2000 ADSP Manifest ($AM1) 0x2034 Module Entry signature found ($AME) 0x20a8 Module Entry signature found ($AME) Parsing finished -SOF Binary sof-cnl-v1.4.2.ri size 0x46000 +SOF Binary sof-cnl.ri size 0x5b000 - CSE Manifest ver 0x101 checksum 0x42 partition name ADSP + CSE Manifest ver 0x101 checksum 0xf1 partition name ADSP - ADSP.man (CSS Manifest) type 0x4 ver 0x10000 date 2020/01/22 + ADSP.man (CSS Manifest) type 0x4 ver 0x10000 date 2020/07/16 Rsvd0 0x0 Modulus size (dwords) 64 85 00 e1 68 aa eb d2 07 ... 5a 96 28 27 19 af 43 b9 (Community key) Exponent size (dwords) 1 01 00 01 00 Signature - 4a d3 c8 3e a1 e2 19 63 ... 78 2b 91 5c 0d 7f f5 91 + 86 67 47 b1 d5 00 7a e9 ... f5 30 10 9c 56 16 f1 90 Plat Fw Auth Extension name ADSP vcn 0x0 bitmap 00 00 00 00 08 00 00 00 00 00 00 00 00 00 00 00 svn 0x0 - Other Extension type 0x50534441 length 0x46000 + Other Extension type 0x50534441 length 0x5b000 - cavs0015.met (ADSP Metadata File Extension) ver 0x0 base offset 0x2000 limit offset 0x47b80 + cavs0015.met (ADSP Metadata File Extension) ver 0x0 base offset 0x2000 limit offset 0x5cb80 IMR type 0x3 Attributes 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 - cavs0015 (ADSP Manifest) name ADSPFW build ver 1.4.0.1 feature mask 0x1ff image flags 0x0 - HW buffers base address 0x0 length 0x0 - Load offset 0x30000 + cavs0015 - Module Entry - sig $AME - mod_name BRNGUP - uuid 2b79e4f3-4675-f649-89df-3bc194a91aeb - type 0x21 ( loadable LL ) - hash 9d e2 3d c4 53 36 b9 26 ... f5 0b 4a 5c 04 a0 96 b1 - entry_point 0xb0038000 - cfg_offset 0 - cfg_count 0 - affinity_mask 0x3 - instance_max_count 1 - instance_stack_size 0x1 - seg_0 flags 0x1001f ( contents alloc load readonly code type=0 pages=1 ) - seg_0 v_base_addr 0xb0038000 - seg_0 file_offset 0x8000 - seg_1 flags 0x1012f ( contents alloc load readonly data type=1 pages=1 ) - seg_1 v_base_addr 0xb0039000 - seg_1 file_offset 0x9000 - seg_2 flags 0xf00 ( type=15 pages=0 ) - seg_2 v_base_addr 0x0 - seg_2 file_offset 0x0 + cavs0015 (ADSP Manifest) name ADSPFW build ver 1.5.0.1 feature mask 0x1ff image flags 0x0 + HW buffers base address 0x0 length 0x0 + Load offset 0x30000 - Module Entry - sig $AME - mod_name BASEFW - uuid 0e398c32-5ade-ba4b-93b1-c50432280ee4 - type 0x21 ( loadable LL ) - hash 61 73 4b 78 b1 1e 49 5a ... 11 bb fb ae af ba 31 f8 - entry_point 0xbe00c400 - cfg_offset 0 - cfg_count 0 - affinity_mask 0x3 - instance_max_count 1 - instance_stack_size 0x1 - seg_0 flags 0x23001f ( contents alloc load readonly code type=0 pages=35 ) - seg_0 v_base_addr 0xbe00c000 - seg_0 file_offset 0xa000 - seg_1 flags 0x19012f ( contents alloc load readonly data type=1 pages=25 ) - seg_1 v_base_addr 0xbe02f000 - seg_1 file_offset 0x2d000 - seg_2 flags 0xb80202 ( alloc type=2 pages=184 ) - seg_2 v_base_addr 0xbe048000 - seg_2 file_offset 0x0 + BRNGUP 2b79e4f3-4675-f649-89df-3bc194a91aeb + entry point 0xb0038000 type 0x21 ( loadable LL ) + cfg offset 0 count 0 affinity 0x3 instance max count 1 stack size 0x1 + .text 0xb0038000 file offset 0x8000 flags 0x1001f ( contents alloc load readonly code type=0 pages=1 ) + .rodata 0xb0039000 file offset 0x9000 flags 0x1012f ( contents alloc load readonly data type=1 pages=1 ) + .bss 0x0 file offset 0x0 flags 0xf00 ( type=15 pages=0 ) + + BASEFW 0e398c32-5ade-ba4b-93b1-c50432280ee4 + entry point 0xbe00c400 type 0x21 ( loadable LL ) + cfg offset 0 count 0 affinity 0x3 instance max count 1 stack size 0x1 + .text 0xbe00c000 file offset 0xa000 flags 0x2d001f ( contents alloc load readonly code type=0 pages=45 ) + .rodata 0xbe039000 file offset 0x37000 flags 0x24012f ( contents alloc load readonly data type=1 pages=36 ) + .bss 0xbe05d000 file offset 0x0 flags 0xa30202 ( alloc type=2 pages=163 ) + +Intel Cannonlake + imr 0xb0000000 (8192 + 136579200 0.01% used) + BRNGUP.text 0xb0038000 (4096) + BRNGUP.rodata 0xb0039000 (4096) + l2 hpsram 0xbe000000 (999424 + 2146304 31.77% used) + BASEFW.text 0xbe00c000 (184320) + BASEFW.rodata 0xbe039000 (147456) + BASEFW.bss 0xbe05d000 (667648) + l2 lpsram 0xbe800000 (65536) From 03bb09ad6c264edf4abb9dc884191abde29582be Mon Sep 17 00:00:00 2001 From: Deb Taylor Date: Mon, 20 Jul 2020 15:44:05 -0400 Subject: [PATCH 013/290] Grammatical edits to Probes doc Signed-off-by: Deb Taylor --- .../debugability/probes/index.rst | 96 ++++++++++--------- 1 file changed, 50 insertions(+), 46 deletions(-) diff --git a/developer_guides/debugability/probes/index.rst b/developer_guides/debugability/probes/index.rst index 47a80639..c05bd91a 100644 --- a/developer_guides/debugability/probes/index.rst +++ b/developer_guides/debugability/probes/index.rst @@ -19,19 +19,19 @@ Enabling Probes - Enable the following Linux kernel configuration options: - .. code-block:: bash + .. code-block:: bash - CONFIG_DEBUG_FS=y - CONFIG_SND_SOC_SOF_DEBUG_PROBES=y - CONFIG_SND_SOC_SOF_HDA_PROBES=y + CONFIG_DEBUG_FS=y + CONFIG_SND_SOC_SOF_DEBUG_PROBES=y + CONFIG_SND_SOC_SOF_HDA_PROBES=y -- Enable the Probe module in the SOF firmware kconfig using this command: +- Enable the Probe module in the SOF firmware ``kconfig`` using this command: - .. code-block:: bash + .. code-block:: bash - make menuconfig + make menuconfig -- :ref:`Build the firmware ` +- Refer to **Step 3 Build firmware binaries** in :ref:`Build SOF from Scratch ` for reference. Note that you do not need to modify the audio topology file. @@ -40,38 +40,40 @@ Data extraction Extraction is the most common use case. It allows for data extraction from the audio component data buffer. It requires starting the compress stream by -starting the crecord tool. One compress stream may contain data from several -extraction probe points which means data parsing is needed at the last stage -of extraction. +starting the crecord tool. Note that one compress stream may contain data +from several extraction probe points which means data parsing is needed at +the last stage of extraction. -- Start the crecord tool to prepare the extraction stream (read the crecord - readme file) +#. Start the crecord tool to prepare the extraction stream (read the crecord + readme file): - .. code-block:: bash + .. code-block:: bash - crecord -c0 -d23 -b8192 -f4 -FS32_LE -R48000 -C4 /tmp/extract.dat + crecord -c0 -d23 -b8192 -f4 -FS32_LE -R48000 -C4 /tmp/extract.dat - Usage::: + Usage: - -d : device ID, equals 23 in above example. - -b : buffer size. For probes, this size will be part of probe initialization IPC - and denote extraction stream buffer size on host side. - -f : fragments is basically number of periods for compress stream. + .. code-block:: none - The rest of the parameters are don't-cares for driver. + -d : device ID; equals 23 in the above example. + -b : buffer size. For probes, this is part of the probe + initialization IPC and denotes the extraction stream buffer size on the host side. + -f : fragments is basically number of periods for compress stream. -- Use ``aplay`` to start the playback stream -- (optionally) Pause the playback stream -- Add probe points via the ``debugfs`` "probe_points" entry in ``/sys/kernel/debug/sof`` + The other parameters are "don't-cares" for the driver. - For example, to add a buffer with 7 probe points: + - Use ``aplay`` to start the playback stream. + - Pause the playback stream. (optional) + - Add probe points via the ``debugfs`` "probe_points" entry in ``/sys/kernel/debug/sof`` - .. code-block:: bash + For example, to add a buffer with 7 probe points: - echo 7,1,0 > probe_points + .. code-block:: bash - Please refer to host side struct sof_probe_point_desc defined in ``sound/soc/sof/probe.h`` - or struct probe_point in ``/src/include/ipc/probe.h`` from sof for the meaning of the triplets: + echo 7,1,0 > probe_points + + Refer to the host side struct sof_probe_point_desc defined in ``sound/soc/sof/probe.h`` + or struct probe_point in ``/src/include/ipc/probe.h`` from sof for the meaning of the triplets: .. code-block:: c @@ -87,11 +89,12 @@ of extraction. */ } __attribute__((packed)); - In the above example, 7 stands for the ``buffer_id`` which is a monolithic counter - value follows component instantiation order. + In the above example, 7 stands for the ``buffer_id`` which is a monolithic + counter value that follows a component instantiation order. - One way to find out the right instance of ``buffer_id`` is to enable dev_dbg in ``sound/sound/soc/sof/topology.c`` - and search for widget id from the following messages: + One way to find out the right instance of ``buffer_id`` is to enable + dev_dbg in ``sound/sound/soc/sof/topology.c`` and search for the widget id + from the following messages: .. code-block:: c @@ -100,24 +103,25 @@ of extraction. strnlen(tw->sname, SNDRV_CTL_ELEM_ID_NAME_MAXLEN) > 0 ? tw->sname : "none"); -- (optionally) Unpause the playback stream -- Close the playback stream when done -- Close the crecord tool +2. Unpause the playback stream. (optional) +#. Close the playback stream when done. +#. Close the crecord tool. Data parsing ************ -To construct actual waves from dumped binary, please follow the instructions at -`Build SOF from scratch: Step 4: Build Topology and Tools `__ to build sof-probes, use ``-p`` for parse. +As previously mentioned, one compress stream can contain data from several +extraction probe points which means data parsing is needed at the final +stage of extraction. The following example demonstrates how to extract data. Use ``-p`` for parse. -Example of usage and ouput: +Usage and ouput: - .. code-block:: bash +.. code-block:: bash - $ ./sof-probes -p /tmp/extract.dat - sof-probes: Parsing file: /tmp/extract.dat - sof-probes: Creating wave file for buffer id: 7 - sof-probes: done + $ ./sof-probes -p /tmp/extract.dat + sof-probes: Parsing file: /tmp/extract.dat + sof-probes: Creating wave file for buffer id: 7 + sof-probes: done -As a result, file buffer_7.wav is generated under the *tools/build_tools/probes* folder, -the wave file can then be examined with your tool of choice like ``Audacity``. +As a result, ``buffer_7.wav`` is generated in the *tools/build_tools/probes* folder. The wave file can then be examined with your tool of choice +such as ``Audacity``. \ No newline at end of file From 6c0b52178df24e273e8a41864aac711abb69caaf Mon Sep 17 00:00:00 2001 From: Janusz Jankowski Date: Wed, 22 Jul 2020 15:36:23 +0200 Subject: [PATCH 014/290] developer guides: using xt-run Add instructions for using xt-run in standalone binaries and in unit testing framework. Signed-off-by: Janusz Jankowski --- developer_guides/index.rst | 1 + developer_guides/xtrun/index.rst | 134 +++++++++++++++++++++++++++++++ 2 files changed, 135 insertions(+) create mode 100644 developer_guides/xtrun/index.rst diff --git a/developer_guides/index.rst b/developer_guides/index.rst index f76ce642..c0903d64 100644 --- a/developer_guides/index.rst +++ b/developer_guides/index.rst @@ -12,6 +12,7 @@ terminology before reading further. introduction firmware/index unit_tests + xtrun/index topology/topology uuid/index.rst debugability/index diff --git a/developer_guides/xtrun/index.rst b/developer_guides/xtrun/index.rst new file mode 100644 index 00000000..ff8c0afb --- /dev/null +++ b/developer_guides/xtrun/index.rst @@ -0,0 +1,134 @@ +.. _xtrun: + +Using xt-run +############ + +Prerequisites +************* + +Xtensa Simulator (xt-run) is a part of proprietary Xtensa toolchain used to run Xtensa ELFs. +This guide assumes that you correctly installed proprietary Xtensa toolchain and core for your platform. + +In order to run simulation for your platform, it requires core, just as xt-xcc, that is set with **XTENSA_CORE** environment variable. +If you can build firmware with xt-xcc compiler, then you should have everything already set up. + +Standalone programs +******************* + +Development with xt-xcc and xt-run is similiar to usual development of \*nix programs. + +Let's try with *"Hello World!"* example. Save this snippet as **test.c**: + +.. code-block:: c + + #include + + int main() { + printf("Hello World!\n"); + return 0; + } + +In order to run this program, first you have to build Xtensa ELF with xt-xcc: + +.. code-block:: bash + + xt-xcc test.c -o test + +Then you can run output binary with xt-run: + +.. code-block:: bash + + xt-run test + +You can run any code independently like this, for example for testing some algorithms. + +As you can see progams that run in xt-run additionaly support stdlib (that is not available in usual FW), so you can use stdio to print your output. +All core-specific features are also supported by xt-run, so you can use intrinsics (f.e. HiFi3) in your C programs. + +Unit tests +********** + +In SOF project xt-run is used as executor for unit tests. + +Below example will show you how you can add simple unit test case for sample function - **my_add** in **math** module. + +First, let's add function that is going to be a subject of unit test: + +.. code-block:: c + :caption: src/include/sof/math/numbers.h + + int my_add(int a, int b); + +.. code-block:: c + :caption: src/math/numbers.c + + int my_add(int a, int b) + { + return a + b; + } + +Now, add implementation of unit test: + +.. code-block:: c + :caption: test/cmocka/src/math/numbers/my_add.c + + // header with function that we test + #include + + // standard headers that have to be included in every cmocka's unit test + #include + #include + #include + #include + #include + + // one of test cases + static void my_add_2_plus_3_equals_5(void **state) + { + int result; + + (void)state; + + result = my_add(2, 3); + assert_int_equal(result, 5); + } + + int main(void) + { + // list of all test cases, here we have just 1 + const struct CMUnitTest tests[] = { + cmocka_unit_test(my_add_2_plus_3_equals_5), + }; + + cmocka_set_message_output(CM_OUTPUT_TAP); + + return cmocka_run_group_tests(tests, NULL, NULL); + } + +You should have single file for every function that is being unit-tested, that's why we put code in **my_add.c** file in **test/cmocka/src/math/numbers** directory. + +Last step of adding unit test is letting CMake know that it exists: + +.. code-block:: cmake + :caption: test/cmocka/src/math/numbers/CMakeLists.txt + + cmocka_test(my_add + my_add.c + ${PROJECT_SOURCE_DIR}/src/math/numbers.c + ) + +In order to run unit tests follow the instructions at :doc:`../unit_tests`. + +If you want to run just your test case (instead of all tests), you can replace: + +.. code-block:: bash + + make -j4 && ctest -j8 + +With: + +.. code-block:: bash + + make my_add && ctest -R my_add + +Logs from running ctest can be found in **Testing/Temporary/LastTest.log**. From 0969fe2390c08599f52a38db4098d9b9b4e11d00 Mon Sep 17 00:00:00 2001 From: Deb Taylor Date: Fri, 24 Jul 2020 09:54:35 -0400 Subject: [PATCH 015/290] Edits to xt-run doc Signed-off-by: Deb Taylor --- developer_guides/xtrun/index.rst | 59 +++++++++++++++++++------------- 1 file changed, 35 insertions(+), 24 deletions(-) diff --git a/developer_guides/xtrun/index.rst b/developer_guides/xtrun/index.rst index ff8c0afb..f48930ff 100644 --- a/developer_guides/xtrun/index.rst +++ b/developer_guides/xtrun/index.rst @@ -1,58 +1,66 @@ .. _xtrun: -Using xt-run -############ +Xtensa Simulator (xt-run) +######################### Prerequisites ************* -Xtensa Simulator (xt-run) is a part of proprietary Xtensa toolchain used to run Xtensa ELFs. -This guide assumes that you correctly installed proprietary Xtensa toolchain and core for your platform. +The Xtensa Simulator (``xt-run``) is a proprietary Xtensa toolchain used to +run Xtensa ELFs. This guide assumes that you have correctly installed it and +the core for your platform. It describes how to use xt-run. -In order to run simulation for your platform, it requires core, just as xt-xcc, that is set with **XTENSA_CORE** environment variable. -If you can build firmware with xt-xcc compiler, then you should have everything already set up. +Running the simulation for your platform requires that the core is set with +the **XTENSA_CORE** environment variable (just like ``xt-xcc``). If you can +successfully build the firmware with the ``xt-xcc`` compiler, then +everything is set up. Standalone programs ******************* -Development with xt-xcc and xt-run is similiar to usual development of \*nix programs. +Development with ``xt-xcc`` and ``xt-run`` is similiar to the usual +development of \*nix programs. -Let's try with *"Hello World!"* example. Save this snippet as **test.c**: +Begin with a *"Hello World!"* example. Save this snippet as **test.c**: .. code-block:: c #include - + int main() { printf("Hello World!\n"); return 0; } -In order to run this program, first you have to build Xtensa ELF with xt-xcc: +In order to run this program, first build Xtensa ELF with ``xt-xcc``: .. code-block:: bash xt-xcc test.c -o test -Then you can run output binary with xt-run: +Next, run the output binary with ``xt-run``: .. code-block:: bash xt-run test -You can run any code independently like this, for example for testing some algorithms. +You can run any code independently like this, such as for testing some +algorithms. -As you can see progams that run in xt-run additionaly support stdlib (that is not available in usual FW), so you can use stdio to print your output. -All core-specific features are also supported by xt-run, so you can use intrinsics (f.e. HiFi3) in your C programs. +Progams that run in ``xt-run`` additionally support ``stdlib`` (not +available in the usual FW) so you can use ``stdio`` to print your output. All +core-specific features are also supported by ``xt-run`` so you can use +intrinsics (such as HiFi3) in your C programs. Unit tests ********** -In SOF project xt-run is used as executor for unit tests. +In the SOF project, ``xt-run`` is used as the executor for unit tests. -Below example will show you how you can add simple unit test case for sample function - **my_add** in **math** module. +The below example shows how you can add a simple unit test case for a sample +function: ``my_add`` in the ``math`` module. -First, let's add function that is going to be a subject of unit test: +First, add a function that is going to be the subject of the unit test: .. code-block:: c :caption: src/include/sof/math/numbers.h @@ -67,7 +75,7 @@ First, let's add function that is going to be a subject of unit test: return a + b; } -Now, add implementation of unit test: +Next, add the unit test implementation: .. code-block:: c :caption: test/cmocka/src/math/numbers/my_add.c @@ -105,9 +113,11 @@ Now, add implementation of unit test: return cmocka_run_group_tests(tests, NULL, NULL); } -You should have single file for every function that is being unit-tested, that's why we put code in **my_add.c** file in **test/cmocka/src/math/numbers** directory. +Use a single file for every function that is unit-tested; this is why we put +code in the ``my_add.c`` file in the ``test/cmocka/src/math/numbers`` +directory. -Last step of adding unit test is letting CMake know that it exists: +Lastly, let CMake know that the unit test exists: .. code-block:: cmake :caption: test/cmocka/src/math/numbers/CMakeLists.txt @@ -117,18 +127,19 @@ Last step of adding unit test is letting CMake know that it exists: ${PROJECT_SOURCE_DIR}/src/math/numbers.c ) -In order to run unit tests follow the instructions at :doc:`../unit_tests`. +To run unit tests, follow the instructions at :doc:`../unit_tests`. -If you want to run just your test case (instead of all tests), you can replace: +If you want to run just your test case (instead of all tests), you can +replace: .. code-block:: bash make -j4 && ctest -j8 -With: +with: .. code-block:: bash make my_add && ctest -R my_add -Logs from running ctest can be found in **Testing/Temporary/LastTest.log**. +Logs from running ctest can be found in ``Testing/Temporary/LastTest.log``. From 37a14b1e352a79e62ce67adc51858c7d3565f288 Mon Sep 17 00:00:00 2001 From: Deb Taylor Date: Fri, 24 Jul 2020 15:32:32 -0400 Subject: [PATCH 016/290] Added Xtensa FAQs to the SOF intro page. Also, edited page for clarity. Signed-off-by: Deb Taylor --- introduction/index.rst | 208 +++++++++++++++++++++++++---------------- 1 file changed, 129 insertions(+), 79 deletions(-) diff --git a/introduction/index.rst b/introduction/index.rst index 40824401..db20df9e 100644 --- a/introduction/index.rst +++ b/introduction/index.rst @@ -4,24 +4,24 @@ Introduction to the SOF Project ############################### |SOF| (SOF) is an open source audio Digital Signal Processing (DSP) firmware -infrastructure and SDK. SOF provides infrastructure, real-time control pieces, -and audio drivers as a community project. The project is governed by the |SOF| -|TSC| (TSC) who are prominent and active developers from the community. -SOF is developed in public and hosted on the github platform. +infrastructure and SDK. SOF provides infrastructure, real-time control +pieces, and audio drivers as a community project. The project is governed by +the |SOF| |TSC| (TSC) that includes prominent and active developers from the +community. SOF is developed in public and hosted on the github platform. The firmware and SDK are intended for developers who are interested in -audio or signal processing on modern DSPs. SOF provides a framework where audio -developers can create, test and tune. +audio or signal processing on modern DSPs. SOF provides a framework where +audio developers can create, test, and tune the following: -#. Audio processing pipelines and topologies. +- Audio processing pipelines and topologies. -#. Audio processing components. +- Audio processing components. -#. DSP infrastructure and drivers. +- DSP infrastructure and drivers. -#. Host OS infrastructure and drivers. +- Host OS infrastructure and drivers. -.. figure:: images/pipeline-overview.png +.. figure:: images/pipeline-overview.png :align: center :alt: SDK Overview :width: 1000px @@ -31,74 +31,73 @@ developers can create, test and tune. |SOF| has a modular and generic codebase and can be ported to different DSP -architectures or host platforms. See list of currently supported DSP +architectures or host platforms. See the list of currently supported DSP architecures and supported platforms. SDK Introduction and Overview ============================= -The |SOF| SDK is comprised of many ingredients that can be customised for use in -the firmware/software development lifecycle. Customisation allows for a -"best fit" development approach where the SDK can be optimised for a -particular process or environment. Some SDK ingredients are optional whilst -there can more than once choice for other ingredients as shown in the diagram below. +The |SOF| SDK is comprised of many ingredients that can be customized for +use in the firmware/software development lifecycle. Customization allows for +a "best fit" development approach where the SDK can be optimized for a +particular process or environment. Some SDK ingredients are optional while +there can be more than once choice for other ingredients as shown in the diagram below. .. figure:: images/sdk-overview.png :align: center :alt: SDK Overview :width: 1000px - `SDK example configuration showing development flow for SOF on the Intel Apollolake platform running Linux OS.` - `Note the choice of compiler toolchains and choice of optional DSP emulators.` + `SDK example configuration showing development flow for SOF on the Intel Apollolake platform running Linux OS. Note the choice of compiler toolchains and choice of optional DSP emulators.` -SOF source code, tools and topologies -------------------------------------- +SOF source code, tools, and topologies +-------------------------------------- -The firmware, tools and topologies all exist in the main SOF git repository -and at a high level it contains. +All firmware, tools, and topologies exists in the main SOF git repository. +On a high level, the repo contains: -#. Firmware - written in C with some architecture-specific assembler; it does not link to external dependencies. +- Firmware - written in C with some architecture-specific assembler; it does not link to external dependencies. -#. Test Bench - allows firmware components and pipelines to run on developers host PC. +- Test Bench - allows firmware components and pipelines to run on developers' host PCs. -#. Image Tools - C tools for converting ELF files to binary firmware images that can run on HW. +- Image Tools - C tools for converting ELF files to binary firmware images that can run on HW. -#. Debug Tools - Scripts and tools that can be used to debug firmware. +- Debug Tools - scripts and tools that can be used to debug firmware. -#. Trace Tools - Text based tools that can display tracing data from firmware. +- Trace Tools - text-based tools that can display tracing data from firmware. -#. Tuning Tools - Matlab/Octave scripts that can be used to create tuning coefficients for audio components. +- Tuning Tools - MATLAB/Octave scripts that can be used to create tuning coefficients for audio components. -#. Runtime Tools - Command line applications that can be used to exchange data with running firmware. +- Runtime Tools - command line applications that can be used to exchange data with running firmware. -#. Topologies - Real and example topologies showing construction of simple and complex audio processing pipelines. +- Topologies - real and example topologies that show construction of simple and complex audio processing pipelines. Host OS Drivers --------------- -SOF can be configured and controlled by a host OS driver or can optionally run -as a stand alone firmware. SOF host drivers currently support the Linux OS -today. +SOF can be configured and controlled by a host OS driver or it can +optionally run as standalone firmware. SOF host drivers currently support +Linux OS. -The SOF driver has a modular stack based architecture that is dual licensed -BSD & GPL code allowing it to be ported to other OSes and RTOSes. +The SOF driver has a modular stack-based architecture that is dual-licensed +BSD & GPL code, allowing it to be ported to other OSes and RTOSes. -The host driver is responsible for :- +The host driver is responsible for: -#. Loading firmware from host file system into DSP memories and booting. +- Loading firmware from the host file system into DSP memories and booting. -#. Loading topologies from host file system into DSP. +- Loading topologies from the host file system into DSP. -#. Exposing audio control devices to applications. +- Exposing audio control devices to applications. -#. Exposing audio data endpoints to applications. +- Exposing audio data endpoints to applications. -#. Managing IPC communication between host and DSP. +- Managing IPC communication between the host and DSP. -#. Abstraction of host side DSP hardware to common API operations. +- Abstraction of the host-side DSP hardware to common API operations. The Linux SOF ALSA/ASoC driver is upstream in Linux v5.2 onwards. @@ -107,7 +106,7 @@ Firmware Toolchain ------------------ GNU GCC can be used as a free SOF compiler alongside proprietary DSP vendor -compilers. The choice of compiler is up to the user depending on features +compilers. The choice of compiler is up to the user, depending on features and budget. GCC complier is open source. @@ -130,69 +129,120 @@ What license does the firmware use? Do I need to open source my firmware code changes? No. The firmware BSD and MIT licensed code means you can keep code - changes private. Patches are always welcomed if you do decide to open source - work. + changes private. Patches are always welcomed if you do decide to open + source work. What license does the host driver use? - Most of the host driver code is dual licensed BSD or GLPLv2 only + Most of the host driver code is dual-licensed BSD or GLPLv2 only (user's choice). The part of the driver that is GPLv2 only is the Linux - integration layer at the top of the driver stack + integration layer at the top of the driver stack. Do I need to open source my driver code changes? - No, for the bottom two layers of the driver stack. i.e. if you are porting the - driver to another OS, these changes can be kept private. Please note that the - driver GPL source files are all Linux specific and should not be ported to - another OS anyway. + No, for the bottom two layers of the driver stack. For example, if you are + porting the driver to another OS, these changes can be kept private. Note + that all driver GPL source files are Linux-specific and should not be + ported to another OS. How can I get involved? - The best way to get involved is via github, there is also a low volume - mailing list here http://alsa-project.org/mailman/listinfo/sound-open-firmware + The best way to get involved is via github. You can also join our + low-volume `mailing list `_. What is the development model? - |SOF| is entirely developed on github. Patches via a Pull Request are - reviewed, discussed and tested by CI before being merged. The intended - release cadence will likely be every 6 - 8 weeks. There will be a stable - release tagged after passing QA then development will continue for the - next release. + |SOF| is entirely developed on github. Patches via Pull Requests are + reviewed, discussed, and tested by CI before being merged. The intended + release cadence is every 6 - 8 weeks. A stable release is tagged after + passing QA; development continues for the next release. -Who is working on |SOF|? - Professional developers from a number of companies (please check the git - logs if you want to know) with some hobbyist developers too. +Who works on |SOF|? + Professional developers from a number of companies (check the git + logs if you want to know) with some hobbyist developers, too. How do I add support for host architecture X? - Please see the SOF architecture pages. + See the SOF architecture pages. How do I add support for host platform X? Adding a new host platform is a lot simpler than adding a new DSP architecture. A new host platform consists of adding a new src/platform/ - directory, together with mappings for memory, IRQs, GPIOs and peripheral + directory, together with mappings for memory, IRQs, GPIOs, and peripheral devices in the DSP memory space. New drivers may also have to be added (e.g. for DMA, I2S) to the drivers directory. How do I port to other OSes? - Please see the SOF host architecture page. + See the SOF host architecture page. What audio components are supported? - |SOF| now supports a small library of free and open source components that are - distrubuted alongside the source code. SOF can also support proprietary - audio processing components providing they are wrapped to use the SOF - component API. Please see the audio components page for a list of the open - source components and thier capablilities. + |SOF| now supports a small library of free and open source components that + are distrubuted alongside the source code. SOF can also support proprietary + audio processing components provided they are wrapped to use the SOF + component API. See the audio components page for a list of open + source components and their capabilites. How do I create my own pipelines? - Pipelines are currently defined using the M4 macro processing language. The M4 - topology is then preprocessed to the alsaconf format before being compiled - into a binary. An Eclipse based GUI for pipeline construction is currently - in development. + Pipelines are currently defined using the M4 macro processing language. + The M4 topology is then preprocessed to the alsaconf format before being + compiled into a binary. An Eclipse-based GUI for pipeline construction is + currently under development. - Today both static (built in) and dynamic (loaded at runtime) pipelines are + Today, both static (built in) and dynamic (loaded at runtime) pipelines are supported in upstream. Can I add my own media encoder/decoders? Yes. Can I add non-audio functions? - Yes, the instruction sets used by DSPs are also good at non audio - processing tasks too. e.g. low power sensor signal processing. Providing - your DSP has physical IO ports to connect other non audio devices then - it's possible to process data from these devices too. + Yes. The instruction sets used by DSPs are also good at non-audio + processing tasks such as low-power sensor signal processing. If + your DSP has physical IO ports to which other non-audio devices can be connected, then data can also be processed from these devices. + +Toolchain FAQ +============= + +Which Xtensa toolchains does SOF currently support? + Two toolchain families are currently supported by SOF: The GCC and the Cadence XCC. + + These families are subdivided into toolchains per Xtensa ISA because the Tensilica architecture contains a variable instruction set so you must use the toolchain variant that matches your platform. + + 1. Custom, open-source GCC toolchains built with crosstool-NG as + documented in the getting started guide. These must be built from + source. For instructions, refer to the following: + + - `Build toolchains from source `_ + in the Getting Started Guide for building SOF from scratch + + - `Toolchains and embedded distributions `_ + + 2. Cadence's partially closed source toolchains. The Cadence XCC compiler + is proprietary but uses the open source GNU binutils. XCC must be + bought from Cadence. For more information, see: + + - `Build SOF with a Third-Party Toolchain `_ + + - `Cadence IP portfolio `_ + + The Cadence binutils patches or overlays are located in the SOF git + repo. + + Note that Cadence is not the only Tensilica user; some Xtensa + toolchains come from `elsewhere `_. However, as of June 2020, all platforms + supported by SOF come from Cadence. + +What are the primary differences between Cadence and gcc toolchains? + gcc toolchains are completely open source. Cadence's toolchains use either + a gcc-based or a clang-based open source frontend and a closed-source + backend that matches the platform. + + XCC supports full Xtensa HiFi SIMD intrinsics whereas GCC has no HiFi SIMD + support. This can lead to large performance differences, especially in + code that deals with audio processing. + +Cadence xt-xcc or Cadence xt-clang? + It depends on the platform. As of June 2020, most platforms supported by + SOF rely on xt-xcc. Going forward, all newer platforms require xt-clang. + The gcc frontend doesn't support unusually large registers, hence the move + to xt-clang. + + Note that xt-xcc does not fully support C99. xt-clang does. + +Is support for other toolchains forthcoming? + Going forward, we would like to support the LLVM C compiler. Patches are + welcome. \ No newline at end of file From 6a5ff66322753df736f56951e909c3873e8d14fb Mon Sep 17 00:00:00 2001 From: Marc Herbert Date: Mon, 27 Jul 2020 17:39:54 -0700 Subject: [PATCH 017/290] extlinks: rename -master aliases to a more generic -mainline Adds one layer of indirection in case branch names change later. Signed-off-by: Marc Herbert --- conf.py | 7 +++++-- contribute/process/docbuild.rst | 6 +++--- getting_started/build-guide/build-from-scratch.rst | 6 +++--- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/conf.py b/conf.py index d5bbb2c5..3d7b24cc 100644 --- a/conf.py +++ b/conf.py @@ -163,10 +163,13 @@ SOF_GIT = 'https://github.com/thesofproject' +# "/sof/tree/branch/dir" is for directories and "/sof/blob/branch/file" is +# for files. Fortunately github automatically redirects one to the other +# as required. extlinks = { - 'git-sof-master': + 'git-sof-mainline': (SOF_GIT + '/sof/tree/master/%s', ""), - 'git-sof-docs-master': + 'git-sof-docs-mainline': (SOF_GIT + '/sof-docs/tree/master/%s', ""), 'git-alsa': ('https://git.alsa-project.org/?p=%s.git', ""), diff --git a/contribute/process/docbuild.rst b/contribute/process/docbuild.rst index 46d23c94..c7ccf989 100644 --- a/contribute/process/docbuild.rst +++ b/contribute/process/docbuild.rst @@ -148,10 +148,10 @@ tools: cd ~/thesofproject/sof-docs pip3 install --user -r scripts/requirements.txt -.. note:: The :git-sof-docs-master:`scripts/requirements.txt` file hardcodes +.. note:: The :git-sof-docs-mainline:`scripts/requirements.txt` file hardcodes versions using ``==``, which may not be compatible with your other projects. In that case you can either setup a Python ``virtualenv`` or - try the unsupported :git-sof-docs-master:`scripts/requirements-lax.txt` + try the unsupported :git-sof-docs-mainline:`scripts/requirements-lax.txt` (more details inside this file): .. code-block:: bash @@ -226,7 +226,7 @@ diagrams. When done, view the HTML output with your browser, starting at If your changes are not related to any UML diagram, you can build more than 10 times faster from scratch by temporarily changing the -``plantuml_output_format`` line in :git-sof-docs-master:`conf.py`. +``plantuml_output_format`` line in :git-sof-docs-mainline:`conf.py`. Publish content *************** diff --git a/getting_started/build-guide/build-from-scratch.rst b/getting_started/build-guide/build-from-scratch.rst index 104a8d4c..cc1ecc40 100644 --- a/getting_started/build-guide/build-from-scratch.rst +++ b/getting_started/build-guide/build-from-scratch.rst @@ -318,7 +318,7 @@ One-step rebuild from scratch ----------------------------- To rebuild |SOF| in just one step, use -:git-sof-master:`scripts/xtensa-build-all.sh` after setting up the +:git-sof-mainline:`scripts/xtensa-build-all.sh` after setting up the environment. Build the firmware for all platforms. @@ -510,8 +510,8 @@ Step 4 Build topology and tools One-step rebuild from scratch ----------------------------- -Without any argument :git-sof-master:`scripts/build-tools.sh` rebuilds -only the minimum subset of :git-sof-master:`tools/`. +Without any argument :git-sof-mainline:`scripts/build-tools.sh` rebuilds +only the minimum subset of :git-sof-mainline:`tools/`. .. code-block:: bash From 342d2f5bc5d5684aded77d310c6806b696546c89 Mon Sep 17 00:00:00 2001 From: Marc Herbert Date: Mon, 27 Jul 2020 18:12:22 -0700 Subject: [PATCH 018/290] Replace 2 hardcoded and duplicated links to source code with extlink More portable. Signed-off-by: Marc Herbert --- contribute/contribute_guidelines.rst | 3 +-- contribute/process/abiprocess.rst | 5 ++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/contribute/contribute_guidelines.rst b/contribute/contribute_guidelines.rst index d102e4b1..6b3bdfa0 100644 --- a/contribute/contribute_guidelines.rst +++ b/contribute/contribute_guidelines.rst @@ -20,8 +20,7 @@ software continues to be available under the terms that the author desired. The SOF project uses a BSD-3-Clause license, as found in the -`LICENSE `__ -in the project's GitHub repo. +:git-sof-mainline:`LICENCE` file in the project's GitHub repo. A license tells you what rights you have as a developer, as provided by the copyright holder. It is important that the contributor fully diff --git a/contribute/process/abiprocess.rst b/contribute/process/abiprocess.rst index 376ecb53..b32f6973 100644 --- a/contribute/process/abiprocess.rst +++ b/contribute/process/abiprocess.rst @@ -13,9 +13,8 @@ defined in: - src/include/ipc/ - src/include/user/ -SOF ABI versioning is defined in firmware source code documentation `FW Source kernel/abi.h`_ - -.. _FW Source kernel/abi.h: https://github.com/thesofproject/sof/blob/master/src/include/kernel/abi.h#L8 +SOF ABI versioning is defined in firmware source code documentation: +:git-sof-mainline:`src/include/kernel/abi.h` Change Process ************** From efdc2bdd43a2a8c9e4845ba101355277b4a65aba Mon Sep 17 00:00:00 2001 From: Marc Herbert Date: Mon, 27 Jul 2020 17:15:19 -0700 Subject: [PATCH 019/290] Fix new toolchains FAQ to use :ref: for internal links Per https://thesofproject.github.io/latest/contribute/doc_guidelines.html#internal-cross-reference-linking Internal links support offline work, don't die silently when someone changes a section name and may solve world hunger. Fixes 37a14b1e352a Signed-off-by: Marc Herbert --- getting_started/build-guide/build-from-scratch.rst | 2 ++ introduction/index.rst | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/getting_started/build-guide/build-from-scratch.rst b/getting_started/build-guide/build-from-scratch.rst index cc1ecc40..e68bf138 100644 --- a/getting_started/build-guide/build-from-scratch.rst +++ b/getting_started/build-guide/build-from-scratch.rst @@ -147,6 +147,8 @@ Create or append to the ``LD_LIBRARY_PATH`` environment variable. export LD_LIBRARY_PATH="${SOF_WORKSPACE}"/alsa-lib/src/.libs:$LD_LIBRARY_PATH +.. _build-toolchains-from-source: + Step 2 Build toolchains from source =================================== diff --git a/introduction/index.rst b/introduction/index.rst index db20df9e..40a78904 100644 --- a/introduction/index.rst +++ b/introduction/index.rst @@ -206,8 +206,8 @@ Which Xtensa toolchains does SOF currently support? documented in the getting started guide. These must be built from source. For instructions, refer to the following: - - `Build toolchains from source `_ - in the Getting Started Guide for building SOF from scratch + - :ref:`build-toolchains-from-source` in the Getting Started Guide + for building SOF from scratch - `Toolchains and embedded distributions `_ @@ -215,7 +215,7 @@ Which Xtensa toolchains does SOF currently support? is proprietary but uses the open source GNU binutils. XCC must be bought from Cadence. For more information, see: - - `Build SOF with a Third-Party Toolchain `_ + - :ref:`build-3rd-party-toolchain` - `Cadence IP portfolio `_ @@ -245,4 +245,4 @@ Cadence xt-xcc or Cadence xt-clang? Is support for other toolchains forthcoming? Going forward, we would like to support the LLVM C compiler. Patches are - welcome. \ No newline at end of file + welcome. From 772a1d686e2e3e759d2cb57b5cc22721e93f2b87 Mon Sep 17 00:00:00 2001 From: Marc Herbert Date: Mon, 27 Jul 2020 17:24:32 -0700 Subject: [PATCH 020/290] Switch two more internal links to :ref: Per https://thesofproject.github.io/latest/contribute/doc_guidelines.html#internal-cross-reference-linking :ref: internal links support offline work, don't die silently when someone changes a section name. Fixes b270e65e19e15 and 2d4a0600fb9db Signed-off-by: Marc Herbert --- developer_guides/fuzzer/fuzzing.rst | 4 ++-- .../linux_driver/architecture/sof_driver_arch.rst | 12 ++++++++++-- getting_started/build-guide/build-with-docker.rst | 2 ++ 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/developer_guides/fuzzer/fuzzing.rst b/developer_guides/fuzzer/fuzzing.rst index db50b4e3..3ebf516e 100644 --- a/developer_guides/fuzzer/fuzzing.rst +++ b/developer_guides/fuzzer/fuzzing.rst @@ -6,8 +6,8 @@ Fuzzing in Docker Instructions ************ -#. Build a fuzzer in order to use it. Follow the instructions at `Build SOF - with docker: Step 4: Build Topology and Tools `__. +#. Build a fuzzer in order to use it. Follow the instructions at Build SOF + with docker, :ref:`docker-topology-tools`. #. Enter the Docker container: diff --git a/developer_guides/linux_driver/architecture/sof_driver_arch.rst b/developer_guides/linux_driver/architecture/sof_driver_arch.rst index 60e6ec76..a71c2a1b 100644 --- a/developer_guides/linux_driver/architecture/sof_driver_arch.rst +++ b/developer_guides/linux_driver/architecture/sof_driver_arch.rst @@ -124,7 +124,13 @@ IPC messages are divided into several groups: global reply, topology, power mana PCM Driver ********** -The SOF PCM driver creates ALSA PCMs, DAPM, and kcontrols based on the `topology `_ data loaded at runtime. The PCM driver also allocates buffers for DMA and registers with runtime PM. It contains architecture- and platform-generic code. The PCM driver implements the low-level functions defined by the ALSA PCM middle layer in ``struct snd_pcm_ops``. These functions implement the platform-generic parts and invoke platform-specific ops to access the hardware. +The SOF PCM driver creates ALSA PCMs, DAPM, and kcontrols based on the +:ref:`topology` data loaded at runtime. The PCM driver also allocates +buffers for DMA and registers with runtime PM. It contains architecture- +and platform-generic code. The PCM driver implements the low-level +functions defined by the ALSA PCM middle layer in ``struct +snd_pcm_ops``. These functions implement the platform-generic parts and +invoke platform-specific ops to access the hardware. When the machine driver is probed and the sound card is registered, the SOF PCM component driver gets probed when the dai links in the sound card are bound to the card. The SOF PCM component probe callback loads the topology file for the DUT. The SOF topology defines the audio processing pipelines, FE DAIs, and the BE DAI configuration for the BE dai links defined in the machine driver. Therefore, it is important to make sure that the DAI link IDs for the BE DAIs are identical in the topology and the machine driver. A mismatch in the DAI links ID will cause the sound card registration to fail. @@ -343,4 +349,6 @@ Force IPC Position Sending position update IPC from the firmware to the host is a generic method to generate period interrupts to meet the requirement from the ALSA IRQ mode (e.g. ``snd_pcm_period_elapsed()``). On some HDA-integrated platforms (e.g. Intel SKL+ ones), this interrupt can be generated using the `HDA `_ period IOC (interrupt on complete) and the real-time buffer pointers can be read back from the DPIB (DMA Pointer In Buffer). On these platforms, the position update IPC is only the fallback choice and is not used by default. -In order to debug issues with IOC/DPIB, the force IPC position kernel debug config can be selected. On Intel SKL- platforms, the stream position update IPC is used whether or not this option is selected. \ No newline at end of file +In order to debug issues with IOC/DPIB, the force IPC position kernel +debug config can be selected. On Intel SKL- platforms, the stream +position update IPC is used whether or not this option is selected. diff --git a/getting_started/build-guide/build-with-docker.rst b/getting_started/build-guide/build-with-docker.rst index 597af1cf..693d66a1 100644 --- a/getting_started/build-guide/build-with-docker.rst +++ b/getting_started/build-guide/build-with-docker.rst @@ -158,6 +158,8 @@ your target machine's /lib/firmware/intel/sof folder. sof-apl.ri sof-bdw.ri sof-byt.ri sof-cht.ri sof-cnl.ri sof-hsw.ri +.. _docker-topology-tools: + Build topology and tools ======================== From 2d664c658c14cbfe9e277fe6d278c4b187147724 Mon Sep 17 00:00:00 2001 From: Marc Herbert Date: Fri, 24 Jul 2020 23:52:57 -0700 Subject: [PATCH 021/290] Makefile: new SOF_DOC_BUILD un-hardcodes ../sof/doc The default and recommended location for the doxygen build is a source directory, which gets polluted by the build and incredibly tedious to (dist)clean manually. Don't change that default and documentation yet (baby steps) but make it at least possible to build (and clean) doxygen outside the source directory per the usual CMake practices. As a side-effect this makes the connection with doxygen and breathe less implicit in the Makefile. Signed-off-by: Marc Herbert --- Makefile | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index ae05e89c..f2b63f5a 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,6 @@ # Minimal makefile for Sphinx documentation # +# You can override these defaults from the command line. ifeq ($(VERBOSE),1) Q = @@ -8,7 +9,7 @@ else Q = @ endif -# You can set these variables from the command line. +SOF_DOC_BUILD = ../sof/doc SPHINXBUILD = sphinx-build SPHINXPROJ = "SOF Project" SOURCEDIR = . @@ -38,18 +39,19 @@ help: # Keep doxygen optional not to burden "drive-by" .rst contributors with # extra dependencies. -APIS_CMAKE := ../sof/doc/build.ninja +APIS_CMAKE := ${SOF_DOC_BUILD}/build.ninja apidocs: ifeq (${APIS_CMAKE},$(wildcard ${APIS_CMAKE})) - ninja -C ../sof/doc $${VERBOSE:+-v} doc + ninja -C ${SOF_DOC_BUILD} $${VERBOSE:+-v} doc else # To build doxygen APIs too run this first: - # cmake -GNinja -S ../sof/doc -B ../sof/doc + # cmake -GNinja -S ../sof/doc -B ${SOF_DOC_BUILD} endif html: apidocs $(SPHINXBUILD) -j auto -t $(DOC_TAG) -b html \ -d $(BUILDDIR)/doctrees $(SOURCEDIR) $(BUILDDIR)/html $(SPHINXOPTS) \ +-D breathe_projects.'SOF Project'="${SOF_DOC_BUILD}"/doxygen/xml \ $(ERROROPTS) $(O) # Reminder: to see _all_ warnings you must "make clean" first. @@ -59,7 +61,7 @@ $(ERROROPTS) $(O) clean: rm -fr $(BUILDDIR) ifeq (${APIS_CMAKE},$(wildcard ${APIS_CMAKE})) - ninja -C ../sof/doc $${VERBOSE:+-v} doc-clean clean + ninja -C ${SOF_DOC_BUILD} $${VERBOSE:+-v} doc-clean clean endif # Copy material over to the GitHub pages staging repo From a087413baf16eab306bac7792951972cac8164fd Mon Sep 17 00:00:00 2001 From: Mohana Datta Yelugoti Date: Sat, 8 Aug 2020 22:46:19 +0530 Subject: [PATCH 022/290] developer_guides: Add instructions to run testbench with AFL fuzzer This new section in the developer guide gives instructions on how to build AFL fuzzer, use AFL provided wrapped gcc compiler to build testbench for instrumenting it. It ends with an example of fuzzing the volume component of the testbench with the AFL fuzzer and the testbench. Signed-off-by: Mohana Datta Yelugoti --- developer_guides/index.rst | 1 + .../testbench_afl_fuzzing.rst | 97 +++++++++++++++++++ 2 files changed, 98 insertions(+) create mode 100644 developer_guides/testbench_fuzzing/testbench_afl_fuzzing.rst diff --git a/developer_guides/index.rst b/developer_guides/index.rst index c0903d64..0ba1609b 100644 --- a/developer_guides/index.rst +++ b/developer_guides/index.rst @@ -22,6 +22,7 @@ terminology before reading further. virtualization/virtualization virtualization/running fuzzer/fuzzing.rst + testbench_fuzzing/testbench_afl_fuzzing.rst Technical Notes *************** diff --git a/developer_guides/testbench_fuzzing/testbench_afl_fuzzing.rst b/developer_guides/testbench_fuzzing/testbench_afl_fuzzing.rst new file mode 100644 index 00000000..49ae69e4 --- /dev/null +++ b/developer_guides/testbench_fuzzing/testbench_afl_fuzzing.rst @@ -0,0 +1,97 @@ +Fuzzing testbench using AFL fuzzer +================================== + +Install AFL fuzzer +------------------ + +Follow the steps from the `Quick Start +Guide `__ +from AFL repository to install the AFL fuzzer in your system. + +From this point onwards, i assume that installation directory of the AFL +fuzzer is at + +:: + + $HOME/work/ + +Building testbench with AFL instrumentation +------------------------------------------- + +AFL is a brute-force fuzzer with an exceedingly simple but rock-solid +instrumentation guided algorithm. So, it's important that we add +instrumentation to the code before we run fuzzer on it to get good +results. + +When you build AFL from the previous step, an **afl-gcc** executable is +generated, this works as a companion tool that acts as a drop-in +replacement for gcc or clang. + +So, before we build testbench we need to make sure we are compiling our +code with **afl-gcc** in order to add instrumentation to the code. + +**The host-build-all.sh script from the scripts/ directory does exactly +this when** **you run it with -f option.** + +**Note**: If you have installed the AFL in any other directory, you need +to change the path in the host-build-all.sh script appropriately. By +default, the script assumes you have installed AFL in '$HOME/work/' +directory. + +Running AFL fuzzer +------------------ + +Assuming we are in the AFL installed directory, to run AFL fuzzer +command syntax is: + +:: + + ./afl-fuzz -i testcase_dir -o findings_dir /path/to/program [...params...] @@ + +The fuzzer assumes that the inputs for the program we want to fuzz are +in the form of files. So, we need to create a directory containing these +input files. This is the *testcase_dir* in the above command. + +Since, we are fuzzing the testbench, the program here is testbench. + +params are nothing but the different parameters of the program apart +from the input file. + +'@@': Each file from testcase_dir is substituted in the place of this. +As fuzzer continues to run, new testcases generated are placed in the +testcase_dir, and the fuzzer is run again with those testcases. + +If we are using topology files as inputs, place topology files of volume +components in say inputs directory. Now, we run a command like this + +Example +------- + +Let's use AFL fuzzer to fuzz the volume component of the testbench. + +If test toplogies are placed in say +/home/sof/work/sof/tools/testbench/inputs directory, then + +:: + + # Add AFL directory to $PATH + export PATH=$PATH:$HOME/AFL + + # Go to testbench directory + cd tools/testbench + + # Run the fuzzer + afl-fuzz -i inputs/ -o output/ build_testbench/install/bin/testbench -r 48000 -R 48000 -i zeros_in.raw -o volume_out.raw -b S16_LE -t @@ + +The fuzzer will run and when it finds inputs which causes crashes or +hangs, it places them in the output directory we have provided (with -o +option in the above command). The inputs are well organized into +crashes, hangs. Then running the testbench with the volume component in +gdb helps in figuring out the error. + +References +---------- + +`README `__ of AFL +is a good place to know more about the AFL tool itself as well as the +various options it provides. From a6fa9570b0f6f0b7003c09ea9771650ed2618dcf Mon Sep 17 00:00:00 2001 From: Deb Taylor Date: Fri, 14 Aug 2020 15:05:51 -0400 Subject: [PATCH 023/290] Created new fuzzy dir and added two related docs to it. Made grammatical edits to testbench fuzzy doc. Signed-off-by: Deb Taylor --- .../fuzzing_in_docker.rst} | 0 developer_guides/fuzzing/index.rst | 10 ++ .../fuzzing/testbench_afl_fuzzing.rst | 96 ++++++++++++++++++ developer_guides/index.rst | 3 +- .../testbench_afl_fuzzing.rst | 97 ------------------- 5 files changed, 107 insertions(+), 99 deletions(-) rename developer_guides/{fuzzer/fuzzing.rst => fuzzing/fuzzing_in_docker.rst} (100%) create mode 100644 developer_guides/fuzzing/index.rst create mode 100644 developer_guides/fuzzing/testbench_afl_fuzzing.rst delete mode 100644 developer_guides/testbench_fuzzing/testbench_afl_fuzzing.rst diff --git a/developer_guides/fuzzer/fuzzing.rst b/developer_guides/fuzzing/fuzzing_in_docker.rst similarity index 100% rename from developer_guides/fuzzer/fuzzing.rst rename to developer_guides/fuzzing/fuzzing_in_docker.rst diff --git a/developer_guides/fuzzing/index.rst b/developer_guides/fuzzing/index.rst new file mode 100644 index 00000000..2967b46c --- /dev/null +++ b/developer_guides/fuzzing/index.rst @@ -0,0 +1,10 @@ +.. _fuzzing-components: + +Fuzzing +####### + +.. toctree:: + :maxdepth: 2 + + fuzzing_in_docker + testbench_afl_fuzzing \ No newline at end of file diff --git a/developer_guides/fuzzing/testbench_afl_fuzzing.rst b/developer_guides/fuzzing/testbench_afl_fuzzing.rst new file mode 100644 index 00000000..3eee6930 --- /dev/null +++ b/developer_guides/fuzzing/testbench_afl_fuzzing.rst @@ -0,0 +1,96 @@ +.. _testbench-afl-fuzzing: + +Build a Fuzzing Testbench with AFL +################################## + +American fuzzy lop (AFL) is a free software fuzzer that can be used to +detect software bugs. Use these instructions to build and run a testbench +with AFL. + +Install AFL +*********** + +Follow the steps in the `AFL Quick Start Guide `_ to install AFL on your system. + +We assume that AFL is installed at: + +:: + + $HOME/work/ + + +Build a testbench with AFL instrumentation +****************************************** + +According to AFL's `README `_, AFL is a "brute-force fuzzer coupled with an exceedingly +simple but rock-solid instrumentation-guided genetic algorithm." **You must +add instrumentation to the code before running a fuzzer in order to get +potentially useful results; otherwise, you might not get any results.** + +When you build AFL from the previous step, an ``afl-gcc`` executable is +generated; this works as a companion tool that acts as a drop-in +replacement for ``gcc`` or ``clang``. Before you build the testbench, make +sure you are compiling code with ``afl-gcc`` in order to add instrumentation +to the code. The ``host-build-all.sh`` script from the ``scripts/`` directory +**does exactly this when you run it with the -f option.** + +.. Note:: + By default, the ``host-build-all.sh`` script assumes you have installed + AFL in the ``$HOME/work/ directory``. If you install AFL in any other + directory, you must change the path in this script. + +Run AFL +******* + +From the AFL directory, run AFL by entering the following: + +:: + + ./afl-fuzz -i testcase_dir -o findings_dir /path/to/program [...params...] @@ + +AFL assumes that the inputs for the program you wish to fuzz are +in the form of files. So, you must create a directory that contains these +input files. This is the ``testcase_dir`` in the above command. + +Since you are fuzzing the testbench, the ``program`` here is testbench. + +``params`` are the different parameters of the program apart from the input +file. + +``@@``: Each file from ``testcase_dir`` is substituted in place of this. +As AFL continues to run, newly-generated testcases are placed in +``testcase_dir``, and AFL in its further iterations runs with these +newly-generated testcases. + +Example +******* + +**Use AFL to fuzz the volume component of the testbench** + +To fuzz the volume component of the testbench, use topology files as inputs +and place the topology files of volume components in an ``inputs`` directory: + +``/home/sof/work/sof/tools/testbench/inputs`` + +:: + + # Add AFL directory to $PATH + export PATH=$PATH:$HOME/AFL + + # Go to the testbench directory + cd tools/testbench + + # Run the fuzzer + afl-fuzz -i inputs/ -o output/ build_testbench/install/bin/testbench -r 48000 -R 48000 -i zeros_in.raw -o volume_out.raw -b S16_LE -t @@ + +AFL runs and places problem inputs in the provided output directory (-o +option in the above command). The inputs are well-organized into +crashes, hangs, etc. Run the testbench with the volume component in +``gdb`` to assist in figuring out the error. + +Reference +--------- + +`AFL README `_ +is a good place to learn more about the AFL tool itself as well as the +various options it provides. diff --git a/developer_guides/index.rst b/developer_guides/index.rst index 0ba1609b..d827ef99 100644 --- a/developer_guides/index.rst +++ b/developer_guides/index.rst @@ -21,8 +21,7 @@ terminology before reading further. linux_driver/index virtualization/virtualization virtualization/running - fuzzer/fuzzing.rst - testbench_fuzzing/testbench_afl_fuzzing.rst + fuzzing/index Technical Notes *************** diff --git a/developer_guides/testbench_fuzzing/testbench_afl_fuzzing.rst b/developer_guides/testbench_fuzzing/testbench_afl_fuzzing.rst deleted file mode 100644 index 49ae69e4..00000000 --- a/developer_guides/testbench_fuzzing/testbench_afl_fuzzing.rst +++ /dev/null @@ -1,97 +0,0 @@ -Fuzzing testbench using AFL fuzzer -================================== - -Install AFL fuzzer ------------------- - -Follow the steps from the `Quick Start -Guide `__ -from AFL repository to install the AFL fuzzer in your system. - -From this point onwards, i assume that installation directory of the AFL -fuzzer is at - -:: - - $HOME/work/ - -Building testbench with AFL instrumentation -------------------------------------------- - -AFL is a brute-force fuzzer with an exceedingly simple but rock-solid -instrumentation guided algorithm. So, it's important that we add -instrumentation to the code before we run fuzzer on it to get good -results. - -When you build AFL from the previous step, an **afl-gcc** executable is -generated, this works as a companion tool that acts as a drop-in -replacement for gcc or clang. - -So, before we build testbench we need to make sure we are compiling our -code with **afl-gcc** in order to add instrumentation to the code. - -**The host-build-all.sh script from the scripts/ directory does exactly -this when** **you run it with -f option.** - -**Note**: If you have installed the AFL in any other directory, you need -to change the path in the host-build-all.sh script appropriately. By -default, the script assumes you have installed AFL in '$HOME/work/' -directory. - -Running AFL fuzzer ------------------- - -Assuming we are in the AFL installed directory, to run AFL fuzzer -command syntax is: - -:: - - ./afl-fuzz -i testcase_dir -o findings_dir /path/to/program [...params...] @@ - -The fuzzer assumes that the inputs for the program we want to fuzz are -in the form of files. So, we need to create a directory containing these -input files. This is the *testcase_dir* in the above command. - -Since, we are fuzzing the testbench, the program here is testbench. - -params are nothing but the different parameters of the program apart -from the input file. - -'@@': Each file from testcase_dir is substituted in the place of this. -As fuzzer continues to run, new testcases generated are placed in the -testcase_dir, and the fuzzer is run again with those testcases. - -If we are using topology files as inputs, place topology files of volume -components in say inputs directory. Now, we run a command like this - -Example -------- - -Let's use AFL fuzzer to fuzz the volume component of the testbench. - -If test toplogies are placed in say -/home/sof/work/sof/tools/testbench/inputs directory, then - -:: - - # Add AFL directory to $PATH - export PATH=$PATH:$HOME/AFL - - # Go to testbench directory - cd tools/testbench - - # Run the fuzzer - afl-fuzz -i inputs/ -o output/ build_testbench/install/bin/testbench -r 48000 -R 48000 -i zeros_in.raw -o volume_out.raw -b S16_LE -t @@ - -The fuzzer will run and when it finds inputs which causes crashes or -hangs, it places them in the output directory we have provided (with -o -option in the above command). The inputs are well organized into -crashes, hangs. Then running the testbench with the volume component in -gdb helps in figuring out the error. - -References ----------- - -`README `__ of AFL -is a good place to know more about the AFL tool itself as well as the -various options it provides. From fb587f23b900f7d7244c2c4a859695b6afa1dc6e Mon Sep 17 00:00:00 2001 From: Karol Trzcinski Date: Thu, 20 Aug 2020 14:29:30 +0200 Subject: [PATCH 024/290] logger: Replace -v option with -n -v option is enabled by default, so there is another one to disable this feauture. Signed-off-by: Karol Trzcinski --- developer_guides/debugability/logger/index.rst | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/developer_guides/debugability/logger/index.rst b/developer_guides/debugability/logger/index.rst index 3b18241b..a80479b6 100644 --- a/developer_guides/debugability/logger/index.rst +++ b/developer_guides/debugability/logger/index.rst @@ -32,7 +32,7 @@ Usage sof-logger -t Get traces from "/sys/kernel/debug/sof/trace" instead of from the default "/sys/kernel/debug/sof/etrace" -p Get traces from stdin instead of the default "/sys/kernel/debug/sof/etrace" -c clock Set the timestamp clock in MHz --e Enable checking the firmware version with the default verification file "/sys/kernel/debug/sof/fw_version" +-n Disable checking the firmware version with the default verification file "/sys/kernel/debug/sof/fw_version" -v ver_file Enable checking the firmware version with the ver_file file instead of the default: "/sys/kernel/debug/sof/fw_version" -s Take a snapshot of state -r Less formatted output for chained log processors @@ -43,12 +43,13 @@ Usage sof-logger Examples: -- Gets traces from the "/sys/kernel/debug/sof/etrace" file; verifies the - fw_version with "/sys/kernel/debug/sof/fw_version" and prints logs to stdout +- Gets traces from the "/sys/kernel/debug/sof/etrace" file; disable compatibility + check between given ldc_file with fw_version saved in default location + and prints logs to stdout .. code-block:: bash - sof-logger -l ldc_file -e + sof-logger -l ldc_file -n - Gets traces from the "/sys/kernel/debug/sof/etrace" file; verifies the fw_version with the ver_file file and prints logs to stdout From 95e0d7f19f620f30be26a023438bc91f10f46364 Mon Sep 17 00:00:00 2001 From: Kai Vehmanen Date: Mon, 7 Sep 2020 16:24:36 +0300 Subject: [PATCH 025/290] contribute: Add section on ABI change field annotation Add a new section and guidance on how new and/or modified ABI fields and enumerations must be documented in the header files. Signed-off-by: Kai Vehmanen --- contribute/process/abiprocess.rst | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/contribute/process/abiprocess.rst b/contribute/process/abiprocess.rst index b32f6973..10dd0b35 100644 --- a/contribute/process/abiprocess.rst +++ b/contribute/process/abiprocess.rst @@ -41,6 +41,26 @@ kernel side shall include code that deals with older firmware and topology files. See :ref:`development_tree` for kernel side documentation. +Documenting modified fields +*************************** + +When the interface is extended with a backwards compatible (MINOR) interface +change, each added or modified interface field must be documented +with a reference to the interface version, where the change was +first implemented. Some code examples: + +.. code-block:: c + + struct foo { + uint8_t group_id; /**< group ID, 0 means no group (ABI3.17) */ + } __attribute__((packed)); + +.. code-block:: c + + enum bar { + EXT_MAN_ELEM_FOO_DATA = 7, /**< ABI3.18 */ + }; + ABI change approvers ******************** From a3b72867f1789d4e244e6fa72ad8a2e62b8ab4bf Mon Sep 17 00:00:00 2001 From: Deb Taylor Date: Wed, 16 Sep 2020 17:47:07 -0400 Subject: [PATCH 026/290] Minor grammatical edits to abiprocess.html Signed-off-by: Deb Taylor --- contribute/process/abiprocess.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/contribute/process/abiprocess.rst b/contribute/process/abiprocess.rst index 10dd0b35..bea46f4b 100644 --- a/contribute/process/abiprocess.rst +++ b/contribute/process/abiprocess.rst @@ -16,7 +16,7 @@ defined in: SOF ABI versioning is defined in firmware source code documentation: :git-sof-mainline:`src/include/kernel/abi.h` -Change Process +Change process ************** When a firmware change requires extending or modifying the public @@ -41,12 +41,12 @@ kernel side shall include code that deals with older firmware and topology files. See :ref:`development_tree` for kernel side documentation. -Documenting modified fields -*************************** +Document modified fields +************************ -When the interface is extended with a backwards compatible (MINOR) interface +When the interface is extended with a backwards-compatible (MINOR) interface change, each added or modified interface field must be documented -with a reference to the interface version, where the change was +with a reference to the interface version where the change was first implemented. Some code examples: .. code-block:: c From d0967d8c32246ba51d04483b36182178d43479fd Mon Sep 17 00:00:00 2001 From: Deb Taylor Date: Wed, 16 Sep 2020 18:49:13 -0400 Subject: [PATCH 027/290] One additional edit to abiprocess.html Signed-off-by: Deb Taylor --- contribute/process/abiprocess.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/contribute/process/abiprocess.rst b/contribute/process/abiprocess.rst index bea46f4b..91308bb1 100644 --- a/contribute/process/abiprocess.rst +++ b/contribute/process/abiprocess.rst @@ -31,7 +31,7 @@ state diagram: .. _ABI Change Tracker: https://github.com/orgs/thesofproject/projects/2 The pull requests are classified in GitHub using the following -official `ABI Change Tracker`_ +official `ABI Change Tracker`_. .. uml:: images/abiprocess.pu :caption: ABI process state diagram @@ -47,7 +47,9 @@ Document modified fields When the interface is extended with a backwards-compatible (MINOR) interface change, each added or modified interface field must be documented with a reference to the interface version where the change was -first implemented. Some code examples: +first implemented. + +Some code examples: .. code-block:: c From c5a95c4f4e945d8b40a313c863293fbac13306bf Mon Sep 17 00:00:00 2001 From: Seppo Ingalsuo Date: Thu, 17 Sep 2020 21:35:02 +0300 Subject: [PATCH 028/290] Developer guides: Add Testbench This patch adds the support documentation for using Testbench for audio processing components development. Signed-off-by: Seppo Ingalsuo --- developer_guides/index.rst | 1 + .../testbench/build_testbench.rst | 118 ++++++++++ .../testbench/debug_in_testbench.rst | 214 ++++++++++++++++++ .../testbench/fig_add_breakpoint.png | Bin 0 -> 6186 bytes developer_guides/testbench/fig_ddd.png | Bin 0 -> 172810 bytes .../testbench/fig_ddd_structs.png | Bin 0 -> 47632 bytes developer_guides/testbench/fig_mhwaveedit.png | Bin 0 -> 30248 bytes .../testbench/fig_process_test_eqiir.png | Bin 0 -> 224622 bytes developer_guides/testbench/index.rst | 31 +++ .../testbench/prepare_new_component.rst | 80 +++++++ .../testbench/test_audio_quality.rst | 126 +++++++++++ 11 files changed, 570 insertions(+) create mode 100644 developer_guides/testbench/build_testbench.rst create mode 100644 developer_guides/testbench/debug_in_testbench.rst create mode 100644 developer_guides/testbench/fig_add_breakpoint.png create mode 100644 developer_guides/testbench/fig_ddd.png create mode 100644 developer_guides/testbench/fig_ddd_structs.png create mode 100644 developer_guides/testbench/fig_mhwaveedit.png create mode 100644 developer_guides/testbench/fig_process_test_eqiir.png create mode 100644 developer_guides/testbench/index.rst create mode 100644 developer_guides/testbench/prepare_new_component.rst create mode 100644 developer_guides/testbench/test_audio_quality.rst diff --git a/developer_guides/index.rst b/developer_guides/index.rst index d827ef99..cd30b5cf 100644 --- a/developer_guides/index.rst +++ b/developer_guides/index.rst @@ -22,6 +22,7 @@ terminology before reading further. virtualization/virtualization virtualization/running fuzzing/index + testbench/index Technical Notes *************** diff --git a/developer_guides/testbench/build_testbench.rst b/developer_guides/testbench/build_testbench.rst new file mode 100644 index 00000000..381eddc3 --- /dev/null +++ b/developer_guides/testbench/build_testbench.rst @@ -0,0 +1,118 @@ +.. _build-testbench: + +Build Testbench and do first run +################################ + +The firmware sources need to be retrieved from the thesofproject +repository in Github as described in :ref:`build-from-scratch`. A +shell need to be started at the firmware repository top level in +directory "$SOF_WORKSPACE"/sof as described there. + +.. code-block:: bash + + cd "$SOF_WORKSPACE"/sof + +Run the following scripts to build the test pipelines, build the +testbench, and run testbench with the provided quick check script. + +.. code-block:: bash + + ./scripts/build-tools.sh -t + ./scripts/rebuild-testbench.sh + ./scripts/host-testbench.sh + +The current version of host-testbench.sh outputs this text if the +previous steps were successful. + +:: + + ========================================================== + test volume with ./volume_run.sh 16 16 48000 zeros_in.raw volume_out.raw + volume test passed! + volume_out size check passed! + ========================================================== + test src with ./src_run.sh 32 32 44100 48000 zeros_in.raw src_out.raw + src test passed! + src_out size check passed! + ========================================================== + test eqiir with ./eqiir_run.sh 16 16 48000 zeros_in.raw eqiir_out.raw + eqiir test passed! + eqiir_out size check passed! + +In the future there will be more items tested in this check so +the output will likely change. If this worked the testbench can be used +for audio quality tests and debugging new components under development. + +When examining script host-testbench.sh it is seen that e.g. the IIR EQ +test is run with commands + +.. code-block:: bash + + cd tools/test/audio + head -c 10240 < /dev/zero > zeros_in.raw + ./eqiir_run.sh 16 16 48000 zeros_in.raw eqiir_out.raw + +The directory with eqiir_run.sh is entered first. Then a file of 10240 +bytes of zeros is created. As 16 bit data it corresponds to 2560 +frames of S16_LE format stereo frames (4 bytes per frame). At 48 kHz +rate it corresponds to 5.3 ms of audio stream. Audio test signals are +usually longer but this was sufficient for the quick testbench health check. + +To process e.g. a music file with a under-development SOF component an +utility to convert from wav, mp3, etc. to raw S16_LE/S24_LE/S32_LE +format is needed. The next command installs from Ubuntu packages +repository a bunch of useful tools for audio files converting, +viewing, recording, playing, and editing. FFMPEG can be used to +import/export formats that the simpler tools sox and ecasound do not +support. The last three items are light audio waveform viewers and +players with some editing and mixing capabilities. Also digital audio +workstation (DAW) software such as Ardour, Qtractor, and MusE can be +used but there's more effort in using them for small quick tasks such +as the following case. + +.. code-block:: bash + + sudo apt install alsa-utils pulseaudio-utils sox ecasound ffmpeg audacity snd-gtk-pulse mhwaveedit + +A sample music or voice or test signal file is needed. The above +alsa-utils package contains some wav files. The sound (and many other +file types) characteristics can be checked with file command easily. + +.. code-block:: bash + + $ file /usr/share/sounds/alsa/Front_Center.wav + /usr/share/sounds/alsa/Front_Center.wav: RIFF (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, mono 48000 Hz + +This file has the correct default 48 kHz rate and 16 bits samples but +it is single channel format (mono). To fix it for test run this +example command for sox automatically converts the sample format to +stereo by duplicating the channels. Also the rate would be converted +if the file would be e.g. 44100 Hz sampled. + +.. code-block:: bash + + sox /usr/share/sounds/alsa/Front_Center.wav --encoding signed-integer -L -r 48000 -c 2 -b 16 audio_in.raw + +Now the testbench can be executed for the input file and the output +can be converted back to wav format. + +.. code-block:: bash + + ./eqiir_run.sh 16 16 48000 audio_in.raw audio_out.raw + sox --encoding signed-integer -L -r 48000 -c 2 -b 16 audio_out.raw audio_out.wav + +The file can be played from command line with command or launched to +an audio editor tool, e.g. mhWaveEdit. + +.. code-block:: bash + + paplay audio_out.wav + mhWaveEdit audio_out.wav + +.. figure:: fig_mhwaveedit.png + + Viewing the result with mhWaveEdit + +Find the green play symbol from tools icons row to play the clip in +the application. You can also zoom with mouse to audio waveform +details. The Yellow play symbol plays a mouse button 1 selected area. diff --git a/developer_guides/testbench/debug_in_testbench.rst b/developer_guides/testbench/debug_in_testbench.rst new file mode 100644 index 00000000..6737f50f --- /dev/null +++ b/developer_guides/testbench/debug_in_testbench.rst @@ -0,0 +1,214 @@ +.. _debug-in-testbench: + +Debug component in Testbench +############################ + +GDB and DDD +*********** + +Code debugging with debugger is an efficient way of finding issues in +components. The code may crash or operate incorrectly. Also the SOF +data structures can be understood better while seeing them in action. + +In testbench environment a severe memory access mistake typically +results to a segmentation fault where the operating system traps the +application when it performs illegal memory access to RAM it has not +allocated. The debugger shows the stack trace of calls if this happens +for quick spotting of offending code. + +A stable but incorrectly working component can be examined with +breakpoints and visualization of data structures. + +To initiate debugging the output from previous command to run IIR EQ +is studied. The information for debugging is shown in the beginning. + +.. code-block:: bash + + ./eqiir_run.sh 16 16 48000 audio_in.raw audio_out.raw + +:: + + Command: ../../testbench/build_testbench/install/bin/testbench + Argument: -d -r 48000 -R 48000 -i audio_in.raw -o audio_out.raw -t ../../build_tools/test/topology/test-playback-ssp5-mclk-0-I2S-eq-iir-s16le-s16le-48k-24576k-codec.tplg -b S16_LE + LD_LIBRARY_PATH: ../../testbench/build_testbench/sof_ep/install/lib:../../testbench/build_testbench/sof_parser/install/lib + +In the above output the command shows the path to installed testbench +binary. The arguments specify e.g. the input and output sample rate, +input and output RAW data files, topology to use for testing and +sample format. The command line options are described when invoking +the binary with switch "-h". But for the binary to work correctly the +dynamic libraries path need to be instructed for the operating +system. It is done by setting the environment variable +LD_LIBRARY_PATH to above shown value. + +.. code-block:: bash + + export LD_LIBRARY_PATH=../../testbench/build_testbench/sof_ep/install/lib:../../testbench/build_testbench/sof_parser/install/lib + ../../testbench/build_testbench/install/bin/testbench -h + +If the help text appeared the testbench binary start directly from +command line worked. Next, the testbench can be started in Data +Display Debugger (DDD) application. DDD is a graphical front-end for +GNU Debugger (GDB). DDD and the dependencies such as GDB needs to be +installed if missing from development computer. + +.. code-block:: bash + + sudo apt install ddd + +The debugging is started to previously used shell with LD_LIBRARY_PATH set. + +.. code-block:: bash + + ddd ../../testbench/build_testbench/install/bin/testbench + +This opens the debugger window. From there find the code line just +after topology parsing (currently 295) by scrolling the code window +with mouse and place a break point there with right mouse button (a +red stop sign). If there are issues that happen at topology parsing +or within component in instantiating in new() place the breakpoint to +parse_topology() line. + +.. figure:: fig_ddd.png + + The ddd debugger start view. + +.. figure:: fig_add_breakpoint.png + + Breakpoint added with right mouse click. + +The breakpoint is placed after topology parsing since the component +symbols do not exist in debugger context before it is loaded by the +topology. To run the testbench until breakpoint, select from menu +Program -> Run... Then mouse copy (text select with left button and +enter to field with center button) the argument line output from +previous script run and click "Run". + +:: + + -d -r 48000 -R 48000 -i audio_in.raw -o audio_out.raw -t ../../build_tools/test/topology/test-playback-ssp5-mclk-0-I2S-eq-iir-s16le-s16le-48k-24576k-codec.tplg -b S16_L + +The execution is now stopped to breakpoint. Since the symbols exist +now the breakpoints can be added to component life cycle after +new(). Use the lowest window part with prompt (gdb) for convenience. + +.. code-block:: bash + + break eq_iir_cmd + break eq_iir_params + break eq_iir_prepare + break eq_iir_copy + break eq_iir_reset + break eq_iir_free + +After that press "Cont" in the small remote control window next to +main ddd window. The execution stops to params() function in playback +start. To view stream parameters mouse left click on params in +function arguments list and select with right mouse button "Display +\*params". The same can be done for dev structure. The suppressed +fields in brackets can be expanded and pointers such as field +"pipeline" from dev can be looked with right mouse click "Display +\*()" from a viewed pointer field. The boxes can be arranged with +mouse. + +.. figure:: fig_ddd_structs.png + + Viewing data in ddd. + +By further pressing "Cont" the code can be run into prepare(). The +next "Cont" press brings the execution to copy(). A breakpoint can be +added to known processing function + +.. code-block:: bash + + break eq_iir_s32_default + +Then in the function step with "Next" over code lines until the read +frag operation for source buffer is completed. The input frame of two +channels to be consumed and produced can be added to view with command: + +.. code-block:: bash + + graph display x[0]@2 + graph display y[0]@2 + +Or to display the entire sink buffer content to see the circular +update over two periods of data. Also the format could be changed to +hex if desired with right mouse click to data. + +.. code-block:: bash + + graph display ((int16_t *)sinkb->stream.addr)[0]@192 + +.. note:: + + DDD has data plotting capability but at the time of writing this + the feature does not work. Such feature can be useful in finding + PCM codes data glitches. Instead for simpler one-time view .gdbinit + can be set up with a macro script to plot the buffers with + gnuplot. Examples can be found with web search. + +.. note:: + + Also due to code optimization with flag "-O" some symbols are + optimized out and do not exist in the context. Also the code lines + stepping may appear non-linear. The testbench can be build as debug + version with cmake build type definition. + + .. code-block:: bash + + cd tools/testbench/build_testbench + cmake -DCMAKE_BUILD_TYPE=Debug .. + make install + + At the time of writing this the flag does not propagate properly + into generated Makefiles. It may be needed to manually edit the + flags.make to remove the -O3 flags. They can be found with run of + + .. code-block:: bash + + grep -r "O3" + + +Valgrind +******** + +Valgrind is a C library run-time that does extensive checks for memory +access. It finds and reports issues those normally do not necessarily +segfault the testbench. Components with violations would in firmware +remain running but cause random instability and failures. + +Using Valgrind is simple. The previously used command line for +testbench run is passed as argument to valgrind command. + +.. code-block:: bash + + valgrind ../../testbench/build_testbench/install/bin/testbench -d -r 48000 -R 48000 -i audio_in.raw -o audio_out.raw -t ../../build_tools/test/topology/test-playback-ssp5-mclk-0-I2S-eq-iir-s16le-s16le-48k-24576k-codec.tplg -b S16_L + +.. note:: + + Valgrind finds issues from current testbench version. The issues + before component new() and after component free() are usually due + to shortcuts taken in porting part of SOF to testbench or from + non-critical features like printing traces. The issue those are + found during component life cycle should be checked and fixed. + +Gprof +***** + +The hot-spots of the components can be found with profiling tool. The +functions those are called most frequently or where majority of CPU +time is spent are the best candidates to optimize for speed. + +The GNU C compiler (GCC) supports option -pg to enable generation of +profiling data when running the executable. There is no cmake build +option for enabling profiling but the cmake files can be hand edited +to contain -pg instead of -g. + +A run of profiling enabled code generates the data file that is viewed +with command gprof. + +.. code-block:: bash + + ../../testbench/build_testbench/install/bin/testbench -d -r 48000 -R 48000 -i audio_in.raw -o audio_out.raw -t ../../build_tools/test/topology/test-playback-ssp5-mclk-0-I2S-eq-iir-s16le-s16le-48k-24576k-codec.tplg -b S16_L + gprof ../../testbench/build_testbench/install/bin/testbench gmon.out diff --git a/developer_guides/testbench/fig_add_breakpoint.png b/developer_guides/testbench/fig_add_breakpoint.png new file mode 100644 index 0000000000000000000000000000000000000000..479c421ba54d0823ea45c88bd2a8dccbac7486df GIT binary patch literal 6186 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 WC(Goz@x@?-0p=z)SIRGW{QX}ST|?sl literal 0 HcmV?d00001 diff --git a/developer_guides/testbench/fig_ddd.png b/developer_guides/testbench/fig_ddd.png new file mode 100644 index 0000000000000000000000000000000000000000..04b0d6d7a58bf086845dedb78dce18a098620144 GIT binary patch literal 172810 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 literal 0 HcmV?d00001 diff --git a/developer_guides/testbench/fig_ddd_structs.png b/developer_guides/testbench/fig_ddd_structs.png new file mode 100644 index 0000000000000000000000000000000000000000..55c469589c54ff5e978c8a04f8784a8446e0e690 GIT binary patch literal 47632 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

V3)%4bDv!#*M{(Ypa+!K`JjJ)wi3}^-S8f4~6=v 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

XDgcFKx+0aYSgSrP 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 )Qk@@&vzZFhlrtx$hc7MHz6 zaJcAf$ybgZL3NTyJo#_xP5z$c<_4%TsZ`5No_m)Ez~r|)^7$vOS`#74FIug3YL``* z`Tr}Q6;kMtioOJY>p}Q^nIcFXR&W4GTObl=2P{HQxqU;-WcdveKC9p~eb#DWy3k#8 zp~2)quRs-PGc_%L(-AF2;(kKoU%+)$(7A9-5UNca^-yNNzY)u`iiVr$fYZ*yGeIN{ z{%j`|FDA`M@d#=Sc}3F6)d9BMSe~8h5QI!INr%erUAL3wzOV&-r~pydU~sI*z@)f& z7b*EE-t&-m1_p|M({4xuWJvi(weuy1tpN1NBgGgX0=`yu(!Z!@OWm{j9ki#gIFL`S zo;>HrTaBIMUdX%W9dr&d>C_r@o9S&d6{%f{p;yH ztiJ(=RA98U09ZktnB7$9kN{dm0wk9RtZ;wlI)Wdy_IqlZNREo@CO$cX9e|^i{lH40 z3@SLp1k&;hM+e5`EiP@C!8pF>JNhXzyaGNs5{|6zPA-|gmkD#|9hK!mg(nUj8d6bm zJ$Z6ge?&00vZy5GHoq5zz@b<8+ZDG+rl00rmYf5wGxY6hcf!Ud9euV94O%lXZ2D7L zG7*2-B1B-t^W06{SokE(754+ zRxS8S>b?y9t^9(?>+@ScZ(y}_@lVo_ErQ6qYtrhJ(G2>MTEE@jUC|JJ<>YyOb^>nU zd%9!TiE$qAVQ?SliQV+xV17ohM--3of~sKC4spY47+&WAZHim(IWx%ddOqaURXzEYO)YHQdvy3Vw; zZ@nw91#_7>;R!rnFI={3sn*tLLsDK7PmEyxl9=lQ5JhhSkqMqQiSr0&zJ!L1P;cNB^;=6{($4Q?+`?5Jq*Fe$GtF|!TENEOp!F}Pdwc5@9zh`9w)RLFixDuiI4jyjxq4~dEo2o3w^)f zAD^EPX(6L_25*msec#GgXvi+eO@wK3pbJ`zYK#0i zv!fBQ&gF^9zN96F!*S^wE|&}X)(S%w?D+eyf8t-izCgnyB6uCos4kI6-mu|#oNQOB zcs?IEUypirVqJzT7)ib3aA@nGeXJl70tUCpE{OHhq^9lD7D+#Ue0<{XKmWwz`M}mR zgE@(76lNG)5jtr}>J`DuQZJ`p$Q@MSn%cB=@ZycYiy0hR&XnYB`pLBI`8lhn3ddAd r>IMEPLSK93{q%j8LK%9V#M}P|JkXPlVq7k;00000NkvXXu0mjf)gCPq literal 0 HcmV?d00001 diff --git a/developer_guides/testbench/index.rst b/developer_guides/testbench/index.rst new file mode 100644 index 00000000..100c7f76 --- /dev/null +++ b/developer_guides/testbench/index.rst @@ -0,0 +1,31 @@ +.. _testbench: + +Testbench +######### + +Introduction +************ + +Testbench is a native code environment in development computer for +simulating one or more SOF audio processing components in a SOF +topology defined test pipeline. The generic C versions of the +components work as such without modifications in the testbench. In a +x86 Linux computer all normal C code tools can be used for +development. + +The pipeline audio source and sink are normal files to store the PCM +format. The pipeline simulation is scheduled to happen as fast as the +computer can process the data. Typically the pipelines execute 10 - +100x the speed vs. real time. Therefore the testbench allows testing +the pipeline with good coverage in a very short time. + +The next chapters describe the typical usage scenarios with testbench. + +.. toctree:: + :maxdepth: 2 + + build_testbench + debug_in_testbench + prepare_new_component + test_audio_quality + diff --git a/developer_guides/testbench/prepare_new_component.rst b/developer_guides/testbench/prepare_new_component.rst new file mode 100644 index 00000000..91f35bdb --- /dev/null +++ b/developer_guides/testbench/prepare_new_component.rst @@ -0,0 +1,80 @@ +.. _prepare-new-component: + +Prepare a new component for Testbench +##################################### + +Since the introduction of UUID system for SOF processing components +there is no more need for kernel topology parsing to add new +component. However at time of writing this there's a limitation in +testbench that it does not parse UUIDs from component libraries. + +Here's a diff shown for needed edits to testbench for new component +called "newcomp". Remember to copy the UUID bytes from the actual +component code. And please include it to your component pull request +as a commit to keep testbench up-to-date. + +.. code-block:: diff + + diff --git a/tools/testbench/include/testbench/common_test.h b/tools/testbench/include/testbench/common_test.h + index 5744a84cb..093f115d9 100644 + --- a/tools/testbench/include/testbench/common_test.h + +++ b/tools/testbench/include/testbench/common_test.h + @@ -23,7 +23,7 @@ + #define MAX_OUTPUT_FILE_NUM 4 + + /* number of widgets types supported in testbench */ + -#define NUM_WIDGETS_SUPPORTED 9 + +#define NUM_WIDGETS_SUPPORTED 10 + + struct testbench_prm { + char *tplg_file; /* topology file to use */ + diff --git a/tools/testbench/testbench.c b/tools/testbench/testbench.c + index 9d3c79438..15e00e82f 100644 + --- a/tools/testbench/testbench.c + +++ b/tools/testbench/testbench.c + @@ -30,6 +30,9 @@ DECLARE_SOF_TB_UUID("crossover", crossover_uuid, 0x948c9ad1, 0x806a, 0x4131, + DECLARE_SOF_TB_UUID("tdfb", tdfb_uuid, 0xdd511749, 0xd9fa, 0x455c, + 0xb3, 0xa7, 0x13, 0x58, 0x56, 0x93, 0xf1, 0xaf); + + +DECLARE_SOF_TB_UUID("newcomp", newcomp_uuid, 0x00000000, 0x0000, 0x0000, + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00); + + + #define TESTBENCH_NCH 2 /* Stereo */ + + /* shared library look up table */ + @@ -43,6 +46,7 @@ struct shared_lib_table lib_table[NUM_WIDGETS_SUPPORTED] = { + {"dcblock", "libsof_dcblock.so", SOF_COMP_DCBLOCK, NULL, 0, NULL}, + {"crossover", "libsof_crossover.so", SOF_COMP_NONE, SOF_TB_UUID(crossover_uuid), 0, NULL}, + {"tdfb", "libsof_tdfb.so", SOF_COMP_NONE, SOF_TB_UUID(tdfb_uuid), 0, NULL}, + + {"newcomp", "libsof_newcomp.so", SOF_COMP_NONE, SOF_TB_UUID(newcomp_uuid), 0, NULL}, + }; + + /* main firmware context */ + +There's also need to add test pipelines generation for "newcomp". You +will need to add a pipeline macro pipe-newcomp-playback.m4 into +directory tools/topology/sof. The file should exist for normal usage +of a playback component. + +.. code-block:: diff + + diff --git a/tools/test/topology/tplg-build.sh b/tools/test/topology/tplg-build.sh + index 5c9dcb02b..1e236b7e8 100755 + --- a/tools/test/topology/tplg-build.sh + +++ b/tools/test/topology/tplg-build.sh + @@ -227,7 +227,7 @@ done + + + # for processing algorithms + -ALG_SINGLE_MODE_TESTS=(asrc eq-fir eq-iir src dcblock tdfb) + +ALG_SINGLE_MODE_TESTS=(asrc eq-fir eq-iir src dcblock tdfb newcomp) + ALG_SINGLE_SIMPLE_TESTS=(test-capture test-playback) + ALG_MULTI_MODE_TESTS=(crossover) + ALG_MULTI_SIMPLE_TESTS=(test-playback) + +.. note:: + + Since currently the testbench supports only playback direction + there is need to add a playback pipeline macro even if the + component is meant only for capture direction, e.g. for a + microphone processing component. diff --git a/developer_guides/testbench/test_audio_quality.rst b/developer_guides/testbench/test_audio_quality.rst new file mode 100644 index 00000000..847d7bab --- /dev/null +++ b/developer_guides/testbench/test_audio_quality.rst @@ -0,0 +1,126 @@ +.. _test-audio-quality: + +Test audio quality +################## + +The directory tools/test/audio contains support for testing objective +audio quality parameters. The tests include e.g. gain, frequency +response (FR), dynamic range (DR), total harmonic distortion plus +noise (THD+N). The definitions can be found from Audio Engineering +Society's AES17 standard. + +There's need to have Octave or Matlab installed to execute the +tests. Matlab is commercial product by MathWorks. GNU Octave is a free +software tool and (nearly) same m-language compatible tool that can be +used to run the same scripts. Octave and useful toolboxes for audio +development can be installed with: + +.. code-block:: bash + + sudo apt install octave octave-signal octave-control octave-io + +Octave can be started to correct directory for tests with: + +.. code-block:: bash + + cd tools/test/audio + octave --gui & + +From Octave shell the test script for IIR EQ component can be launched +for all support sample formats: + +.. code-block:: octave + + help process_test + process_test('eqiir') + +The end of test outputs a CSV format table for test results + +:: + + eqiir test result: Gain (dB) + in \ out, 16, 24, 32 + 16, -7.33, x, x + 24, x, -7.33, x + 32, x, x, -7.33 + + + eqiir test result: Dynamic range (dB CCIR-RMS) + in \ out, 16, 24, 32 + 16, 82.43, x, x + 24, x, 130.40, x + 32, x, x, 149.12 + + + eqiir test result: Worst-case THD+N vs. frequency + in \ out, 16, 24, 32 + 16, -54.93, x, x + 24, x, -98.01, x + 32, x, x, -99.55 + + + eqiir test result: Fails chirp/gain/DR/THD+N/FR + in \ out, 16, 24, 32 + 16, 0/0/0/0/0, x, x + 24, x, 0/0/0/0/0, x + 32, x, x, 0/0/0/0/0 + + + Number of passed tests = 15 + Number of failed tests = 0 + Number of non-applicable tests = 0 + Number of skipped tests = 0 + +The script is currently set up for batch processing in text console. To +enable graphics plot windows an edit can be done: + +.. code-block:: diff + + diff --git a/tools/test/audio/process_test.m b/tools/test/audio/process_test.m + index 1a802b462..6ec6cda2b 100644 + --- a/tools/test/audio/process_test.m + +++ b/tools/test/audio/process_test.m + @@ -48,8 +48,8 @@ t.full_test = 1; % 0 is quick check only, 1 is full set + % visibility set to to 0 only console text is seen. The plots are + % exported into plots directory in png format and can be viewed from + % there. + -t.plot_close_windows = 1; % Workaround for visible windows if Octave hangs + -t.plot_visible = 'off'; % Use off for batch tests and on for interactive + +t.plot_close_windows = 0; % Workaround for visible windows if Octave hangs + +t.plot_visible = 'on'; % Use off for batch tests and on for interactive + t.files_delete = 1; % Set to 0 to inspect the audio data files + + %% Prepare + +When e.g. test for 24 bit to 24 bit output is executed with +process_test('eqiir', 24, 24) the following plots are generated. They +are useful to visually gain more insight about component's +characteristics. + +.. figure:: fig_process_test_eqiir.png + + Test results for EQ IIR component: Chirp spectrogram, THD+N frequency sweep, measured FR. + + +For new components development when the test set is suitable, e.g. the +previous example "newcomp", this script needs small a addition. Also +there's need to create a newcomp_run.sh based on existing examples +found in the same directory. Also more customization can be done as +e.g. for re-defining the test pass/fail criteria for EQ components. + +.. code-block:: diff + + diff --git a/tools/test/audio/process_test.m b/tools/test/audio/process_test.m + index fd9055cae..1a802b462 100644 + --- a/tools/test/audio/process_test.m + +++ b/tools/test/audio/process_test.m + @@ -373,7 +373,7 @@ end + function test = test_run_process(test, t) + + switch lower(test.comp) + - case {'eqiir', 'eqfir', 'dcblock', 'volume', 'tdfb'} + + case {'eqiir', 'eqfir', 'dcblock', 'volume', 'tdfb', 'newcomp'} + test.ex = sprintf('./%s_run.sh', lower(test.comp)); + otherwise + error('Unknown component'); + From 98a608a13adaa6cc0fbd2b35fd6fb48e90dc3387 Mon Sep 17 00:00:00 2001 From: Deb Taylor Date: Mon, 21 Sep 2020 23:13:48 -0400 Subject: [PATCH 029/290] Grammatical edits to testbench docs Signed-off-by: Deb Taylor --- .../testbench/build_testbench.rst | 97 ++++----- .../testbench/debug_in_testbench.rst | 184 +++++++++--------- developer_guides/testbench/index.rst | 21 +- .../testbench/prepare_new_component.rst | 28 ++- .../testbench/test_audio_quality.rst | 47 ++--- 5 files changed, 183 insertions(+), 194 deletions(-) diff --git a/developer_guides/testbench/build_testbench.rst b/developer_guides/testbench/build_testbench.rst index 381eddc3..b371757d 100644 --- a/developer_guides/testbench/build_testbench.rst +++ b/developer_guides/testbench/build_testbench.rst @@ -1,19 +1,18 @@ .. _build-testbench: -Build Testbench and do first run -################################ +Build and Run Testbench +####################### -The firmware sources need to be retrieved from the thesofproject -repository in Github as described in :ref:`build-from-scratch`. A -shell need to be started at the firmware repository top level in -directory "$SOF_WORKSPACE"/sof as described there. +Retrieve the required firmware from the ``thesofproject`` repository in +Github as described in :ref:`build-from-scratch`. Start a shell at the +firmware repository top level in the ``$SOF_WORKSPACE/sof`` directory as also described. .. code-block:: bash cd "$SOF_WORKSPACE"/sof -Run the following scripts to build the test pipelines, build the -testbench, and run testbench with the provided quick check script. +Run the following scripts to build the test pipelines, build the testbench, +and run the testbench with the provided quick check script: .. code-block:: bash @@ -21,8 +20,8 @@ testbench, and run testbench with the provided quick check script. ./scripts/rebuild-testbench.sh ./scripts/host-testbench.sh -The current version of host-testbench.sh outputs this text if the -previous steps were successful. +The current version of ``host-testbench.sh`` outputs the following text if +the previous steps are successful: :: @@ -39,12 +38,15 @@ previous steps were successful. eqiir test passed! eqiir_out size check passed! -In the future there will be more items tested in this check so -the output will likely change. If this worked the testbench can be used -for audio quality tests and debugging new components under development. +Note that more items are slated to be tested in this check so the output +will likely change. The testbench can be used for audio quality tests and +debugging new components under development. -When examining script host-testbench.sh it is seen that e.g. the IIR EQ -test is run with commands +host-testbench.sh +================= + +In our example, the ``host-testbench.sh`` script shows that the IIR EQ test +is run with the following commands: .. code-block:: bash @@ -52,57 +54,56 @@ test is run with commands head -c 10240 < /dev/zero > zeros_in.raw ./eqiir_run.sh 16 16 48000 zeros_in.raw eqiir_out.raw -The directory with eqiir_run.sh is entered first. Then a file of 10240 -bytes of zeros is created. As 16 bit data it corresponds to 2560 -frames of S16_LE format stereo frames (4 bytes per frame). At 48 kHz -rate it corresponds to 5.3 ms of audio stream. Audio test signals are -usually longer but this was sufficient for the quick testbench health check. - -To process e.g. a music file with a under-development SOF component an -utility to convert from wav, mp3, etc. to raw S16_LE/S24_LE/S32_LE -format is needed. The next command installs from Ubuntu packages -repository a bunch of useful tools for audio files converting, -viewing, recording, playing, and editing. FFMPEG can be used to -import/export formats that the simpler tools sox and ecasound do not -support. The last three items are light audio waveform viewers and -players with some editing and mixing capabilities. Also digital audio -workstation (DAW) software such as Ardour, Qtractor, and MusE can be -used but there's more effort in using them for small quick tasks such -as the following case. +The directory that contains ``eqiir_run.sh`` is entered first. Next, a file +of 10240 bytes of zeros is created. As 16-bit data, it corresponds to 2560 +frames of S16_LE format stereo frames (4 bytes per frame). At a 48 kHz rate, +it corresponds to 5.3 ms of audio stream. Audio test signals are usually +longer but this is sufficient for the quick testbench health check. + +To process a music file with an under-development SOF component, a utility +to convert from wav, mp3, etc. to raw S16_LE/S24_LE/S32_LE format is needed. +The next command installs from the Ubuntu packages repository a lot of useful +tools for audio files converting, viewing, recording, playing, and editing. +FFMPEG can be used to import/export formats that the simpler tools ``sox`` +and ``ecasound`` do not support. The last three items are light audio +waveform viewers and players with some editing and mixing capabilities. +Also, digital audio workstation (DAW) software such as Ardour, Qtractor, and +MusE can be used but there's more effort in using them for small quick tasks +such as in the following case. .. code-block:: bash sudo apt install alsa-utils pulseaudio-utils sox ecasound ffmpeg audacity snd-gtk-pulse mhwaveedit -A sample music or voice or test signal file is needed. The above -alsa-utils package contains some wav files. The sound (and many other -file types) characteristics can be checked with file command easily. +A sample music or voice or test signal file is needed. The above alsa-utils +package contains some wav files. The sound (and many other file types) +characteristics can be easily checked using this file command: .. code-block:: bash $ file /usr/share/sounds/alsa/Front_Center.wav /usr/share/sounds/alsa/Front_Center.wav: RIFF (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, mono 48000 Hz -This file has the correct default 48 kHz rate and 16 bits samples but -it is single channel format (mono). To fix it for test run this -example command for sox automatically converts the sample format to -stereo by duplicating the channels. Also the rate would be converted -if the file would be e.g. 44100 Hz sampled. +This file has the correct default 48 kHz rate and 16 bits samples but it is +in a single channel format (mono). To fix it for testing, run the following +example command. Sox automatically converts the sample format to stereo by +duplicating the channels. Also the rate would be converted if the file would +be 44100 Hz sampled. .. code-block:: bash sox /usr/share/sounds/alsa/Front_Center.wav --encoding signed-integer -L -r 48000 -c 2 -b 16 audio_in.raw -Now the testbench can be executed for the input file and the output -can be converted back to wav format. +Now the testbench can be executed for the input file and the output can be +converted back to wav format: .. code-block:: bash ./eqiir_run.sh 16 16 48000 audio_in.raw audio_out.raw sox --encoding signed-integer -L -r 48000 -c 2 -b 16 audio_out.raw audio_out.wav -The file can be played from command line with command or launched to -an audio editor tool, e.g. mhWaveEdit. +The file can be played from the command line with the following command or +it can be launched to an audio editor tool such as mhWaveEdit: .. code-block:: bash @@ -110,9 +111,9 @@ an audio editor tool, e.g. mhWaveEdit. mhWaveEdit audio_out.wav .. figure:: fig_mhwaveedit.png - + Viewing the result with mhWaveEdit -Find the green play symbol from tools icons row to play the clip in -the application. You can also zoom with mouse to audio waveform -details. The Yellow play symbol plays a mouse button 1 selected area. +Select the green **play** icon to play the clip in the application. Use the +mouse to zoom in on audio waveform details. Select the yellow **play** icon +to play a selected area. diff --git a/developer_guides/testbench/debug_in_testbench.rst b/developer_guides/testbench/debug_in_testbench.rst index 6737f50f..7aa93da0 100644 --- a/developer_guides/testbench/debug_in_testbench.rst +++ b/developer_guides/testbench/debug_in_testbench.rst @@ -1,26 +1,26 @@ .. _debug-in-testbench: -Debug component in Testbench +Debug Component in Testbench ############################ GDB and DDD *********** -Code debugging with debugger is an efficient way of finding issues in -components. The code may crash or operate incorrectly. Also the SOF -data structures can be understood better while seeing them in action. +Code debugging with debugger is an efficient way to find issues in +components. The code may crash or operate incorrectly. The SOF data +structures can be understood better while seeing them in action. -In testbench environment a severe memory access mistake typically -results to a segmentation fault where the operating system traps the -application when it performs illegal memory access to RAM it has not -allocated. The debugger shows the stack trace of calls if this happens -for quick spotting of offending code. +In a testbench environment, a severe memory access mistake typically results +in a segmentation fault where the operating system traps the application when +it performs illegal memory access to RAM it has not allocated. The debugger +shows the stack trace of calls if this happens for quick spotting of +offending code. -A stable but incorrectly working component can be examined with -breakpoints and visualization of data structures. +A stable but incorrectly working component can be examined with breakpoints +and visualization of data structures. -To initiate debugging the output from previous command to run IIR EQ -is studied. The information for debugging is shown in the beginning. +To initiate debugging, the output from our previous IIR EQ example is +used (refer to :ref:`build-testbench`). The information for debugging is shown below: .. code-block:: bash @@ -32,42 +32,41 @@ is studied. The information for debugging is shown in the beginning. Argument: -d -r 48000 -R 48000 -i audio_in.raw -o audio_out.raw -t ../../build_tools/test/topology/test-playback-ssp5-mclk-0-I2S-eq-iir-s16le-s16le-48k-24576k-codec.tplg -b S16_LE LD_LIBRARY_PATH: ../../testbench/build_testbench/sof_ep/install/lib:../../testbench/build_testbench/sof_parser/install/lib -In the above output the command shows the path to installed testbench -binary. The arguments specify e.g. the input and output sample rate, -input and output RAW data files, topology to use for testing and -sample format. The command line options are described when invoking -the binary with switch "-h". But for the binary to work correctly the -dynamic libraries path need to be instructed for the operating -system. It is done by setting the environment variable -LD_LIBRARY_PATH to above shown value. +In the above output the command shows the path to the installed testbench +binary. The arguments specify the input and output sample rate, input +and output RAW data files, the topology to use for testing, and the sample +format. The command line options are described when invoking the binary with +switch ``-h``. But for the binary to work correctly, the dynamic libraries path must be instructed for the operating system. This is done by setting the +environment variable ``LD_LIBRARY_PATH`` to the above shown value. .. code-block:: bash export LD_LIBRARY_PATH=../../testbench/build_testbench/sof_ep/install/lib:../../testbench/build_testbench/sof_parser/install/lib ../../testbench/build_testbench/install/bin/testbench -h -If the help text appeared the testbench binary start directly from -command line worked. Next, the testbench can be started in Data -Display Debugger (DDD) application. DDD is a graphical front-end for -GNU Debugger (GDB). DDD and the dependencies such as GDB needs to be -installed if missing from development computer. +If the help text appears, the testbench binary started directly from the +command line works. Next, the testbench can be started in the Data Display +Debugger (DDD) application. DDD is a graphical front-end for the GNU +Debugger (GDB). DDD and the dependencies such as GDB needs to be installed +if it is missing from the development computer. .. code-block:: bash sudo apt install ddd -The debugging is started to previously used shell with LD_LIBRARY_PATH set. +The debugging is started to the previously used shell with the +``LD_LIBRARY_PATH`` set. .. code-block:: bash ddd ../../testbench/build_testbench/install/bin/testbench -This opens the debugger window. From there find the code line just -after topology parsing (currently 295) by scrolling the code window -with mouse and place a break point there with right mouse button (a -red stop sign). If there are issues that happen at topology parsing -or within component in instantiating in new() place the breakpoint to -parse_topology() line. +This opens the debugger window. From there, find the code line just after +topology parsing (currently 295) by scrolling the code window with a mouse +and placing a break point there with the right-mouse button (a red stop +sign). If issues happen at topology parsing or within the component in +instantiating in ``new()``, place the breakpoint to the ``parse_topology()`` +line. .. figure:: fig_ddd.png @@ -75,22 +74,21 @@ parse_topology() line. .. figure:: fig_add_breakpoint.png - Breakpoint added with right mouse click. + Breakpoint added with right-mouse click. -The breakpoint is placed after topology parsing since the component -symbols do not exist in debugger context before it is loaded by the -topology. To run the testbench until breakpoint, select from menu -Program -> Run... Then mouse copy (text select with left button and -enter to field with center button) the argument line output from -previous script run and click "Run". +The breakpoint is placed after topology parsing since the component symbols +do not exist in debugger context before it is loaded by the topology. To run +the testbench until breakpoint, select **Program** -> **Run** from the menu +as shown in the image above. Then use your mouse to copy and paste the +argument line output from the previous script run and click **Run**: :: -d -r 48000 -R 48000 -i audio_in.raw -o audio_out.raw -t ../../build_tools/test/topology/test-playback-ssp5-mclk-0-I2S-eq-iir-s16le-s16le-48k-24576k-codec.tplg -b S16_L -The execution is now stopped to breakpoint. Since the symbols exist -now the breakpoints can be added to component life cycle after -new(). Use the lowest window part with prompt (gdb) for convenience. +The execution is now stopped to breakpoint. Since the symbols exist now, the +breakpoints can be added to the component life cycle after ``new()``. Use +the lowest window part with the prompt (gdb) for convenience. .. code-block:: bash @@ -101,40 +99,40 @@ new(). Use the lowest window part with prompt (gdb) for convenience. break eq_iir_reset break eq_iir_free -After that press "Cont" in the small remote control window next to -main ddd window. The execution stops to params() function in playback -start. To view stream parameters mouse left click on params in -function arguments list and select with right mouse button "Display -\*params". The same can be done for dev structure. The suppressed -fields in brackets can be expanded and pointers such as field -"pipeline" from dev can be looked with right mouse click "Display -\*()" from a viewed pointer field. The boxes can be arranged with -mouse. +Next, press **Cont** in the small remote control window next to the main ddd +window. The execution stops at the ``params()`` function in playback start. +To view stream parameters, mouse left-click on **params** in the function +arguments list and use the mouse to right-click "Display \*params". The same +can be done for the dev structure. The suppressed fields in brackets can be +expanded and pointers such as the field ``pipeline`` from dev can be viewed +by right-mouse clicking "Display \*()" from a viewed pointer field. The +boxes can be arranged with the mouse. .. figure:: fig_ddd_structs.png Viewing data in ddd. -By further pressing "Cont" the code can be run into prepare(). The -next "Cont" press brings the execution to copy(). A breakpoint can be -added to known processing function +By further pressing **Cont**, the code can be run into ``prepare()``. The +next **Cont** press brings the execution to ``copy()``. A breakpoint can be +added to a known processing function: .. code-block:: bash break eq_iir_s32_default -Then in the function step with "Next" over code lines until the read -frag operation for source buffer is completed. The input frame of two -channels to be consumed and produced can be added to view with command: +In the function, step with **Next** over code lines until the read frag +operation for the source buffer is completed. The input frame of two +channels to be consumed and produced can be added to view with the following +command: .. code-block:: bash graph display x[0]@2 graph display y[0]@2 -Or to display the entire sink buffer content to see the circular -update over two periods of data. Also the format could be changed to -hex if desired with right mouse click to data. +You can also display the entire sink buffer content to see the circular +update over two periods of data. The format can be changed to hex if desired +with a right-mouse click of the data. .. code-block:: bash @@ -142,18 +140,18 @@ hex if desired with right mouse click to data. .. note:: - DDD has data plotting capability but at the time of writing this - the feature does not work. Such feature can be useful in finding - PCM codes data glitches. Instead for simpler one-time view .gdbinit - can be set up with a macro script to plot the buffers with - gnuplot. Examples can be found with web search. + DDD has data plotting capability but the feature does not work at the + time of this writing. Such a feature can be useful in finding PCM code + data glitches. For a simpler one-time view, ``.gdbinit`` can be set up + with a macro script to plot the buffers with ``gnuplot``. Examples can be + found via web search. .. note:: - Also due to code optimization with flag "-O" some symbols are - optimized out and do not exist in the context. Also the code lines - stepping may appear non-linear. The testbench can be build as debug - version with cmake build type definition. + Due to code optimization with the ``-O`` flag, some symbols are optimized + out and do not exist in context. Also, the code lines stepping may appear + to be non-linear. The testbench can be built as a debug version with the + cmake build type definition. .. code-block:: bash @@ -161,9 +159,9 @@ hex if desired with right mouse click to data. cmake -DCMAKE_BUILD_TYPE=Debug .. make install - At the time of writing this the flag does not propagate properly - into generated Makefiles. It may be needed to manually edit the - flags.make to remove the -O3 flags. They can be found with run of + At the time of this writing, the flag does not propagate properly + into generated Makefiles. It may be necessary to manually edit + ``flags.make`` to remove the ``-O3`` flags. They can be found by running: .. code-block:: bash @@ -174,12 +172,12 @@ Valgrind ******** Valgrind is a C library run-time that does extensive checks for memory -access. It finds and reports issues those normally do not necessarily -segfault the testbench. Components with violations would in firmware -remain running but cause random instability and failures. +access. It finds and reports issues that normally do not segfault the +testbench. Components with violations would keep running in the firmware but +would cause random instability and failures. -Using Valgrind is simple. The previously used command line for -testbench run is passed as argument to valgrind command. +Using Valgrind is simple. The previously used command line for testbench run +is passed as an argument to the valgrind command: .. code-block:: bash @@ -187,26 +185,26 @@ testbench run is passed as argument to valgrind command. .. note:: - Valgrind finds issues from current testbench version. The issues - before component new() and after component free() are usually due - to shortcuts taken in porting part of SOF to testbench or from - non-critical features like printing traces. The issue those are - found during component life cycle should be checked and fixed. - + Valgrind finds issues from the current testbench version. The issues + before component ``new()`` and after component ``free()`` are usually due + to shortcuts taken in porting part of SOF to the testbench or from + non-critical features like printing traces. Issues like these that are + found during the component life cycle should be checked and fixed. + Gprof ***** -The hot-spots of the components can be found with profiling tool. The -functions those are called most frequently or where majority of CPU -time is spent are the best candidates to optimize for speed. +The hotspots of the components can be found with a profiling tool. The +functions that are called most frequently or where the majority of CPU time +is spent are the best candidates to optimize for speed. -The GNU C compiler (GCC) supports option -pg to enable generation of -profiling data when running the executable. There is no cmake build -option for enabling profiling but the cmake files can be hand edited -to contain -pg instead of -g. +The GNU C compiler (GCC) supports option ``-pg`` to enable the generation of +profiling data when running the executable. There is no cmake build option +for enabling profiling but the cmake files can be hand-edited to contain +``-pg`` instead of ``-g``. -A run of profiling enabled code generates the data file that is viewed -with command gprof. +A run of profiling enabled code generates the data file that is viewed with +the ``gprof`` command. .. code-block:: bash diff --git a/developer_guides/testbench/index.rst b/developer_guides/testbench/index.rst index 100c7f76..0e0cb9c9 100644 --- a/developer_guides/testbench/index.rst +++ b/developer_guides/testbench/index.rst @@ -3,26 +3,23 @@ Testbench ######### -Introduction -************ - -Testbench is a native code environment in development computer for -simulating one or more SOF audio processing components in a SOF -topology defined test pipeline. The generic C versions of the -components work as such without modifications in the testbench. In a -x86 Linux computer all normal C code tools can be used for +Testbench is a native code environment in computer development for +simulating one or more SOF audio processing components in an SOF +topology-defined test pipeline. The generic C versions of the +components work as such without modifications in the testbench. In an +x86 Linux computer, all normal C code tools can be used for development. The pipeline audio source and sink are normal files to store the PCM format. The pipeline simulation is scheduled to happen as fast as the -computer can process the data. Typically the pipelines execute 10 - -100x the speed vs. real time. Therefore the testbench allows testing +computer can process the data. Typically, the pipelines execute 10 - +100x the speed vs. real time. Therefore, the testbench allows testing the pipeline with good coverage in a very short time. -The next chapters describe the typical usage scenarios with testbench. +The next sections describe typical usage scenarios with testbench. .. toctree:: - :maxdepth: 2 + :maxdepth: 1 build_testbench debug_in_testbench diff --git a/developer_guides/testbench/prepare_new_component.rst b/developer_guides/testbench/prepare_new_component.rst index 91f35bdb..1bfc84d5 100644 --- a/developer_guides/testbench/prepare_new_component.rst +++ b/developer_guides/testbench/prepare_new_component.rst @@ -1,17 +1,15 @@ .. _prepare-new-component: -Prepare a new component for Testbench +Prepare a New Component for Testbench ##################################### -Since the introduction of UUID system for SOF processing components -there is no more need for kernel topology parsing to add new -component. However at time of writing this there's a limitation in -testbench that it does not parse UUIDs from component libraries. +Since the introduction of the UUID system for SOF processing components, +we no longer need kernel topology parsing to add new components. However, at +the time of this writing, the testbench is limited in that it does not parse UUIDs from component libraries. -Here's a diff shown for needed edits to testbench for new component -called "newcomp". Remember to copy the UUID bytes from the actual -component code. And please include it to your component pull request -as a commit to keep testbench up-to-date. +The following diff shows edits that are needed in order to testbench a new +component called "newcomp". Remember to copy the UUID bytes from the actual +component code. Include it in your component pull request as a commit to keep the testbench updated. .. code-block:: diff @@ -51,9 +49,9 @@ as a commit to keep testbench up-to-date. /* main firmware context */ -There's also need to add test pipelines generation for "newcomp". You -will need to add a pipeline macro pipe-newcomp-playback.m4 into -directory tools/topology/sof. The file should exist for normal usage +A need also exists to add pipelines generation tests for "newcomp". You +will need to add a pipeline macro ``pipe-newcomp-playback.m4`` into the +``tools/topology/sof`` directory. The file should exist for normal usage of a playback component. .. code-block:: diff @@ -74,7 +72,7 @@ of a playback component. .. note:: - Since currently the testbench supports only playback direction - there is need to add a playback pipeline macro even if the - component is meant only for capture direction, e.g. for a + Since the testbench currently only supports playback direction, a + need exists to add a playback pipeline macro even if the + component is meant only for capture direction, such as for a microphone processing component. diff --git a/developer_guides/testbench/test_audio_quality.rst b/developer_guides/testbench/test_audio_quality.rst index 847d7bab..15203e3a 100644 --- a/developer_guides/testbench/test_audio_quality.rst +++ b/developer_guides/testbench/test_audio_quality.rst @@ -1,40 +1,38 @@ .. _test-audio-quality: -Test audio quality +Test Audio Quality ################## -The directory tools/test/audio contains support for testing objective -audio quality parameters. The tests include e.g. gain, frequency -response (FR), dynamic range (DR), total harmonic distortion plus -noise (THD+N). The definitions can be found from Audio Engineering -Society's AES17 standard. +The ``tools/test/audio`` directory contains support for testing objective +audio quality parameters. The tests include gain, frequency response (FR), +dynamic range (DR), and total harmonic distortion plus noise (THD+N). +Definitions can be found in the Audio Engineering Society's AES17 standard. -There's need to have Octave or Matlab installed to execute the -tests. Matlab is commercial product by MathWorks. GNU Octave is a free -software tool and (nearly) same m-language compatible tool that can be -used to run the same scripts. Octave and useful toolboxes for audio -development can be installed with: +Install Octave or Matlab to execute the tests. Matlab is a commercial +product by MathWorks. GNU Octave is a free software tool that is mostly +compatible with Matlab. Install Octave and useful toolboxes for audio +development by entering the following: .. code-block:: bash sudo apt install octave octave-signal octave-control octave-io -Octave can be started to correct directory for tests with: +Start Octave from the correct directory for tests by entering the following: .. code-block:: bash cd tools/test/audio octave --gui & -From Octave shell the test script for IIR EQ component can be launched -for all support sample formats: +From the Octave shell, the test script for the IIR EQ component can be +launched for all support sample formats: .. code-block:: octave help process_test process_test('eqiir') -The end of test outputs a CSV format table for test results +The test outputs a CSV format table with test results such as the following: :: @@ -71,8 +69,8 @@ The end of test outputs a CSV format table for test results Number of non-applicable tests = 0 Number of skipped tests = 0 -The script is currently set up for batch processing in text console. To -enable graphics plot windows an edit can be done: +The script is currently set up for batch processing in the text console. To +enable graphics plot windows, edit the script to the following: .. code-block:: diff @@ -92,21 +90,18 @@ enable graphics plot windows an edit can be done: %% Prepare -When e.g. test for 24 bit to 24 bit output is executed with -process_test('eqiir', 24, 24) the following plots are generated. They -are useful to visually gain more insight about component's +When the example test for 24 bit to 24 bit output is executed with +process_test('eqiir', 24, 24), the following plots are generated. They +are useful to visually gain more insight into the component's characteristics. .. figure:: fig_process_test_eqiir.png Test results for EQ IIR component: Chirp spectrogram, THD+N frequency sweep, measured FR. - -For new components development when the test set is suitable, e.g. the -previous example "newcomp", this script needs small a addition. Also -there's need to create a newcomp_run.sh based on existing examples -found in the same directory. Also more customization can be done as -e.g. for re-defining the test pass/fail criteria for EQ components. +For new components development when the test set is suitable, such as the +previous example "newcomp", this script requires a small addition. A need exists to create a ``newcomp_run.sh`` script based on existing examples +found in the same directory. Additional customization can also be done such as re-defining the test pass/fail criteria for EQ components. .. code-block:: diff From 39f78e50783efd3d40c4e2985df3fe273701362a Mon Sep 17 00:00:00 2001 From: Karol Trzcinski Date: Thu, 4 Jun 2020 14:59:18 +0200 Subject: [PATCH 030/290] logger: Describe runtime logger trace filtration usage Each mechanism in logger tool chould be described in sof-dox. Signed-off-by: Karol Trzcinski --- .../debugability/logger/index.rst | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/developer_guides/debugability/logger/index.rst b/developer_guides/debugability/logger/index.rst index a80479b6..58c5d931 100644 --- a/developer_guides/debugability/logger/index.rst +++ b/developer_guides/debugability/logger/index.rst @@ -40,6 +40,7 @@ Usage sof-logger -f precision Set timestamp precision -g Hide timestamp -d Dump ldc information +-F filter Update trace filtering Examples: @@ -124,3 +125,90 @@ Examples: .. code-block:: bash sof-logger -l ldc_file -d + + +Trace filtering +*************** + +It's possible to change current logs level for any instance of component in +runtime. To do so, use `-F` option with following argument format: + + ="[, ]" + +Where ** is one of: + +- ``c`` / ``critical`` +- ``e`` / ``error`` +- ``w`` / ``warning`` +- ``i`` / ``info`` +- ``d`` / ``debug`` +- ``v`` / ``verbose`` + +After **=** character, there is a list of component, separated with comma. +Each components starts with *name* followed by optional part with *instance* +description. + +List of possible components names comes from UUID declaration, +see :ref:`uuid-api` for more detailed information. +Try use ``-d`` flag in logger to list component names from `ldc` file content. +Example output: + + .. code-block:: bash + + $./sof-logger -d log/sof-cnl.ldc + logger ABI Version is 5:2:0 + ldc_file ABI Version is 5:2:0 + + Components uuid dictionary size: 824 bytes + Components uuid base address: 0x1FFFA000 + Components uuid entries: + ADDRESS UUID NAME + 0x1FFFA000 <8b9d100c-6d78-418f-90a3-e0e805d0852b> host + 0x1FFFA01C pipe-task + 0x1FFFA03C <34dc0385-fc2f-4f7f-82d2-6cee444533e0> volume-task + 0x1FFFA05C volume + 0x1FFFA078 src + 0x1FFFA134 dai + -------------------------------------------------- cnt: 6 + +There is also a special wildcard - ``*`` - used to apply given trace +level to each component. + +Instance description may have one of the following form: + +- ``*`` - each component instance +- ``X.*`` - each component on selected pipeline *X* +- ``X.Y`` - component on pipeline *X* with id *Y* + +Trace levels changes works in same order as options given in command line, +and new set overwrites old value. It allows to easily enable verbose logs only +for selected components and keeping lowest possible log level (critical) for +others, example: + + sof-logger -l ldc_file -t -Fcritical=* -Fverbose="dai*, volume1.1" + +Similar example may be prepared for components on particular pipeline: + + sof-loggerr -l ldc_file -t -Fc=* -Fv=*1.* + + +Detailed description +-------------------- + +Filtration mechanism is realized on firmware side, so after change the log level +to verbose for each component, then DSP may be overhelmed by tracing. + +Core functionality is provided by DSP, so filtration does not work in offline +mode - during conversion previously saved input file. + +Communication between firmware and logger is realized through driver debug file +systems. +Logger writes to ``sys/kernel/debug/sof/filter`` new trace settings, +which will be used to create *IPC* message with new trace levels. +Simple text data format is used: + +``log1_level uuid1_id pipe1_id comp1_id; [log2_level uuid2_id pipe2_id comp2_id;]\n`` + +Unused uuid_id should be set here to 0, other unused fields should be set to -1. +``log_level`` always must be set to valid value - represents ``LOG_LEVEL_*`` +defines values. From d81b7a532e0ce2b65373b4c43dfac08dd1281454 Mon Sep 17 00:00:00 2001 From: Deb Taylor Date: Tue, 22 Sep 2020 00:01:41 -0400 Subject: [PATCH 031/290] Grammatical edits to debugability/logger/index Signed-off-by: Deb Taylor --- .../debugability/logger/index.rst | 53 +++++++++---------- 1 file changed, 25 insertions(+), 28 deletions(-) diff --git a/developer_guides/debugability/logger/index.rst b/developer_guides/debugability/logger/index.rst index 58c5d931..db19d11f 100644 --- a/developer_guides/debugability/logger/index.rst +++ b/developer_guides/debugability/logger/index.rst @@ -42,7 +42,8 @@ Usage sof-logger -d Dump ldc information -F filter Update trace filtering -Examples: +Examples +-------- - Gets traces from the "/sys/kernel/debug/sof/etrace" file; disable compatibility check between given ldc_file with fw_version saved in default location @@ -73,7 +74,7 @@ Examples: sof-logger -l ldc_file -o out_file -- Get traces from the "/sys/kernel/debug/sof/trace" file and prints logs to +- Get traces from the "/sys/kernel/debug/sof/trace" file and prints logs to stdout .. code-block:: bash @@ -130,12 +131,12 @@ Examples: Trace filtering *************** -It's possible to change current logs level for any instance of component in -runtime. To do so, use `-F` option with following argument format: +Current log levels can be changed for any instance of a component at +runtime. To do so, use the `-F` option and the following argument format: ="[, ]" -Where ** is one of: +Where ** can be one of the following: - ``c`` / ``critical`` - ``e`` / ``error`` @@ -144,13 +145,14 @@ Where ** is one of: - ``d`` / ``debug`` - ``v`` / ``verbose`` -After **=** character, there is a list of component, separated with comma. -Each components starts with *name* followed by optional part with *instance* +After the **=** character, all components are listed in a comma-separated +format. Each component begins with *name* followed by an optional *instance* description. -List of possible components names comes from UUID declaration, -see :ref:`uuid-api` for more detailed information. -Try use ``-d`` flag in logger to list component names from `ldc` file content. +The list of possible component names comes from the UUID declaration. +Refer to the :ref:`uuid-api` for more detailed information. Use the ``-d`` +flag in the logger to list component names from the ``ldc`` file content. + Example output: .. code-block:: bash @@ -171,23 +173,20 @@ Example output: 0x1FFFA134 dai -------------------------------------------------- cnt: 6 -There is also a special wildcard - ``*`` - used to apply given trace -level to each component. +A special wildcard - ``*`` - can be used to apply a given trace level to +each component. -Instance description may have one of the following form: +Instance descriptions can have one of the following forms: - ``*`` - each component instance - ``X.*`` - each component on selected pipeline *X* - ``X.Y`` - component on pipeline *X* with id *Y* -Trace levels changes works in same order as options given in command line, -and new set overwrites old value. It allows to easily enable verbose logs only -for selected components and keeping lowest possible log level (critical) for -others, example: +Trace level changes works in the same order as options given in a command line, and a new set overwrites old values. It allows you to easily enable verbose logs only for selected components and keep the lowest possible log level (critical) for others, as shown in the following example: sof-logger -l ldc_file -t -Fcritical=* -Fverbose="dai*, volume1.1" -Similar example may be prepared for components on particular pipeline: +A similar example may be prepared for components on a particular pipeline: sof-loggerr -l ldc_file -t -Fc=* -Fv=*1.* @@ -195,20 +194,18 @@ Similar example may be prepared for components on particular pipeline: Detailed description -------------------- -Filtration mechanism is realized on firmware side, so after change the log level -to verbose for each component, then DSP may be overhelmed by tracing. +Filtration mechanism is realized on the firmware side so, after changing the +log level to verbose for each component, the DSP may be overhelmed by +tracing. Core functionality is provided by DSP, so filtration does not work in offline mode - during conversion previously saved input file. -Communication between firmware and logger is realized through driver debug file -systems. -Logger writes to ``sys/kernel/debug/sof/filter`` new trace settings, -which will be used to create *IPC* message with new trace levels. -Simple text data format is used: +Communication between the firmware and logger is realized through driver +debug file systems. The logger writes new trace settings to ``sys/kernel/debug/sof/filter``. These will be used to create *IPC* messages with new +trace levels. A simple text data format is used: ``log1_level uuid1_id pipe1_id comp1_id; [log2_level uuid2_id pipe2_id comp2_id;]\n`` -Unused uuid_id should be set here to 0, other unused fields should be set to -1. -``log_level`` always must be set to valid value - represents ``LOG_LEVEL_*`` -defines values. +Any unused uuid_id should be set here to 0; other unused fields should be +set to -1. ``log_level`` must always be set to a valid value that represents ``LOG_LEVEL_*`` defined values. From b1b5248241ef6d0528ea0178fe34fac7fb541168 Mon Sep 17 00:00:00 2001 From: Joseph Burt Date: Fri, 25 Sep 2020 15:40:26 +0000 Subject: [PATCH 032/290] Add "--recurse-submodules" to git clone Fetch all the sources outside the container, avoiding possible proxy issues with pre-built docker images Signed-off-by: Joseph Burt --- getting_started/build-guide/build-with-docker.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/getting_started/build-guide/build-with-docker.rst b/getting_started/build-guide/build-with-docker.rst index 693d66a1..3dc49fdd 100644 --- a/getting_started/build-guide/build-with-docker.rst +++ b/getting_started/build-guide/build-with-docker.rst @@ -27,7 +27,7 @@ Clone the *sof* repo. .. code-block:: bash cd "$SOF_WORKSPACE" - git clone https://github.com/thesofproject/sof.git + git clone --recurse-submodules https://github.com/thesofproject/sof.git Set up Docker ************* From d7459e4ed942995ac62e71a8bb18a07626b5da68 Mon Sep 17 00:00:00 2001 From: Janusz Jankowski Date: Thu, 1 Oct 2020 14:21:51 +0200 Subject: [PATCH 033/290] developer guides: update components diagram Add COMP_STATE_INIT to the diagram. Signed-off-by: Janusz Jankowski --- developer_guides/firmware/components/component-overview.rst | 4 ++++ .../firmware/components/images/comp-dev-states.pu | 6 ++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/developer_guides/firmware/components/component-overview.rst b/developer_guides/firmware/components/component-overview.rst index 4a9c97a9..edfd4a50 100644 --- a/developer_guides/firmware/components/component-overview.rst +++ b/developer_guides/firmware/components/component-overview.rst @@ -83,6 +83,10 @@ Handle the component device state .. uml:: images/comp-dev-states.pu :caption: Component Device States +.. note:: + + COMP_STATE_SUSPEND is not used currently. + Refer to :c:func:`comp_set_state` in :ref:`component-api` for details. Implement the component API (comp_ops) diff --git a/developer_guides/firmware/components/images/comp-dev-states.pu b/developer_guides/firmware/components/images/comp-dev-states.pu index 8eda7e5a..7f9f4e3d 100644 --- a/developer_guides/firmware/components/images/comp-dev-states.pu +++ b/developer_guides/firmware/components/images/comp-dev-states.pu @@ -1,7 +1,9 @@ hide empty description -[*] -right-> COMP_STATE_READY : comp_ops.new() +[*] -right-> COMP_STATE_INIT : start of comp_ops.new() -COMP_STATE_READY -right-> COMP_STATE_PREPARE : COMP_TRIGGER_PREPARE +COMP_STATE_INIT --> COMP_STATE_READY : end of comp_ops.new() + +COMP_STATE_READY ---> COMP_STATE_PREPARE : COMP_TRIGGER_PREPARE COMP_STATE_PREPARE --> COMP_STATE_ACTIVE : COMP_TRIGGER_START From 2b4bc6748a55309a21545d557e1ee123d8b3dfcb Mon Sep 17 00:00:00 2001 From: Janusz Jankowski Date: Thu, 1 Oct 2020 12:57:34 +0200 Subject: [PATCH 034/290] cmake: FIRMWARE_NAME Add description for CMake's FIRMWARE_NAME argument. Signed-off-by: Janusz Jankowski --- developer_guides/firmware/cmake.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/developer_guides/firmware/cmake.rst b/developer_guides/firmware/cmake.rst index f457fb80..5230cc05 100644 --- a/developer_guides/firmware/cmake.rst +++ b/developer_guides/firmware/cmake.rst @@ -76,6 +76,14 @@ MEU_OPENSSL # Example cmake [...] -DMEU_OPENSSL=C:/path/to/openssl.exe [...] +FIRMWARE_NAME + Custom suffix for output binary. + + .. code-block:: bash + + # Example + cmake [...] -DFIRMWARE_NAME=custom [...] + Unit Tests ********** From de162847f398d0dd162381c6afd3d81f32ef3851 Mon Sep 17 00:00:00 2001 From: Janusz Jankowski Date: Thu, 1 Oct 2020 13:02:02 +0200 Subject: [PATCH 035/290] cmake: MEU_NO_SIGN Add description for CMake's MEU_NO_SIGN argument. Signed-off-by: Janusz Jankowski --- developer_guides/firmware/cmake.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/developer_guides/firmware/cmake.rst b/developer_guides/firmware/cmake.rst index 5230cc05..60824615 100644 --- a/developer_guides/firmware/cmake.rst +++ b/developer_guides/firmware/cmake.rst @@ -84,6 +84,15 @@ FIRMWARE_NAME # Example cmake [...] -DFIRMWARE_NAME=custom [...] +MEU_NO_SIGN + Flag that can be used to build unsigned FW binary, + that may be later used with MEU for signing. + + .. code-block:: bash + + # Example + cmake [...] -DMEU_NO_SIGN=ON [...] + Unit Tests ********** From cc3dc51f0c307b0f897cca245f695f9d64f6bde3 Mon Sep 17 00:00:00 2001 From: Janusz Jankowski Date: Thu, 1 Oct 2020 13:05:46 +0200 Subject: [PATCH 036/290] cmake: MEU_OFFSET Add description for CMake's MEU_OFFSET argument. Signed-off-by: Janusz Jankowski --- developer_guides/firmware/cmake.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/developer_guides/firmware/cmake.rst b/developer_guides/firmware/cmake.rst index 60824615..c943cad1 100644 --- a/developer_guides/firmware/cmake.rst +++ b/developer_guides/firmware/cmake.rst @@ -93,6 +93,15 @@ MEU_NO_SIGN # Example cmake [...] -DMEU_NO_SIGN=ON [...] +MEU_OFFSET + Default: determined by build-system, depends on MEU version. + Can be used to override MEU offset. + + .. code-block:: bash + + # Example + cmake [...] -DMEU_OFFSET=1344 [...] + Unit Tests ********** From d2d22e9ffafb5ba9e09fefe4b8dcf6735c9b6267 Mon Sep 17 00:00:00 2001 From: Deb Taylor Date: Tue, 13 Oct 2020 20:15:11 -0400 Subject: [PATCH 037/290] Updated master-slave references Signed-off-by: Deb Taylor --- architectures/dsp/intel/smp/index.rst | 4 ++-- .../linux_driver/architecture/sof_driver_arch.rst | 2 +- developer_guides/topology/topology.rst | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/architectures/dsp/intel/smp/index.rst b/architectures/dsp/intel/smp/index.rst index cf6e49d1..b3893da3 100644 --- a/architectures/dsp/intel/smp/index.rst +++ b/architectures/dsp/intel/smp/index.rst @@ -53,8 +53,8 @@ so ``struct core_context`` address can be read anytime at any place of the code. Communication between cores *************************** -Secondary core can communicate with primary cores by sending messages using -IDC mechanism. This mechanism is pretty much the same as IPC. +Primary core can communicate with secondary cores by sending messages using +the IDC mechanism. This mechanism is pretty much the same as IPC. Important data can be sent in two 32-bit IDC registers. Cores use interrupts to register for the incoming messages. diff --git a/developer_guides/linux_driver/architecture/sof_driver_arch.rst b/developer_guides/linux_driver/architecture/sof_driver_arch.rst index a71c2a1b..ced84861 100644 --- a/developer_guides/linux_driver/architecture/sof_driver_arch.rst +++ b/developer_guides/linux_driver/architecture/sof_driver_arch.rst @@ -105,7 +105,7 @@ SOF on both the host and the DSP serializes the sending of their IPC messages. T SPI === -IPC messages have the same structure as in the PCI case, but they are sent and received over an SPI bus. The SPI transfer is always initiated by the host. Therefore, the DSP cannot send asynchronous messages to the host using only the SPI bus. To overcome this limitation, an additional GPIO line is used by the DSP to trigger an interrupt on the host to request it to read out an IPC message. Support for such devices is still experimental in SOF. Details will be added later. +IPC messages have the same structure as in the PCI case, but they are sent and received over an SPI bus. The SPI transfer is always initiated by the SPI provider, which is the host. Therefore, the DSP cannot send asynchronous messages to the host using only the SPI bus. To overcome this limitation, an additional GPIO line is used by the DSP to trigger an interrupt on the host to request it to read out an IPC message. Support for such devices is still experimental in SOF. Details will be added later. iMX IPC ======= diff --git a/developer_guides/topology/topology.rst b/developer_guides/topology/topology.rst index 66441650..8ec582a3 100644 --- a/developer_guides/topology/topology.rst +++ b/developer_guides/topology/topology.rst @@ -260,7 +260,7 @@ macro: where: | **format**: is the SSP format ex: I2S or DSP_A or DSP_B etc -| **mclk**: main clock in Hz +| **mclk**: provider clock in Hz | **bclk**: bit clock in Hz | **fsync**: frame sync | **TDM**: TDM info including the slots, width, tx mask and rx mask From 1ed4eeed383d7962c73bf58adf152b5ff69e0460 Mon Sep 17 00:00:00 2001 From: Marc Herbert Date: Thu, 15 Oct 2020 00:08:24 +0000 Subject: [PATCH 038/290] conf.py: document deprecated add_stylesheet(). No functional change. Will help make any future decision. Signed-off-by: Marc Herbert --- conf.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/conf.py b/conf.py index 3d7b24cc..1ee0ff07 100644 --- a/conf.py +++ b/conf.py @@ -181,6 +181,8 @@ html_static_path = ['static'] def setup(app): +# add_stylesheet() was renamed to add_css_file() in sphinx 1.8 released +# in September 2018. add_stylesheet() will be removed in sphinx 4.0 app.add_stylesheet("sof-custom.css") # Custom sidebar templates, must be a dictionary that maps document names From 91c815ff11fd76ebf922e97f955e4291bde37ca5 Mon Sep 17 00:00:00 2001 From: Marc Herbert Date: Thu, 15 Oct 2020 00:09:20 +0000 Subject: [PATCH 039/290] travis: upgrade Ubuntu from LTS 18.04 to LTS 20.04 More aligned with users. Should make no difference to the officially supported and entirely hardcoded pip3 configuration. Will help prepare any future sphinx upgrade. Signed-off-by: Marc Herbert --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index b398a46a..bf708e63 100755 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,4 @@ -dist: bionic +dist: focal before_install: - sudo apt-get update -qq From 93207efb0f31dce8dcb3992240d1af29e6b7dde9 Mon Sep 17 00:00:00 2001 From: Marc Herbert Date: Thu, 15 Oct 2020 00:13:29 +0000 Subject: [PATCH 040/290] getting_started: add vital kernel links Due to the lack of these links, the very first time I read this section I assumed there was no other "kernel HOWTO" than this section elsewhere in sof-docs and I did not search for anything else. So I did obviously not find the pages linked to by this commit and I tried to figure everything on my own instead which probably caused my biggest waste of time when starting to work on SOF. No exaggeration. I'm not sure why the ktest section is placed under "Setting up SOF on hardware", maybe a different location for it would have helped me too. Anyway adding a couple links is much easier than moving sections around and a getting started guide is a good place for links to more advanced documentation in any case. This getting started guide has surprisingly few such links to more advanced topics. Signed-off-by: Marc Herbert --- conf.py | 2 ++ .../linux_driver/architecture/sof_driver_arch.rst | 2 +- getting_started/build-guide/build-from-scratch.rst | 10 ++++++++-- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/conf.py b/conf.py index 1ee0ff07..14969018 100644 --- a/conf.py +++ b/conf.py @@ -171,6 +171,8 @@ (SOF_GIT + '/sof/tree/master/%s', ""), 'git-sof-docs-mainline': (SOF_GIT + '/sof-docs/tree/master/%s', ""), + 'git-sof-kconfig': + (SOF_GIT + '/kconfig/tree/master/%s', ""), 'git-alsa': ('https://git.alsa-project.org/?p=%s.git', ""), } diff --git a/developer_guides/linux_driver/architecture/sof_driver_arch.rst b/developer_guides/linux_driver/architecture/sof_driver_arch.rst index ced84861..7b331b0c 100644 --- a/developer_guides/linux_driver/architecture/sof_driver_arch.rst +++ b/developer_guides/linux_driver/architecture/sof_driver_arch.rst @@ -315,7 +315,7 @@ The SOF HDMI/DP audio codec driver handles DP-MST audio streams transparently, a Kernel Configuration/Kconfig **************************** -Refer to the `README `_ file of the SOF kconfig `repository `_. +Refer to the :git-sof-kconfig:`README.md` file of the SOF kconfig repository. Debug Options ************* diff --git a/getting_started/build-guide/build-from-scratch.rst b/getting_started/build-guide/build-from-scratch.rst index e68bf138..5cc2daca 100644 --- a/getting_started/build-guide/build-from-scratch.rst +++ b/getting_started/build-guide/build-from-scratch.rst @@ -556,8 +556,14 @@ the target machine's /usr/bin directory. Build Linux kernel ****************** -|SOF| uses the Linux kernel dev branch, and it must work with other dev branch -firmware and topology. +|SOF| uses the Linux kernel dev branch, and it must work with other dev +branch firmware and topology. This short section shows how to build +Debian kernel packages tested on Ubuntu in a small number of commands. +However these commands rebuild everything from scratch every time which +makes then unsuitably slow for development. If you need to make kernel +code changes then ignore this and look at +:ref:`setup-ktest-environment`, the :git-sof-kconfig:`README.md` file of +the kconfig repo and the :ref:`sof_driver_arch`. #. Build the kernel with this branch. From ccc2f0503b0d1625dae9a325383d5fb4a9a9429f Mon Sep 17 00:00:00 2001 From: Deb Taylor Date: Fri, 16 Oct 2020 16:04:54 -0400 Subject: [PATCH 041/290] Corrected broken link for kconfig README doc. Signed-off-by: Deb Taylor --- .../linux_driver/architecture/sof_driver_arch.rst | 2 +- getting_started/build-guide/build-from-scratch.rst | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/developer_guides/linux_driver/architecture/sof_driver_arch.rst b/developer_guides/linux_driver/architecture/sof_driver_arch.rst index 7b331b0c..a307b1d7 100644 --- a/developer_guides/linux_driver/architecture/sof_driver_arch.rst +++ b/developer_guides/linux_driver/architecture/sof_driver_arch.rst @@ -315,7 +315,7 @@ The SOF HDMI/DP audio codec driver handles DP-MST audio streams transparently, a Kernel Configuration/Kconfig **************************** -Refer to the :git-sof-kconfig:`README.md` file of the SOF kconfig repository. +Refer to the `README `_ file of the SOF kconfig repository. Debug Options ************* diff --git a/getting_started/build-guide/build-from-scratch.rst b/getting_started/build-guide/build-from-scratch.rst index 5cc2daca..7bf133d9 100644 --- a/getting_started/build-guide/build-from-scratch.rst +++ b/getting_started/build-guide/build-from-scratch.rst @@ -559,11 +559,11 @@ Build Linux kernel |SOF| uses the Linux kernel dev branch, and it must work with other dev branch firmware and topology. This short section shows how to build Debian kernel packages tested on Ubuntu in a small number of commands. -However these commands rebuild everything from scratch every time which +Note that these commands rebuild everything from scratch every time which makes then unsuitably slow for development. If you need to make kernel -code changes then ignore this and look at -:ref:`setup-ktest-environment`, the :git-sof-kconfig:`README.md` file of -the kconfig repo and the :ref:`sof_driver_arch`. +code changes, ignore this and look at +:ref:`setup-ktest-environment`, the `README `_ file of +the kconfig repo, and the :ref:`sof_driver_arch`. #. Build the kernel with this branch. From 3a6230fe75d0752bf1aa09590dc59e8b02a15d95 Mon Sep 17 00:00:00 2001 From: Karol Trzcinski Date: Tue, 20 Oct 2020 14:03:24 +0200 Subject: [PATCH 042/290] intel: cavs: Update multicore dox after MAX_CORE_COUNT removing Synchronized with firmware version: 256c9343: ("smp: make MAX_CORE_COUNT an automatic Kconfig parameter") Signed-off-by: Karol Trzcinski --- .../commons/multicore-processing.rst | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/platforms/intel-cavs/commons/multicore-processing.rst b/platforms/intel-cavs/commons/multicore-processing.rst index c23e8263..d7c15e01 100644 --- a/platforms/intel-cavs/commons/multicore-processing.rst +++ b/platforms/intel-cavs/commons/multicore-processing.rst @@ -6,10 +6,12 @@ Multicore Processing Description *********** -|SOF| implements multicore processing in the way, that the whole pipelines are -executed on the selected core. Core selection is done by ``core`` field in -``struct sof_ipc_pipe_new`` during pipeline creation. Core value cannot exceed -number of cores on current platform defined by ``PLATFORM_MAX_CORE_COUNT``. +|SOF| implements multicore processing in the way, that the whole pipelines or +single components are executed on the selected core. +Core selection is done by ``core`` field in ``struct sof_ipc_pipe_new`` or +``struct sof_ipc_comp`` during creation. +Core value cannot exceed number of cores on current platform defined by +``CONFIG_MAX_CORE_COUNT``. .. code-block:: c @@ -27,6 +29,17 @@ number of cores on current platform defined by ``PLATFORM_MAX_CORE_COUNT``. uint32_t timer; } __attribute__((packed)); + struct sof_ipc_comp { + struct sof_ipc_cmd_hdr hdr; + uint32_t id; + enum sof_comp_type type; + uint32_t pipeline_id; + uint32_t core; + + /** extended data length, 0 if no extended data (ABI3.17) */ + uint32_t ext_data_length; + } __attribute__((packed)); + Core enablement *************** From 1b6cb01fcc50967f74d5ed3e21c9e28d12afe655 Mon Sep 17 00:00:00 2001 From: Pierre-Louis Bossart Date: Thu, 15 Oct 2020 15:31:56 -0500 Subject: [PATCH 043/290] getting_started: add debug information for users/distros Rather than provide the same guidance over and over in GitHub issues, write down a set of suggestions to help users/distros solve their issues or report issues with more information. Signed-off-by: Pierre-Louis Bossart --- getting_started/index.rst | 13 ++ getting_started/intel_debug/introduction.rst | 132 +++++++++++++++++++ getting_started/intel_debug/suggestions.rst | 114 ++++++++++++++++ 3 files changed, 259 insertions(+) create mode 100644 getting_started/intel_debug/introduction.rst create mode 100644 getting_started/intel_debug/suggestions.rst diff --git a/getting_started/index.rst b/getting_started/index.rst index b7a170d4..b9cb302a 100644 --- a/getting_started/index.rst +++ b/getting_started/index.rst @@ -32,3 +32,16 @@ instructions may differ between devices. setup/setup_minnowboard_turbot setup/setup_up_2_board setup/setup_ktest_environment + +Debugging Audio issues on Intel platforms +***************************************** + +Intel platforms rely on different versions of DSP and audio hardware +interfaces, the following sections provide hints for integrators and +users when 'audio is broken' + +.. toctree:: + :maxdepth: 1 + + intel_debug/introduction + intel_debug/suggestions diff --git a/getting_started/intel_debug/introduction.rst b/getting_started/intel_debug/introduction.rst new file mode 100644 index 00000000..10b0abda --- /dev/null +++ b/getting_started/intel_debug/introduction.rst @@ -0,0 +1,132 @@ +.. _intel_debug_introduction: + +Overview of Intel hardware platforms +#################################### + +.. contents:: + :local: + :depth: 3 + +ACPI platforms (introduced until 2015) +************************************** + +On Baytrail, Cherrytrail, Braswell, Broadwell (also referred to as +'legacy devices'), the DSP enumeration is handled by the ACPI +subsystem. + +1. Local audio accessories (mics, speakers, headset) +---------------------------------------------------- + +On Baytrail, Cherrytrail, Braswell, Broadwell, the BIOS can either: + +* Enable the DSP. In this case, a DSP driver is required. This mode is selected on platforms where the audio interface for 3rd-party codecs is based on the I2C/I2S/TDM interfaces. + +* Disable the DSP. In this case, an HDaudio controller is exposed and the 'snd-intel-hda' driver will take care of all audio usages. SOF cannot be used in this case. + + +2. HDMI/DP interfaces +--------------------- + +On Broadwell, HDMI/DP is handled by an HDaudio controller. + +On Baytrail/Cherrytrail, Braswell, the BIOS can enable two modes: + +* HDAudio-based solution (similar to Broadwell) + +* 'LPE HDMI Audio'. This mode is used by the majority of tablets and low-cost devices. It provides functionality similar to HDaudio, but with a different interfaces. This mode is enabled in Linux with the CONFIG_HDMI_LPE_AUDIO option. + +The DSP cannot control any of these interfaces, as a result SOF does +not support HDMI/DP on those devices. + +On all these 'legacy' platforms, the HDMI support is exposed in Linux +as a separate card. + +PCI devices (introduced after 2016) +*********************************** + +In newer devices, the same HDAudio controller can handle both local +accessories and HDMI/DP interfaces. SOF is however not always +supported on those platforms. + +When the Intel DSP is not enabled in the BIOS (OEM choice), the audio +interfaces are handled by the snd-hda-intel driver. The platform only +exposes PCM devices and no audio processing capabilities. + +When the OEM platforms integrate digital microphones attached directly +to the Intel chipset (aka DMIC), use I2C/I2S interfaces or SoundWire +interfaces, the DSP must be enabled by the BIOS. There is however one +more option. + +On Skylake and Kabylake platforms, the Intel DSP is handled by the +snd-soc-skl module which relies on closed-source firmware. + +SOF is available on Intel PCI devices starting with GeminiLake, and +has seen been the only solution provided by Intel for following +platforms (CometLake, IceLake, TigerLake, etc). + +Since multiple drivers can register for the same PCI ID, it was until +recently not uncommon for users and distributions to use the 'wrong' +driver, which could only be solved by changing the Linux .config file +or deselecting drivers in /etc/modprobe.d configuration files. + +The 'snd-intel-dspcfg' module introduced in early 2020 exposes an API +used by all drivers, and the user can override default choices by +setting the 'dsp_driver' parameter. For example settting + +.. code-block:: + + options snd-intel-dspcfg dsp_driver=1 + +will for the HDaudio legacy driver to be used. This will typically +work for speakers and headphone/headset, but will not allow DMIC +capture. + +Conversely, when a platform does not require a DSP-based platform, but +where the DSP is still enabled by the OEM, the user or integration can +force the SOF Linux driver to be used. + +.. code-block:: + + options snd-intel-dspcfg dsp_driver=3 + + +User-space and filesystem requirements +************************************** + +Selecting the SOF driver is not enough in itself. Audio will only be +properly configured if the following elements are present on the file +system. + +1. firmware binary +------------------ + +The firmware file, e.g. /lib/firmware/intel/sof/sof-tgl.ri, contains +all the DSP code and tables. On PCI devices, the firmware can only be +signed by an Intel production key which prevents community users from +installing their own firmware. Notable exceptions include Google +Chromebooks and Up2/Up-Extreme boards, where the 'community key' is +used. + +2. topology file +---------------- + +The topology file, +e.g. /lib/firmware/intel/sof-tplg/sof-hda-generic-2ch.tplg, describes +the processing graph and controls to be instantiated by the SOF +driver. The topology can be regenerated and reconfigured with tools +but requires expert knowledge of ALSA/ASoC/topology frameworks. + +3. UCM file +----------- + +The UCM file, e.g. /usr/share/alsa/ucm2/sof-hda-dsp/..., configures +the controls exposed by the topology file and the external audio +chips. UCM can be used in a terminal with the 'alsaucm' command but +will typically be used by audio servers such as PulseAudio or +PipeWire. UCM files released by Intel are compatible between different +drivers and should work when changing the 'dsp_driver' parameter. + +The selection of firmware, topology and UCM files is based on platform +capabilities, codec names, DMI options. While the SOF team and the +community try to cover all possible cases, errors will happen with the +wrong file selected at any of the three layers. diff --git a/getting_started/intel_debug/suggestions.rst b/getting_started/intel_debug/suggestions.rst new file mode 100644 index 00000000..0f4adfc4 --- /dev/null +++ b/getting_started/intel_debug/suggestions.rst @@ -0,0 +1,114 @@ +.. _debug_suggestions: + +Suggestions before filing an SOF bug +#################################### + +.. contents:: + :local: + :depth: 3 + +Run 'alsa-info' +*************** + +The 'alsa-info' script extracts a lot of information from the platform +(PCI ids, ACPI ids, DMI, controls, dmesg) and will help the SOF team +understand which hardware and OEM configuration is used. 'alsa-info' +can upload the results to a server, providing the link is very useful +when filing a bug. + +Disable SOF on PCI/HDaudio devices to test audio playback +********************************************************* + +When audio issues occur, the first is to check if the HDaudio legacy +is able to generate sound on speakers and headsets. This can be +accomplished by e.g. adding "options snd-intel-dspcfg dsp_driver=1" to +/etc/modprobe.d/alsa-base.conf. + +If no sound can be heard and jack detection is not functional, an +HDaudio external codec configuration is likely. In some cases, the +Linux drivers are missing configuration information and may e.g. only +enable 2 of the 4 speakers present. All of these cases are orthogonal +to SOF issues, i.e. the SOF driver cannot compensate for codec driver +problems on its own. + +Test at the ALSA 'hw' device level +********************************** + +When the legacy HDaudio driver produces audible sound without +distorsion and an SOF-based solution does not, userspace configuration +issues are possible. + +The following commands can be used to check if the SOF driver is +functional at the 'hardware device' level: + +.. code-block:: + + speaker-test -Dhw:0,0 -c2 -r48000 -f S16_LE + arecord -Dhw:0,0 -c2 -r48000 -f S16_LE -d 10 test.wav + +The card and device indices may need to be adjusted on different +platforms, use 'aplay -l' and 'arecord -l' to see supported values on +your platform. + +If playback or capture seem ok at the hw: device level, then the +following packages may need to be updated: + +- alsa-lib +- alsa-ucm-conf +- pulseaudio + +Verify mixer settings +********************* + +A classic issue with Linux audio is that a mixer control value remains +muted or with a volume set to zero. The 'alsamixer' command can be +used to check if any paths are disabled (represented as "m") or if the +volume settings not correct. + +Note that randomly playing with ALSA mixer settings can damage audio +accessories, speakers or your hearing. Never ever change mixer +settings while listening to loud music on a headset! + +Enable dynamic debug +******************** + +To avoid spamming all Linux users with audio-specific information, +only critical errors are reported in the dmesg log. That information +may not be enough to debug a specific issue, and the recommendation is +to add the following options to an /etc/modprobe.d/sof-dyndbg.conf +file + +.. code-block:: + + options snd_sof_intel_byt dyndbg=+p + options snd_sof_intel_bdw dyndbg=+p + options snd_sof_intel_ipc dyndbg=+p + options snd_sof_intel_hda_common dyndbg=+p + options snd_sof_intel_hda dyndbg=+p + options snd_sof dyndbg=+p + options snd_sof_pci dyndbg=+p + options snd_sof_acpi dyndbg=+p + options snd_sof_of dyndbg=+p + options snd_sof_nocodec dyndbg=+p + options soundwire_bus dyndbg=+p + options soundwire_generic_allocation dyndbg=+p + options soundwire_cadence dyndbg=+p + options soundwire_intel_init dyndbg=+p + options soundwire_intel dyndbg=+p + options snd_soc_skl_hda_dsp dyndbg=+p + options snd_intel_dspcfg dyndbg=+p + +This list is only an example. + +Install sof-logger +****************** + +If an issue with the SOF firmware is reported, such as IPC errors, SOF +developers will need DSP traces. This is typically done by installing +/usr/local/bin/sof-logger as well as the .ldc file, and using the +following command to extract DSP traces. + + +.. code-block::bash + + sof-logger -t sof-tgl.ldc From f27e95a8f5846aab576e2a9c7b8c7ddb5117b18f Mon Sep 17 00:00:00 2001 From: Deb Taylor Date: Tue, 20 Oct 2020 12:06:58 -0400 Subject: [PATCH 044/290] Minor grammatical edits on multicore doc. Signed-off-by: Deb Taylor --- .../commons/multicore-processing.rst | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/platforms/intel-cavs/commons/multicore-processing.rst b/platforms/intel-cavs/commons/multicore-processing.rst index d7c15e01..459c8d05 100644 --- a/platforms/intel-cavs/commons/multicore-processing.rst +++ b/platforms/intel-cavs/commons/multicore-processing.rst @@ -1,17 +1,16 @@ .. _platforms-intel-cavs-multicore: -Multicore Processing +Multicore Processing #################### Description *********** -|SOF| implements multicore processing in the way, that the whole pipelines or -single components are executed on the selected core. -Core selection is done by ``core`` field in ``struct sof_ipc_pipe_new`` or -``struct sof_ipc_comp`` during creation. -Core value cannot exceed number of cores on current platform defined by -``CONFIG_MAX_CORE_COUNT``. +|SOF| implements multicore processing so that the whole pipelines or single +components are executed on the selected core. The core selection is done by +the ``core`` field in ``struct sof_ipc_pipe_new`` or ``struct sof_ipc_comp`` +during creation. The core value cannot exceed the number of cores on the +current platform defined by ``CONFIG_MAX_CORE_COUNT``. .. code-block:: c @@ -43,9 +42,10 @@ Core value cannot exceed number of cores on current platform defined by Core enablement *************** -Cores are enabled and disabled by sending ``SOF_IPC_PM_CORE_ENABLE`` IPC with -the right ``enable_mask``. Core needs to be enabled **before pipeline trigger -start happens** and disabled **after pipeline trigger stop**. +Cores are enabled and disabled by sending the ``SOF_IPC_PM_CORE_ENABLE`` IPC +with the correct ``enable_mask``. The core must be enabled **before the +pipeline trigger start happens** and disabled **after the pipeline trigger +stop**. .. code-block:: c @@ -56,6 +56,6 @@ start happens** and disabled **after pipeline trigger stop**. .. uml:: images/core-enable.pu -.. note:: Kernel also needs to enable cores on host side, before even sending - ``SOF_IPC_PM_CORE_ENABLE`` IPC to FW. +.. note:: The kernel also needs to enable cores on the host side, before + even sending the ``SOF_IPC_PM_CORE_ENABLE`` IPC to the FW. From 2ed573e72a92711acf8777b137a549c520f099d6 Mon Sep 17 00:00:00 2001 From: Deb Taylor Date: Tue, 20 Oct 2020 14:24:24 -0400 Subject: [PATCH 045/290] Minor grammatical edits to debug docs Signed-off-by: Deb Taylor --- getting_started/index.rst | 4 +- getting_started/intel_debug/introduction.rst | 107 +++++++++---------- getting_started/intel_debug/suggestions.rst | 52 +++++---- 3 files changed, 78 insertions(+), 85 deletions(-) diff --git a/getting_started/index.rst b/getting_started/index.rst index b9cb302a..88d320fb 100644 --- a/getting_started/index.rst +++ b/getting_started/index.rst @@ -37,8 +37,8 @@ Debugging Audio issues on Intel platforms ***************************************** Intel platforms rely on different versions of DSP and audio hardware -interfaces, the following sections provide hints for integrators and -users when 'audio is broken' +interfaces. The following sections provide hints for integrators and +users when audio components are not working properly or are broken. .. toctree:: :maxdepth: 1 diff --git a/getting_started/intel_debug/introduction.rst b/getting_started/intel_debug/introduction.rst index 10b0abda..8129bfef 100644 --- a/getting_started/intel_debug/introduction.rst +++ b/getting_started/intel_debug/introduction.rst @@ -3,25 +3,24 @@ Overview of Intel hardware platforms #################################### -.. contents:: - :local: - :depth: 3 +ACPI platforms (introduced before and up to 2015) +************************************************* -ACPI platforms (introduced until 2015) -************************************** - -On Baytrail, Cherrytrail, Braswell, Broadwell (also referred to as -'legacy devices'), the DSP enumeration is handled by the ACPI +On Baytrail, Cherrytrail, Braswell, and Broadwell devices (also referred to +as `legacy` devices), the DSP enumeration is handled by the ACPI subsystem. 1. Local audio accessories (mics, speakers, headset) ---------------------------------------------------- -On Baytrail, Cherrytrail, Braswell, Broadwell, the BIOS can either: +On Baytrail, Cherrytrail, Braswell, and Broadwell, the BIOS can either +enable or disable the DSP: -* Enable the DSP. In this case, a DSP driver is required. This mode is selected on platforms where the audio interface for 3rd-party codecs is based on the I2C/I2S/TDM interfaces. +* Enable the DSP. In this case, a DSP driver is required. This mode is + selected on platforms where the audio interface for 3rd-party codecs is based on the I2C/I2S/TDM interfaces. -* Disable the DSP. In this case, an HDaudio controller is exposed and the 'snd-intel-hda' driver will take care of all audio usages. SOF cannot be used in this case. +* Disable the DSP. In this case, an HDaudio controller is exposed and the + ``snd-intel-hda`` driver will take care of all audio usages. SOF cannot be used in this case. 2. HDMI/DP interfaces @@ -29,60 +28,59 @@ On Baytrail, Cherrytrail, Braswell, Broadwell, the BIOS can either: On Broadwell, HDMI/DP is handled by an HDaudio controller. -On Baytrail/Cherrytrail, Braswell, the BIOS can enable two modes: +On Baytrail/Cherrytrail and Braswell, the BIOS can enable two modes: * HDAudio-based solution (similar to Broadwell) -* 'LPE HDMI Audio'. This mode is used by the majority of tablets and low-cost devices. It provides functionality similar to HDaudio, but with a different interfaces. This mode is enabled in Linux with the CONFIG_HDMI_LPE_AUDIO option. +* LPE HDMI Audio. This mode is used by the majority of tablets and low-cost + devices. It provides functionality similar to HDaudio, but with a different interface. This mode is enabled in Linux via the ``CONFIG_HDMI_LPE_AUDIO option``. -The DSP cannot control any of these interfaces, as a result SOF does -not support HDMI/DP on those devices. +The DSP cannot control any of these interfaces because SOF does not support +HDMI/DP on those devices. -On all these 'legacy' platforms, the HDMI support is exposed in Linux -as a separate card. +On all of these `legacy` platforms, HDMI support is exposed in Linux as a +separate card. PCI devices (introduced after 2016) *********************************** In newer devices, the same HDAudio controller can handle both local -accessories and HDMI/DP interfaces. SOF is however not always +accessories and HDMI/DP interfaces. However, SOF is not always supported on those platforms. -When the Intel DSP is not enabled in the BIOS (OEM choice), the audio -interfaces are handled by the snd-hda-intel driver. The platform only +When the Intel DSP is not enabled in the BIOS (OEM choice), audio +interfaces are handled by the ``snd-hda-intel`` driver. The platform only exposes PCM devices and no audio processing capabilities. -When the OEM platforms integrate digital microphones attached directly -to the Intel chipset (aka DMIC), use I2C/I2S interfaces or SoundWire -interfaces, the DSP must be enabled by the BIOS. There is however one -more option. - -On Skylake and Kabylake platforms, the Intel DSP is handled by the -snd-soc-skl module which relies on closed-source firmware. +When OEM platforms integrate digital microphones attached directly +to the Intel chipset (aka DMIC), or they use I2C/I2S or SoundWire +interfaces, the DSP must be enabled by the BIOS. There is, however, one +more option. On Skylake and Kabylake platforms, the Intel DSP is handled by +the ``snd-soc-skl`` module which relies on closed-source firmware. SOF is available on Intel PCI devices starting with GeminiLake, and -has seen been the only solution provided by Intel for following -platforms (CometLake, IceLake, TigerLake, etc). +has since been the only solution provided by Intel for the following +platforms: CometLake, IceLake, and TigerLake. -Since multiple drivers can register for the same PCI ID, it was until -recently not uncommon for users and distributions to use the 'wrong' -driver, which could only be solved by changing the Linux .config file -or deselecting drivers in /etc/modprobe.d configuration files. +Since multiple drivers can register for the same PCI ID, it was (until +recently) common for users and distributions to use the wrong +driver, which could only be resolved by changing the Linux ``.config`` file +or deselecting drivers in the ``/etc/modprobe.d`` configuration files. -The 'snd-intel-dspcfg' module introduced in early 2020 exposes an API -used by all drivers, and the user can override default choices by -setting the 'dsp_driver' parameter. For example settting +The ``snd-intel-dspcfg`` module introduced in early 2020 exposes an API +used by all drivers, and the user can now override default choices by +setting the ``dsp_driver`` parameter. For example, setting .. code-block:: options snd-intel-dspcfg dsp_driver=1 -will for the HDaudio legacy driver to be used. This will typically -work for speakers and headphone/headset, but will not allow DMIC +will allow for the HDaudio legacy driver to be used. This will typically +work for speakers and headphones/headsets, but will not allow DMIC capture. Conversely, when a platform does not require a DSP-based platform, but -where the DSP is still enabled by the OEM, the user or integration can +the DSP is still enabled by the OEM, the user or integration can force the SOF Linux driver to be used. .. code-block:: @@ -90,28 +88,27 @@ force the SOF Linux driver to be used. options snd-intel-dspcfg dsp_driver=3 -User-space and filesystem requirements +User space and filesystem requirements ************************************** -Selecting the SOF driver is not enough in itself. Audio will only be -properly configured if the following elements are present on the file -system. +Selecting the SOF driver is not enough. Audio properly configured only if +the following elements are present on the file system. -1. firmware binary +1. Firmware binary ------------------ -The firmware file, e.g. /lib/firmware/intel/sof/sof-tgl.ri, contains +The firmware file, ``/lib/firmware/intel/sof/sof-tgl.ri``, contains all the DSP code and tables. On PCI devices, the firmware can only be signed by an Intel production key which prevents community users from installing their own firmware. Notable exceptions include Google Chromebooks and Up2/Up-Extreme boards, where the 'community key' is used. -2. topology file +2. Topology file ---------------- The topology file, -e.g. /lib/firmware/intel/sof-tplg/sof-hda-generic-2ch.tplg, describes +such as ``/lib/firmware/intel/sof-tplg/sof-hda-generic-2ch.tplg``, describes the processing graph and controls to be instantiated by the SOF driver. The topology can be regenerated and reconfigured with tools but requires expert knowledge of ALSA/ASoC/topology frameworks. @@ -119,14 +116,14 @@ but requires expert knowledge of ALSA/ASoC/topology frameworks. 3. UCM file ----------- -The UCM file, e.g. /usr/share/alsa/ucm2/sof-hda-dsp/..., configures +The UCM file, such as ``/usr/share/alsa/ucm2/sof-hda-dsp/``..., configures the controls exposed by the topology file and the external audio -chips. UCM can be used in a terminal with the 'alsaucm' command but +chips. UCM can be used in a terminal via the ``alsaucm`` command but will typically be used by audio servers such as PulseAudio or -PipeWire. UCM files released by Intel are compatible between different -drivers and should work when changing the 'dsp_driver' parameter. +PipeWire. UCM files released by Intel are compatible with different +drivers and should work when changing the ``dsp_driver`` parameter. -The selection of firmware, topology and UCM files is based on platform -capabilities, codec names, DMI options. While the SOF team and the -community try to cover all possible cases, errors will happen with the -wrong file selected at any of the three layers. +The selection of firmware, topology, and UCM files is based on platform +capabilities, codec names, and DMI options. While the SOF team and the +community try to cover all possible cases, errors will happen when the +wrong file is selected at any of the three layers. \ No newline at end of file diff --git a/getting_started/intel_debug/suggestions.rst b/getting_started/intel_debug/suggestions.rst index 0f4adfc4..52058861 100644 --- a/getting_started/intel_debug/suggestions.rst +++ b/getting_started/intel_debug/suggestions.rst @@ -3,43 +3,39 @@ Suggestions before filing an SOF bug #################################### -.. contents:: - :local: - :depth: 3 +Run alsa-info +************* -Run 'alsa-info' -*************** - -The 'alsa-info' script extracts a lot of information from the platform -(PCI ids, ACPI ids, DMI, controls, dmesg) and will help the SOF team -understand which hardware and OEM configuration is used. 'alsa-info' -can upload the results to a server, providing the link is very useful +The ``alsa-info`` script extracts a lot of information from the platform +(PCI ids, ACPI ids, DMI, controls, dmesg) that will help the SOF team +understand which hardware and OEM configuration is used. ``alsa-info`` +can upload the results to a server; providing the link is very useful when filing a bug. Disable SOF on PCI/HDaudio devices to test audio playback ********************************************************* -When audio issues occur, the first is to check if the HDaudio legacy +When audio issues occur, the first step is to check if the HDaudio legacy is able to generate sound on speakers and headsets. This can be -accomplished by e.g. adding "options snd-intel-dspcfg dsp_driver=1" to -/etc/modprobe.d/alsa-base.conf. +accomplished by adding "options snd-intel-dspcfg dsp_driver=1" to +``/etc/modprobe.d/alsa-base.conf``. If no sound can be heard and jack detection is not functional, an HDaudio external codec configuration is likely. In some cases, the -Linux drivers are missing configuration information and may e.g. only -enable 2 of the 4 speakers present. All of these cases are orthogonal -to SOF issues, i.e. the SOF driver cannot compensate for codec driver +Linux drivers are missing configuration information and may only +enable two of the four speakers present. All of these cases are orthogonal +to SOF issues in that the SOF driver cannot compensate for codec driver problems on its own. Test at the ALSA 'hw' device level ********************************** When the legacy HDaudio driver produces audible sound without -distorsion and an SOF-based solution does not, userspace configuration +distortion and an SOF-based solution does not, user space configuration issues are possible. The following commands can be used to check if the SOF driver is -functional at the 'hardware device' level: +functional at the hardware device level: .. code-block:: @@ -47,10 +43,10 @@ functional at the 'hardware device' level: arecord -Dhw:0,0 -c2 -r48000 -f S16_LE -d 10 test.wav The card and device indices may need to be adjusted on different -platforms, use 'aplay -l' and 'arecord -l' to see supported values on +platforms: use ``aplay -l`` and ``arecord -l`` to see supported values on your platform. -If playback or capture seem ok at the hw: device level, then the +If the playback or capture seems ok at the hardware device level, then the following packages may need to be updated: - alsa-lib @@ -61,21 +57,21 @@ Verify mixer settings ********************* A classic issue with Linux audio is that a mixer control value remains -muted or with a volume set to zero. The 'alsamixer' command can be +muted or with a volume set to zero. The ``alsamixer`` command can be used to check if any paths are disabled (represented as "m") or if the volume settings not correct. Note that randomly playing with ALSA mixer settings can damage audio -accessories, speakers or your hearing. Never ever change mixer +accessories, speakers, or your hearing. Never change mixer settings while listening to loud music on a headset! Enable dynamic debug ******************** To avoid spamming all Linux users with audio-specific information, -only critical errors are reported in the dmesg log. That information +only critical errors are reported in the ``dmesg`` log. That information may not be enough to debug a specific issue, and the recommendation is -to add the following options to an /etc/modprobe.d/sof-dyndbg.conf +to add the following options to the ``/etc/modprobe.d/sof-dyndbg.conf`` file .. code-block:: @@ -98,17 +94,17 @@ file options snd_soc_skl_hda_dsp dyndbg=+p options snd_intel_dspcfg dyndbg=+p -This list is only an example. +Note that this list is only an example. Install sof-logger ****************** If an issue with the SOF firmware is reported, such as IPC errors, SOF developers will need DSP traces. This is typically done by installing -/usr/local/bin/sof-logger as well as the .ldc file, and using the -following command to extract DSP traces. +``/usr/local/bin/sof-logger`` as well as the ``.ldc`` file, and using the +following command to extract DSP traces: -.. code-block::bash +.. code-block:: bash sof-logger -t sof-tgl.ldc From cd26749f4dfb8244a93d90a75e859fda705cd714 Mon Sep 17 00:00:00 2001 From: Karol Trzcinski Date: Tue, 20 Oct 2020 13:23:47 +0200 Subject: [PATCH 046/290] logger: filtering: Add note about verbose firmware build Logger can't show trace removed during compilation time, add note with this information. Signed-off-by: Karol Trzcinski --- developer_guides/debugability/logger/index.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/developer_guides/debugability/logger/index.rst b/developer_guides/debugability/logger/index.rst index db19d11f..1d6c1fa5 100644 --- a/developer_guides/debugability/logger/index.rst +++ b/developer_guides/debugability/logger/index.rst @@ -190,6 +190,9 @@ A similar example may be prepared for components on a particular pipeline: sof-loggerr -l ldc_file -t -Fc=* -Fv=*1.* +.. note:: + To track verbose message use firmware build with selected "Trace verbose" + option under "Trace" menu. Detailed description -------------------- From d8c79a037654afb45457f3a41fbf9479cf6963c1 Mon Sep 17 00:00:00 2001 From: Karol Trzcinski Date: Tue, 20 Oct 2020 13:25:30 +0200 Subject: [PATCH 047/290] logger: filter: Warn about power gating and filter reset This may be not obvious for filter user, that keeping settings in firmware runtime memory is related with settings reset after firmware reboot on power gating. Signed-off-by: Karol Trzcinski --- developer_guides/debugability/logger/index.rst | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/developer_guides/debugability/logger/index.rst b/developer_guides/debugability/logger/index.rst index 1d6c1fa5..090824ca 100644 --- a/developer_guides/debugability/logger/index.rst +++ b/developer_guides/debugability/logger/index.rst @@ -194,6 +194,23 @@ A similar example may be prepared for components on a particular pipeline: To track verbose message use firmware build with selected "Trace verbose" option under "Trace" menu. +Active trace filters are stored in firmware runtime memory, so after firmware +restart (eg. after power gating in sleep mode) filters settings will be reset. +Consider disabling power gating during your debug session. +It may be done by: + +.. code:: bash + + sudo su + echo on >/sys/devices/pci0000\:00/0000\:$(lspci -nn | grep "audio contoller" | awk '{print $1;}')/power/control + +.. note:: + Current device power status may be read by this command: + + .. code:: bash + + cat /sys/devices/pci0000\:00/0000\:$(lspci -nn | grep "audio controller" | awk '{print $1;}')/power/runtime_status + Detailed description -------------------- From a37279326f62a3ab6a6af184b421a36eea7680f9 Mon Sep 17 00:00:00 2001 From: Karol Trzcinski Date: Tue, 20 Oct 2020 13:30:48 +0200 Subject: [PATCH 048/290] logger: filter: Add note that already sent traces won't be filtered. Filtering mechanism works mainly on firmware side, so only upcoming traces will be affected new filtering settings. Signed-off-by: Karol Trzcinski --- developer_guides/debugability/logger/index.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/developer_guides/debugability/logger/index.rst b/developer_guides/debugability/logger/index.rst index 090824ca..8caabd3a 100644 --- a/developer_guides/debugability/logger/index.rst +++ b/developer_guides/debugability/logger/index.rst @@ -211,6 +211,9 @@ It may be done by: cat /sys/devices/pci0000\:00/0000\:$(lspci -nn | grep "audio controller" | awk '{print $1;}')/power/runtime_status +Logger trace filtration affect only traces sent after filter setup, so traces +already stored on kernel side will not be affected. + Detailed description -------------------- From 9da6dce203ce14961bfe2a4a515b33a3f42c6d0d Mon Sep 17 00:00:00 2001 From: Karol Trzcinski Date: Thu, 22 Oct 2020 10:00:19 +0200 Subject: [PATCH 049/290] logerer: filter: Describe filters behavior for multiple logger runs Noticeable consequence of keeping active filter state in firmware, is keeping old setup during logger reset. Signed-off-by: Karol Trzcinski --- developer_guides/debugability/logger/index.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/developer_guides/debugability/logger/index.rst b/developer_guides/debugability/logger/index.rst index 8caabd3a..68ac83a2 100644 --- a/developer_guides/debugability/logger/index.rst +++ b/developer_guides/debugability/logger/index.rst @@ -214,6 +214,11 @@ It may be done by: Logger trace filtration affect only traces sent after filter setup, so traces already stored on kernel side will not be affected. +Filters are setup incrementally, so when logger will be run-up twice with +different settings, then filters from first run will not be restored to default +state but can be replaced by new one. +To reset filters to default state, firmware reset is needed. + Detailed description -------------------- From 605a402468ddd41675b650974cdaf18206051684 Mon Sep 17 00:00:00 2001 From: Seppo Ingalsuo Date: Mon, 21 Sep 2020 19:21:47 +0300 Subject: [PATCH 050/290] Algorithms: Add TDFB beamformer documentation This patch adds documentation for setting up the TDFB component with various microphone arrays. Signed-off-by: Seppo Ingalsuo --- algos/index.rst | 3 +- algos/tdfb/beamformer_delay_and_sum.png | Bin 0 -> 44802 bytes algos/tdfb/circular_array.png | Bin 0 -> 50752 bytes algos/tdfb/circular_di.png | Bin 0 -> 41751 bytes algos/tdfb/circular_filters.png | Bin 0 -> 29693 bytes algos/tdfb/circular_polar.png | Bin 0 -> 41343 bytes algos/tdfb/circular_spatial.png | Bin 0 -> 76303 bytes algos/tdfb/circular_wng.png | Bin 0 -> 42962 bytes algos/tdfb/line_array.png | Bin 0 -> 39169 bytes algos/tdfb/lshape_array.png | Bin 0 -> 50491 bytes algos/tdfb/lshape_array_rot.png | Bin 0 -> 49936 bytes algos/tdfb/rectangular_array.png | Bin 0 -> 51032 bytes algos/tdfb/time_domain_fixed_beamformer.rst | 578 ++++++++++++++++++++ algos/tdfb/two_beams_left.png | Bin 0 -> 42145 bytes algos/tdfb/two_beams_right.png | Bin 0 -> 41925 bytes algos/tdfb/xyz_array.png | Bin 0 -> 40089 bytes 16 files changed, 580 insertions(+), 1 deletion(-) create mode 100644 algos/tdfb/beamformer_delay_and_sum.png create mode 100644 algos/tdfb/circular_array.png create mode 100644 algos/tdfb/circular_di.png create mode 100644 algos/tdfb/circular_filters.png create mode 100644 algos/tdfb/circular_polar.png create mode 100644 algos/tdfb/circular_spatial.png create mode 100644 algos/tdfb/circular_wng.png create mode 100644 algos/tdfb/line_array.png create mode 100644 algos/tdfb/lshape_array.png create mode 100644 algos/tdfb/lshape_array_rot.png create mode 100644 algos/tdfb/rectangular_array.png create mode 100644 algos/tdfb/time_domain_fixed_beamformer.rst create mode 100644 algos/tdfb/two_beams_left.png create mode 100644 algos/tdfb/two_beams_right.png create mode 100644 algos/tdfb/xyz_array.png diff --git a/algos/index.rst b/algos/index.rst index 271ce774..883bb2d7 100644 --- a/algos/index.rst +++ b/algos/index.rst @@ -24,7 +24,7 @@ build pipelines. "FIR equalizer", "Enhances frequency response with a finite impulse response filter, e.g. improve speaker sound", "Yes", "Xtensa HiFi3", "Upstream", "1.4" "IIR equalizer", "Enhances frequency response with an infinite impulse response filter, e.g. cancel DC component or improve speaker sound", "Yes", "Xtensa HiFi3", "Upstream", "1.4" "Mixer", "Sums with unity gain and saturation source buffers of multiple pipelines to a single output sink buffer", "Yes", "No", "Upstream", "1.0" - "Multi-microphone beamformer", "Enhances directivity of microphone array towards steer direction and attenuates diffuse noise", "Yes", "Yes", "Planned", "1.6" + "Multi-microphone beamformer", "Enhances directivity of microphone array towards steer direction and attenuates diffuse noise", "Yes", "Yes", "Upstream", "1.6" "PCM converter", "Not a dedicated component but provides for DAI and host components conversion between PCM formats e.g. S16_LE, S24_LE, and S32_LE", "Yes", "Xtensa HiFi3", "Upstream", "1.5" "Sample rate conversion", "Converts between common sample rates to connect multi-rate synchronous pipelines", "Yes", "Xtensa HiFi3", "Upstream", "1.3" "Volume", "Provides real-time stream gain controls to the user", "Yes", "Xtensa HiFi3", "Upstream", "1.0" @@ -39,3 +39,4 @@ Further information on specific algorithms is forthcoming. src/sample_rate_conversion demux/demux.rst + tdfb/time_domain_fixed_beamformer diff --git a/algos/tdfb/beamformer_delay_and_sum.png b/algos/tdfb/beamformer_delay_and_sum.png new file mode 100644 index 0000000000000000000000000000000000000000..7ec8d1b7208f8576d72b1b4c17df4d91e8b0f51c GIT binary patch literal 44802 zcmX_nWmH^E(=8!DaCg_>?(P!YU4wgYhv06(-3dB4!QI^lcXxNW!}EUY&JWfwr>pIB zS6A)5J6us-5&;$$77Ppw;fIu%G8h=RE*RJsO=u|4->aXfm0)0i;U8kcs_vO*S>JTg zWYD@egY?m>{fVhGfe}d!x{VrqfS|+IQ@9Lc5GfflbbNLb2WFBNbWWyhQAn!c#F_qh^Jzj(LM!IKwoVz z!E|VWIdIb1+}P~$d9jk%+TKD-I0f=UTSgj&wHmdpR!|dU=j$o(&bi}@+hY>13;xiz z!|W&74acd=sv~z>8lz~8Y>UD3{B21p9;##g9*rD>S1G{?raqU<~ z4tAA+F@MEA3}%T(9#1df5_S+GXM+}aKTuzK#l^rmy0Nhl8s16OhYE4E%A{|X97Mc| z;N@K^cs%!^EEhU`bo-~upwo)ecA1TvlT#z@MA+YngQQB%Dd>+RJhWS{dy`fTfko6G zR49bTEwgD0wte@HjRVI^hdPsts5jl$CquLj6AI|~k00p*^nOm8W{?mN?!Ar4{l94@ zR~+^sW$Y2yh2Us?2c`HcBB#0?Ul8>oZ}uet%s$ayAGx!mH#tw6I*}ZA3~*AClSkaW zyi&04XR?2kd=&C$wk`@nC;IktNMjeVCE2ZzI-O5c1Kit6P+mi>9P0*f2lE0Q1~OYs zOiZL{2{g9MuD}n*Q7QA^5-NVxm56x78b_ITlhK|i5#}au(R}C28uNkVPZ>p^&EF&D zZh;l)f92ROD!@idP2LE(Gg2*gI~;0N4}cvo8;HVLSwspyE-Az+Cox=zn@)J9tk`_6 z2l$V0Ry;-rMA&3_`{F%+3-u)3H2X3#GSd9I3a|foxg`oGJXz`8Yt^E4krsHEoIJhS z0V_*u(+iw`pw|liUZLFs+$y#M#J6u=t8E^$*~4;=6#zi?uvmNX%_1k<<~60IVw01}^cR46_Bsz5 zLRPbyVK_H;lQ%c+sP{bBbREWN2IQq<9Zk=kf^wU=g0b59a#XpYcX`SHUB2#h%d}e^Nvoa{R z>0+dZa%6qK=v%cuuI|rP7QTP~Zf}_JX7W=o%f!?)G7Z{AFQ>Kh+mqWY7vmw#yeFZhQFc3jeptI+6&t8M7VxQ8a&uY~ATNDq%Ek^34>yVb+-U8t%6 z{&jW{{bUA}KHJ7^tQ)hUHa^=tbLLx$e@^1zQUiZ})zO^OwrXi0MTsKrGzkWC|IScb zdw8}D>4*Lq1PkZDIaV}mj{e-ducb(6hshY{PzQF-dAi(PQ*yBw=-tpaI$q{Kn!?D- z(oAQ=n;-Oou+ygH$_CXUH`Td6Js%nW^7EX75Y3KLMooI!;dBvQT1l zY~}kkh5Z~WpJLwxQn3>Vqm2q6l1;qe&9E1p@Fh1#1jsSrmAxg^g{p<8odr5_!pSB% z(0WfF7SRT`2*7;$qGqjC;t>GZ7tnmYFLjrUZq^0qk~r_^?y|U%k=QDMX|*|rxLFke zbrdhhx4&MkSInUD{K-oRyGw@<85@uATmFLM;;y~p(6(Aqv4Ja9`RdH2M!au!tdAn5$RBT(sgZ#zs0D3-mVK%M@RAh4ePk^AX5Fe*ZAE)$` zJA-fDLJmnk%F+1GU_uYCZ|*OTkD^@NjkYUhVb`Ad5|wCV@gUladR`64A z$*bs=>~eroYDx<2<0rllhDjFGs7=nuP&^DQ4eoW{+r#P5C1J|Fl&-!c+nSWlq2Up9 z0a$z`<4fphhCv`|>K4DYokn8H_}-m62k9Ft8;9Ln<90`HC{iroh_5}wis*Eiom<7> z*w?lDFd{nYI3eI448?OFfEpAG6DA>u>@PC(;Q z)~Qu#FP_X4RlYi-e>PeKdRv;?Sf*KE-Q(95+V})3vvohPjvU`bEjTA2Q{%`?ua#ih z>F390K`D2hc26V)UmKmvQisorv;In;`%*laB;m`=Uk$zQevk1*GvmkBKvq(f4|OQP z=rB~$lxBQB_g{1n*mZ(ATn;@+!!Y`j2OU;qb_f(Hi!h^$H6J2?{D}DCB)XB!JBb=& z;#iBF#zYfWICcbUXW$;&<%=?k%F8oG z?uKG(ic8Wg>1^!QT3o)P{apAO|2rBO?mZ2ddc2VMlF4axw%h=hRCXOeevC|joE-kl*XSz*4TKkj&?;E zcP|h2(buDz5tcA8!y&y2n4bIkx-)XU9&aw8iaYnNUO9}l?5rM$lJK_q_xpbjb|T$U zQj=jEwt9m7hlhvdXd6EcCUbD3h3^ZV2L|#G*yqqkD-F^1C17NVGSnQ}k@{lT?AQ57 zJekvDF+VsvvUK!0v)?mKd!9T>(^j*Rsv=wJ{#qE$AYo?ra#X3aa%L%WoWy-dVNknH z>=zN(L9;MGh_P@4;q|Y(Iy&-9_Q5o+G}^v^H(F~)Xe3U=rR4o7%hP-cz-SiDY|1*d=2xi>)~Yb!!>jF?w^g6X zvjKfO(fKUkA2=a$90ull2@j?aPQ0Eq!{DRy_6sOfSQIGI=HjMioFQ(Y4v9;>E&ZyL zGoJ9qQ;4#d3uJ<{rwe6?E_#&slIVde4Zdo>&^{}w1kCG;>egR9_FuklQoC;^R)D!v zn@H-L$6U3?RN{o)Y*YFjpqx#CIAIz?o}o#<}jSjO9FWYGainY!xJj6 zSvWhWUJWi+{~*F|A-g(;y=Vum{^WrjD2kT`mdx%4F(FEB7ykWUV0U`d@bI;s59#H0X$i>^m*Jy1lBAnFK1=~`r+VibpE;W2Q!x0 zLZAv<>7u$63!M0ykAL&<=u#BYQ)^vPA%K2CnXlnn=9lcATtS(^l&~n7ZVn3wifJ$& zjIo^ktFR%j>ZKZCf{b}|q$?(X_>@XFJ~5$AQ6{QLogD@}bfU{>x02WB+86XFSM45t z-(F8#SUHD8e`!L^90zQMKGZywrZBHZ?_5lL)E|`x-Gzwbi1)yoM_K9|#8Dhk? zMS8u-33!|>;Qv)Uo@=g{+lbDVPaJ%)CfqeOg(ZZFQQR%!o^ZxkL$?q-$7I62ricw9 zd!M-5cc9GYSxDtQIUpmnk}WDMJe=3mD=E}$Y>DYFu5MEO!m|WbWf$1eFwJi;d!??f zt~6OtKrcgWSOS;+B%;{2(Jafu|GlhKbnT$ZK(m)d9uhJb{5w0=*Zk21&G3W`$mrES zr>YgObmL+Fob*g^N4}<#F_Rj)Qqj{_+MmWiHcaMf^S+!Ibo$QE&drT&mKuknu<$H& zjMm7w=J*XeRuXhz9{5;C)`f5ZXxAsiRR?irpXqsS8`*gqzUEd{fg<4jurQN=f+HH& z15}McaI16OD0ok5xjN_B7WSJI#@MTg34}^YsOGZJrJ5m3;Thy&uKe7&)nZBir&I@Ctmj6eU5!$2LL*(+d!e^rogdOB)7ts$_I7pv7P?=d!s7iG zxfWdB3cGhSJ+sC&O^GBbH%fgy4JD5y$rsb{5A?J|^k8xP;zKdwrUTJ)STb@2@Da|)HqS3DH;m<& zghm9t!7h&#LC^C_Z{(p95qm}n7sJiA5q;4PP zW1*r)NNO3fRHJ!sWuz3I--gd`fDc5MJ1EOD{-S0|2#5_i2wj2cS`VPL4-^7C{Bz2HKT9TNUxStp;MyD}Y8LMx@mvhoBj+7LiDW?@3d?MrZ zc&p_x`mwnBPRlr#CL-88=Ag7xLqe2s<@i>{Lwp)4yAb!B0o+g~V8V@9#n3hdWeyd5%lMcfF6EKx^Qm+%(MX7M%itqUfoHIHY8uUQ1oAG&%1i=!KsSr@GH>;F3IF5 zw-RLvLfREy6%h&$3(7%43{1ogkT*E1m9(v(lSj3CKdEkJU0IHXYa@g<^8r^iOa-(Z z3F(LZTDv(uDRTc^-WR~rNQ%cr|Kb47zwN~LKE9delpky2#{y?2{XJRa z+LUpJMt1*VrCirf`P=uT#rEr;ON!5MgqTBI=pM<^_b%0x?R3Vtuo4xjFq=bgS=XpYY1e61`Vj&1r?6oZfI`v=L5PMX;Lz)Dd(snqJ%!+LdiyU(jc zoXQf`-ww6~Ls#K77!7&5M}AW4zJHxNkttDi32uwtMAOHp3C3__u2ifT!sY^eo#!V9 z0q^~_a+^H7FenHRyxGk8fvXejVkdY!H_;DPb!sjZJ~HZgFlws)eQ{9DS&=z0Y6NO7 zbiB9)bX)uf91?Vwz-HnG@^~Du@a?`9$RQWuJyf342?!^LQ4u}O3!AX?j9yiki>%0@ zt+!2yjp?O}Xe)uZZ^ROjI)mE~Zsf|F?M^7%ZIqz-Y~YfJJeKnFz$_Vo=nrA~8Oox9 zviFNsR%{Rr0mjmLaIDh8uKF8^Es7RLF{aS?r=JH0ITWySO>be)f9M;6M+FkkIYXEQ zjUw$6F0O-YY^k|>YLY-YQo2rRF*+$N5nUzG_W#+*W=8U2Zh%gGl>UFa#Zo69!<$Uo zq1vE+N-9YG=1gz5h9$A(Z{Y%SA^a5|*Jyg!6qwhmXli5*jcc~`PmKg5w(~3{v&~_2g0d!8OZ3tk;rNw%V($n8mSTi9JKdp zcy*%{$=so?n6Psp9fLU?`mP&b%ai)hB!ZB{HVcFvj1zwsq>gFEBE06s0-1cS)h1&Y zgr}@Xs@xu0hQ1%vLua3ZAyzf#xv7zY=oWY%>fH!U5e=`9iAIY@hKY|Q%;&-EG9Cmc zre%*$vnzx-a;Gcqun%|E>7dksm-PTeBfboI6~Sd+BL?Xu;hbe_0rq?9N^K~u%O z>%sss7XrPWUxTFZ;l6aW5%^6AJP#b9!mP~99yhzg2{FOJ!PkwAjYu8dPcxc2Ixn0Ke5qZs-+S$EFgmX_u3ybi6xsEYv5|uw7 zEiv{_4v0~kfADsp`@I>n_g241k{ftB-}NOr)>H3wTi#^l&u=k7Oa%zKo142kJ*72f zG0ftCYdYT@-q>^VwNq%p1K~k!0*x7$8s;}b6h|r8?F(IqeLGDvEvMw}QkB2w@X*kg z`>TJAw-hx4Ohzdf>s#8_nMds2_i(G4Kc;7mTe^Clu}En65%%nGTu*#Hy{-u&}V~tE(#sc8-Myq2E6cLQlDF0@$_6 z@~IvkCOA@BstLT1)VQ}i-7D@E@am%we%vzD3sxcG0LcTWKCbe9rj;xMV26F^d?Q%p zrAnHIC>aMYVLKcAItIj(%7=Xf+p8^8pst6-hDBZaR+-v{Q1SD$?9;Q}9duu^a%z@2t3Eq0sjx)*DVk!sz#$rN)N zfAy6PAsZZ!g4XU>jJT#wL$0xZBluZ^k9w@Yb{k-q9}~uzV4kBQy1_o|#*^KZ0fRO6 z-(`p4M3meKhiwMglvZpdJ4Q{mt>eik9N=&uBz8<8Izuw`q0+5U){0EB1>LnHIjbK&h-mZ2e zMf0nAqj7nG1-7mUD>0D>O7j=V>2F624*eX~xficHD+a|=8Sh-&ZGKA=eJPkjQ`<#N zCYz8-&d~XWUg|WS8s8PN+cJhtlngotCfLsdTM66)>!R)Jv&3za&Zl_RF#2+BQf_F=?48Jm=h4?JsH zdYzYX*$_w|yY~Yi4mH74s%JKWtL8?|$gkrqhU@(s4o3zST@U&`>nAue|p;Usv0M~R@X|#HtShrkNz|P zKKoGZdN2JolK2}P28kP@NEyQn_@tr!lc=VQt7JP^vdD(eDaInM}+s z$}_V46wxp4D5VYvJJ>1TSx+NjcVSpx;o(PjA@EF(Yow9|eKN`d`1EvjMZ%9Y=Rp&$ z-R^n!)7@T3^69lfRuOa_RT#*DoSqdp2C?S^JkJ6ME~H z*l?O>6H_rh2p~kHVQYc5TprH5Xk(MM(7bJ>qMaL|0bwU%V6XBt2NBiP)$TAXJf46pB= zY61WN%G9Ro`2|o=6f~?R!@CeVC#w$q@8VrjQa$Q|Pg)mk-{|yu0H`&8?%+j|4yUWB8k(M^8bfF8eXJdKa`jV9u!>iIl7Ar~ z0~d31bB-u@xj1>E9Coi8JxkiFHN>bG3-kdx5}ClFO#7M&<9%!Y!9X_y z5VG33?K>5P!JFA+bP$ot`i-4JIr+~Yte^|sC|OWSN1!~$q#2ui!Z{!39V`8@Xd{~< zuz}fHy9R%M0MJQDS<6_OQxMiKtegzW8`&orL!xT2!_J~RNCQ!5hgkFv=|IRIK}o3?%^ox#(8(1K2Q|7sIq?0yb7Gn|2;TAj72#T zA0NRrdM!G@Fr!5$B`15R%BTDqt=Exx!;?t>=jhPQ!ctvn^@nKxaO!Ngn4Mq{E_TEF ztXIEyKCeN&Z(`}5PqKDFEkFK1fDF_pEa#Hr{nCXsIGp@!G(gayON23A?1WW}9U1N) z;Q_S4ED6UuSVa=K^No0x5`F$V_~<-;pvFGZNB5G%)*Uy;wa>%4&Q)6zu*|iVb83Z> zKC%Q6o$?t@$a7df{|WIow{;XpPUoqi`wPcmWn z4cP01k=4ja?br?VK@-Oo1TT6(aJLGK)q?7byGfyj-o&F68{pn;8A{YA z&o#wRU#6hamifrr^hmZ&HOVBRpp94pZoGa8cSnX<|H$ZO%oJ8IT((Dd`pavSWj$Cy zZ?T-L6;$6Z+#drer4vewy2YcRMgYeny#&{@&I7`@DB6NKw$^7HzDU*;xf zn#SzRJ$pUS2+bs%Os3u3wI(dDCfZs6d0MSRrG=WV@!Q?9uZ!l}7^q}auWk&aMEuAT zx_M4&FimNTfMO)Z<@^=O&=eWtBTJ0nfcy&RcsNn$|CRHO;TpA=zK1-4e0?s9p7`du z6(i0+;#k|{PaDd8m#;HM!1c8zT=kDwPcFea)YMr4o zsJ-W!IiIGWq2CaVLh$-uim=J!$8Tg?!>g{g`Z~E4^_Qj(mOHlpfb&d=_a)w2wX zO6?i1(L_nBQ|cl>FLJBhDcCkWF!R8MbhnJDl6Ybwm=}%ua{V)0{XM!G9n=t*kTf0CcE|3IFlfV+0}}A|^FUZQDDkEE#li*; z1G4*J=J}P)8o0$P?TyQ1{Ng{F@}Oo4I9P#2b)+cHTE;urPcsyAPHEBOUY4zU<$@O5*i+#nVF-yMo%rNLnatWSq*z zvK__@qy@b)Dlm0jRkAxDnUM)=y-(nlKOo#@X5+)aUzUi7$d7ad0~0rTz)++;6gNct zOikA=B>d1lp9C~R+q$_}>5ZnCps(O%naCCOOxVJu?Gcd?($)d}GW8clke^Q~x?K6~ zK&?ad7Q50g&@4!O-K$Q?ztL800B3GUUjEzE!!ao_QOB78>g&WsdO$IYsWG?{?KdPs ze6LULC`ZuGZl>OHb~jHnG@Fq5r&!qHUVsN7s5SHgS86~i?^TSNXQbWqV`eJ<$K_H+?Rr{W0WtSQyJx2MHB;$WpxsT8ee( zh9lol8)mMnN{rwewoT8$=Vj3Div~rCqeLB=F;^e6O zh2#WO`a4V3QC$MlTTVt+Ievz#3?n_(hku<01k8ENXJWN`y8N3(a28b^KL9d_ejAJ8m|=m+P;G^R)}6Bl(hFNRzxU1@!<4UuU;!JJ&>^a2n=k z!`-pph_xCYoqtomOBN*YF`8MVPb(EuRYjAeEax@p3s#GpH6jgR1}40|diVb=_K*&s zq2~zvh9to2`}+9yi73dz!l0Z#JV*=;9JMjYJ)ZkHL+EF|e6kyuF~^5XoeA9}TM!kn zS`wgS<3+-;G(Ig)w$K9Lp9d~N3!v9&9Mi7(8O&(o^nL}Bu2{gXa2WLo)aRvdKfmzI zEUPrm?s!4eLpm9O7#n^IBPE{&bpp819#nE#0~Id<(gj5KWv4B1a4}j*BZty}4gbM! zTScIh-fa&8&y94&V6J8&T4NxxQ-DIqa{AEmaH@gJo^%(LGZfH%g|i0aGPE&3lZL!Q z4WEkm#6ER4Ay<%XGqbWPY3fzQt{FyPqc0JOb)q7g7KYWZ||uhd0)(xdc8U zR;`M54#u9U4l!UY3=YkBKNNv*K{aK63Vi zA*pR|*?>%QYgUlbDO3@Xk$Wp1rFtbxNlyk8l+O}J+k`Xqk+erx8-2)FoE5!;>W7g+ z;y3N(yB}πq|G?pFb6UzYQ%fq(~4?omse9XTc5 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

0wFX~zxLoa5F{DToO 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 literal 0 HcmV?d00001 diff --git a/algos/tdfb/circular_di.png b/algos/tdfb/circular_di.png new file mode 100644 index 0000000000000000000000000000000000000000..c0cfe27c63d4ec97a0f136c96e2f892d984416ac GIT binary patch literal 41751 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 literal 0 HcmV?d00001 diff --git a/algos/tdfb/circular_filters.png b/algos/tdfb/circular_filters.png new file mode 100644 index 0000000000000000000000000000000000000000..3f6e40107e0069b296dbfc8b04b7a7c988c0f38f GIT binary patch literal 29693 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 literal 0 HcmV?d00001 diff --git a/algos/tdfb/circular_spatial.png b/algos/tdfb/circular_spatial.png new file mode 100644 index 0000000000000000000000000000000000000000..80e266a30388e1038a333d197238fd7f85465910 GIT binary patch literal 76303 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 z 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 ?LVV?&_S_S(4a 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 I@rOSD7x$nOPyhe` literal 0 HcmV?d00001 diff --git a/algos/tdfb/circular_wng.png b/algos/tdfb/circular_wng.png new file mode 100644 index 0000000000000000000000000000000000000000..3925e11d430f0e3fd389bbb25d3fdefa796d803e GIT binary patch literal 42962 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

kBM?=0eILfMJn{}0j@1XA>Sv8lI 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 literal 0 HcmV?d00001 diff --git a/algos/tdfb/two_beams_right.png b/algos/tdfb/two_beams_right.png new file mode 100644 index 0000000000000000000000000000000000000000..a773888afe2e54766473b7c6dfb983c5f5ebff24 GIT binary patch literal 41925 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 KQ_NN{_Wgh25_pFI literal 0 HcmV?d00001 From 45dca87b1b703d9c6831ec4f3bb48be5d6d4d5f3 Mon Sep 17 00:00:00 2001 From: Deb Taylor Date: Mon, 2 Nov 2020 14:20:37 -0500 Subject: [PATCH 051/290] Made grammatical edits to logger page. Signed-off-by: Deb Taylor --- .../debugability/logger/index.rst | 40 +++++++++---------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/developer_guides/debugability/logger/index.rst b/developer_guides/debugability/logger/index.rst index 68ac83a2..aadd2608 100644 --- a/developer_guides/debugability/logger/index.rst +++ b/developer_guides/debugability/logger/index.rst @@ -190,14 +190,12 @@ A similar example may be prepared for components on a particular pipeline: sof-loggerr -l ldc_file -t -Fc=* -Fv=*1.* -.. note:: - To track verbose message use firmware build with selected "Trace verbose" - option under "Trace" menu. +.. note:: + To track a verbose message, select the "Trace verbose" option under the "Trace" menu from the firmware build. + +Active trace filters are stored in the firmware runtime memory, so after a firmware restart (such as after power gating in sleep mode) filters settings will be reset. -Active trace filters are stored in firmware runtime memory, so after firmware -restart (eg. after power gating in sleep mode) filters settings will be reset. -Consider disabling power gating during your debug session. -It may be done by: +Consider disabling power gating during your debug session by entering the following: .. code:: bash @@ -205,31 +203,31 @@ It may be done by: echo on >/sys/devices/pci0000\:00/0000\:$(lspci -nn | grep "audio contoller" | awk '{print $1;}')/power/control .. note:: - Current device power status may be read by this command: - + The current device power status can be read by entering this command: + .. code:: bash - + cat /sys/devices/pci0000\:00/0000\:$(lspci -nn | grep "audio controller" | awk '{print $1;}')/power/runtime_status -Logger trace filtration affect only traces sent after filter setup, so traces -already stored on kernel side will not be affected. +The logger trace filtration affects only traces sent after the filter setup, +so traces already stored on the kernel side are not affected. -Filters are setup incrementally, so when logger will be run-up twice with -different settings, then filters from first run will not be restored to default -state but can be replaced by new one. -To reset filters to default state, firmware reset is needed. +Filters are set up incrementally, so when loggers are run twice with +different settings, then filters from the first run will not be restored to +the default state but will be replaced by a new one. To reset filters to the +default state, a firmware reset is needed. Detailed description -------------------- -Filtration mechanism is realized on the firmware side so, after changing the -log level to verbose for each component, the DSP may be overhelmed by +The filtration mechanism occurs on the firmware side so, after changing the +log level to verbose for each component, the DSP can be overhelmed by tracing. -Core functionality is provided by DSP, so filtration does not work in offline -mode - during conversion previously saved input file. +Core functionality is provided by the DSP, so filtration does not work in +offline mode - during conversion in a previously saved input file. -Communication between the firmware and logger is realized through driver +Communication between the firmware and logger is occurs through driver debug file systems. The logger writes new trace settings to ``sys/kernel/debug/sof/filter``. These will be used to create *IPC* messages with new trace levels. A simple text data format is used: From 5aeba9111cc425c03aa4511ffd397bb107c02780 Mon Sep 17 00:00:00 2001 From: Keyon Jie Date: Tue, 3 Nov 2020 19:01:51 +0800 Subject: [PATCH 052/290] topology: add guide for specify DSP cores Add guide and example to explain how to specify DSP core index for pipeline or widgets/components. Signed-off-by: Keyon Jie --- developer_guides/topology/topology.rst | 38 ++++++++++++++++++- .../commons/multicore-processing.rst | 2 + 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/developer_guides/topology/topology.rst b/developer_guides/topology/topology.rst index 8ec582a3..30101683 100644 --- a/developer_guides/topology/topology.rst +++ b/developer_guides/topology/topology.rst @@ -292,6 +292,42 @@ where: can be chosen predefined configurations such as MONO_PDM0_MICA, STEREO_PDM0, FOUR_CH_PDM0_PDM1 etc. +.. _dsp-core-in-topology: + +1.7 DSP Core Index +------------------ + +The topology file can specify on which DSP core a pipeline or component will +be scheduled on. + +To specify the DSP core for a pipeline, the token SOF_TKN_SCHED_CORE is used, in +tools/topology/m4/pipeline.m4: + +.. code-block:: + + W_PIPELINE(stream, period, priority, core, initiator, platform) + ... + ` SOF_TKN_SCHED_CORE' STR($4) + ... + +Then specify this 'core' in your pipeline definition, e.g. in +tools/topology/sof/pipe-dai-playback.m4: + +.. code-block:: + + W_PIPELINE(N_DAI_OUT, SCHEDULE_PERIOD, SCHEDULE_PRIORITY, SCHEDULE_CORE, SCHEDULE_TIME_DOMAIN, pipe_dai_schedule_plat) + +To specify the DSP core for a component/widget, the token SOF_TKN_COMP_CORE_ID +is used, e.g. in tools/topology/m4/pga.m4: + +.. code-block:: + + dnl W_PGA(name, format, periods_sink, periods_source, core, kcontrol0. kcontrol1...etc) + ... + ` SOF_TKN_COMP_CORE_ID' STR($6) + ... + + 2. How to create a new topology? ******************************** @@ -612,4 +648,4 @@ actually push both messages to a dot file: .. _here: https://www.alsa-project.org/main/index.php/ALSA_topology .. _SOFT: https://github.com/thesofproject/soft -.. comment "master" has been replaced with "main" \ No newline at end of file +.. comment "master" has been replaced with "main" diff --git a/platforms/intel-cavs/commons/multicore-processing.rst b/platforms/intel-cavs/commons/multicore-processing.rst index 459c8d05..818fb464 100644 --- a/platforms/intel-cavs/commons/multicore-processing.rst +++ b/platforms/intel-cavs/commons/multicore-processing.rst @@ -58,4 +58,6 @@ stop**. .. note:: The kernel also needs to enable cores on the host side, before even sending the ``SOF_IPC_PM_CORE_ENABLE`` IPC to the FW. + For details on to specify DSP core in topology file, refer to the + topology documentation :ref:`DSP Core Index `. From 9ac4113f79705249e10e6c67a83cdb1608805736 Mon Sep 17 00:00:00 2001 From: Deb Taylor Date: Fri, 6 Nov 2020 11:25:48 -0500 Subject: [PATCH 053/290] Grammatical edits to TDFB doc Signed-off-by: Deb Taylor --- algos/tdfb/time_domain_fixed_beamformer.rst | 475 ++++++++++---------- 1 file changed, 230 insertions(+), 245 deletions(-) diff --git a/algos/tdfb/time_domain_fixed_beamformer.rst b/algos/tdfb/time_domain_fixed_beamformer.rst index 31f6da6b..ff4cf762 100644 --- a/algos/tdfb/time_domain_fixed_beamformer.rst +++ b/algos/tdfb/time_domain_fixed_beamformer.rst @@ -5,110 +5,108 @@ Time Domain Fixed Beamformer (TDFB) .. contents:: :depth: 3 - + Introduction ************ The beamformer is a pre-processing component for microphones. It -improves the microphone capture signal-to-noise by providing spatial -noise suppression for ambient noise. Also the non-correlated -self-noise of the microphones and electronics is mitigated due to -summing of two or more microphones into an output channel stream. +improves microphone signal-to-noise capturing by providing spatial +noise suppression for ambient noise. The non-correlated self-noise of the +microphones and electronics can be mitigated by summing two or +more microphones into an output channel stream. -The beamformer's operation is easiest to understand with delay-and-sum +The beamformer's operation is easiest to understand with a delay-and-sum beamformer type for a line array shape. The microphones are assumed to -be in far-field of the sound source. At sufficient distance the -spherical waves from e.g. person's mouth appear as planar. The waves -propagate at slightly temperature dependent speed of 340 m/s. The -beamformer should sum the microphones outputs in-phase for the look -direction. The direction is called here the azimuth angle. - -The beamformer could also, if desired, be set up to do the opposite to -null the signal from specified angle by delaying the signal for +be in far-field of the sound source. At a sufficient distance, the +spherical waves such as from a person's mouth appears as planar. The waves +propagate at a slightly temperature-dependent speed of 340 m/s. The +beamformer can sum the microphones outputs in-phase for the look +direction. The direction is called the azimuth angle. + +The beamformer can also, if desired, be set up to do the opposite to +null the signal from a specified angle by delaying the signal for an opposite phase sum. .. figure:: beamformer_delay_and_sum.png - - Example delay-and-sum beamformer with two microphones at 50 mm - distance. The sound waves arrive from 18 degree azimuth angle. -In the above example the plane waves arrive from source at 18 degrees -azimuth angle versus the normal of line array axis. The task is to + Example delay-and-sum beamformer with two microphones at a 50 mm + distance. The sound waves arrive at an 18 degree azimuth angle. + +In the above example, the plane waves arrive from source at an 18 degrees +azimuth angle versus the normal line array axis. The task is to determine the needed delay values for delay elements D\ :sub:`1` and D\ :sub:`2`. Since the first microphone receives the wave before the -second microphone, the signal from first microphone need to be delayed +second microphone, the signal from the first microphone must be delayed by D\ :sub:`1` before the summing operation. The Delay value of D\ :sub:`2` is set to zero. The needed delay value is the sound propagation time equivalent length -of edge a in the formed right triangle with edges a, b, and c. The -lengths of edges are time values those are computed from known microphones -distance, speed of sound, and azimuth angle. +of edge **a** in the formed right triangle with edges **a**, **b**, and **c**. +The lengths of the edges are time values that are computed from the +microphone's known distance, speed of sound, and azimuth angle. -The length of edge c is +The length of edge **c** is :math:`t_c = \frac{d}{v} = \frac{50~mm}{340~m/s} \approx 147~us` - -The angle between edges a and c is 90 - az. Therefore the arrival time -difference t\ :sub:`a` to apply for D\ :sub:`1` with 18 degree steer + +The angle between edges **a** and **c** is 90 - az. Therefore, the arrival +time difference t\ :sub:`a` to apply for D\ :sub:`1` with an 18 degree steer angle (az) is :math:`t_a = t_c \cos (90 - azimuth) \approx 45~us` -With different az angles it can be seen that the delay to apply varies -between 0 (az = 0) and 147 us (az = 90). For negative azimuth angles +The different az angles shows that the delay to apply varies +between 0 (az = 0) and 147 us (az = 90). For negative azimuth angles, the applied delays for D\ :sub:`1` and D\ :sub:`2` are swapped. -Such delay is typically applied by all-pass digital filter. The beam -patterns for line shape one dimensional arrays have a rotational -symmetrical beam pattern. For the above example with D\ :sub:`1` and -D\ :sub:`2` set the array would also pass the waveform from 180 - az +Such a delay is typically applied by an all-pass digital filter. The beam +patterns for line shape one-dimensional arrays have a rotational +symmetrical beam pattern. In the above example with D\ :sub:`1` and +D\ :sub:`2` set, the array would also pass the waveform from an 180 - az direction. The beam shape resembles a bent ellipse for broadside. A -3D cone like beam pattern is possible only for end-fire angles +90 -or -90 degrees. A 2D array like circular shape can provide a 360 -degree steerable cone in azimuth plane. - -The analog directional microphones with e.g. 3D cardioid shape for -end-fire angle are actually single or dual diaphragm microphones with -tuned acoustical ports or analog all-pass electronics to achieve -similar additional delays for delay-and-sum. Due to large mechanical -size they are common only in studio equipment. Consumer electronics -such as notebooks form factors can fortunately provide various shape -microphone arrays while the studio microphones like approach is +3D cone-like beam pattern is possible only for end-fire angles of +90 +or -90 degrees. A 2D array like a circular shape can provide a 360 +degree steerable cone in an azimuth plane. + +Analog directional microphones, such as a 3D cardioid shape for an +end-fire angle, are actually single or dual diaphragm microphones with +tuned acoustical ports or analog all-pass electronics that achieve +similar additional delays for delay-and-sum. Due to their large mechanical +size, they are common only in studio equipment. Consumer electronics +such as notebooks form factors can fortunately provide various-shaped +microphone arrays while the studio microphone-like approach is impossible. Beamformer types **************** -The main beamformer types are fixed and adaptive. The implementations +Main beamformer types are fixed and adaptive. The implementations can be in time or frequency domain. -This TDFB type algorithm is the simplest time domain and fixed type -with a pre-defined look angle (azimuth, elevation). The audio source -is not tracked automatically. Audio waveforms from other angles are -attenuated. The beam shape is not particularly narrow with a low -microphones count such as 2 -4 so there's no need to track the subject -automatically we know the approximate angle for the use case. +The fixed beamformer has a simple time domain with a pre-defined look angle +(azimuth, elevation). The audio source is not tracked automatically. Audio +waveforms from other angles are attenuated. The beam shape is not +particularly narrow (with a low microphone count such as 2 -4) so there's no +need to track the subject; we automatically know the approximate angle for +the use case. -Adaptive beamformers usually target to minimize the output signal -while unblocking the configured pass direction. The fixed beamformer -has the assumed or theoretical noise characteristic +Adaptive beamformers usually seek to minimize the output signal +while unblocking the configured pass direction. This differs from the fixed +beamformer, where the assumed or theoretical noise characteristic is pre-programmed. There is no delay to adapt (same performance from the -beginning) or risk for mis-adaptation (desired signal corrupts) but -the practical performance is somewhat limited from performance in a -theoretical noise field. The time domain implementation is also -low-latency without added delay for signal framing for transform -domain. It can compute nearly any number of stream frames due to no -block size constraints. The filter bank adds a small delay, e.g. 2 - -10 ms that depends on configuration. - -The fixed beamformer needs to be configured per every different +beginning) or risk for mis-adaptation (desired signal corrupts), but +the practical performance is somewhat limited in a theoretical noise field. +The time domain implementation is low-latency with no added delay for signal +framing for the transform domain. It can compute nearly any number of stream +frames due to no block size constraints. The filter bank adds a small delay, +such as 2 -10 ms, that depends on the configuration. + +The fixed beamformer must be configured for every type of microphone array geometry. The beam can be steered by applying a new -filters programming (with presets in later version of TDFB) if the +programming filter (with presets in a later version of TDFB) if the capture subject angle has changed based on camera face recognition or -acoustical direction of arrival estimation. Also quick beam direction -switching by rotating the input channels at algorithm input can be -made possible for some array geometries. +acoustical direction of the arrival estimation. Also, quick beam direction +switching for some array geometries is also possible by rotating the input channels at the algorithm input. Microphone array geometries *************************** @@ -116,25 +114,24 @@ Microphone array geometries Line ==== -In the line array the microphones are in locations those form a -straight line. The numbering convention of microphones is shown in the -figure below. The microphones numbers correspond to audio channels -at beamformer input. In stereo audio channel 1 is the left channel. +In the line array, microphone locations form a straight line. As shown in the +figure below, microphone numbers correspond to audio channels at the +beamformer input. In stereo, audio channel 1 is the left channel. -The array size is described my microphones count and the space between -two neighbor microphones. In the example the spacing of the four +The array size is described by microphones count and the space between +two neighboring microphones. In the example below, the spacing of the four microphones is 30 mm. The steer azimuth angle is 90 degrees. The beam -direction for positive angles (0 to 90) is towards microphone 1. The -beam directions towards last microphone are set up with negative angle +direction for positive angles (0 to 90) travels towards microphone 1. The +beam direction towards the last microphone has a negative angle (0 to -90). .. figure:: line_array.png :width: 600 - + Line array with four microphones. -The code to create the above design is below. The Octave GUI need to -be started from the TDFB tune directory: +The code to create the above design is below. The Octave GUI must +be started from the TDFB ``tune`` directory: .. code-block:: bash @@ -142,9 +139,9 @@ be started from the TDFB tune directory: cd $SOF_WORKSPACE/sof/tools/tune/tdfb octave --gui & -In the Octave shell enter the next commands or create a short script -(e.g. ex_line.m) and run it. Remember to end the lines with semicolon -to avoid long prints of internal data structures. +In the Octave shell, enter the following commands or create a short script +(such as ``ex_line.m``) and run it. Remember to end each line with a +semicolon to avoid long prints of internal data structures. .. code-block:: octave @@ -154,33 +151,31 @@ to avoid long prints of internal data structures. bf.mic_d = 30e-3; % 30 mm spacing bf.steer_az = 90; % Azimuth angle 90 deg bf = bf_design(bf); - -The above design is simplified and it lacks the output files -definition and assumes default four microphones to one output channel -configuration but it creates the plots for geometry and theoretical -characteristics. - +The above design is simplified and lacks the output files definition; it +assumes a default of four microphones to one output channel configuration +but it creates the plots for geometry and theoretical characteristics. + Circular ======== -In the circular array the microphones are at equal radius with equal +In the circular array, microphones are at an equal radius with equal angular spacing. The microphones are numbered counterclockwise when -looking at array from above (positive z-axis). +viewing the array from above (positive z-axis). -The azimuth angle (-180 to +180) is in the example 90 degrees. 0 -degrees angle points exactly to microphone 1 direction. The circular -array is a two dimensional array. If the elevation angle (-90 to 90 -degrees) is set to non-zero value the look direction can be tilted up -or down. A positive elevation angle tilts the beam upwards. +The azimuth angle (-180 to +180) is at 90 degrees in our example. A 0 +degree angle points exactly towards microphone 1. The circular array is +two-dimensional. If the elevation angle (-90 to 90 degrees) is set to a +non-zero value, the look direction can be tilted up or down. A positive +elevation angle tilts the beam upwards. .. figure:: circular_array.png :width: 600 - + Circular array with six microphones. -The design was done with commands. The plot_box is optional, it only -zooms the the plot axis to a 150 mm wide cube. +This design was created using commands, as shown below. The plot_box is +optional; it only zooms the plot axis to a 150 mm wide cube. .. code-block:: octave @@ -192,33 +187,33 @@ zooms the the plot axis to a 150 mm wide cube. bf.plot_box = 150e-3; bf = bf_design(bf); -The view can be rotated as normal 3D plot. In Matlab mouse rotate is -available. In Octave it can be done with command view() to watch the -array from other angle. +The view can be rotated as a normal 3D plot. In Matlab, mouse rotation is +available. In Octave, the command view() can be used to view the array from +another angle. .. code-block:: octave figure(1) v = view() view(130, 30) - -The view azimuth was rotated by 180 degrees (-50 to +130). The view has -no impact to beamformer design. + +The azimuth view was rotated by 180 degrees (-50 to +130). The view has +no impact on the beamformer design. Rectangular =========== A rectangular array is shown below. The numbering of microphones for -the first row is line for line array. The number continues from the -leftmost microphone of the next row. +the first row is the same as for the line array. The number continues from +the left-most microphone of the next row. .. figure:: rectangular_array.png :width: 600 - + Rectangular array with six microphones. -The code for the design is +The code for the design is as follows: .. code-block:: octave @@ -227,21 +222,21 @@ The code for the design is bf.mic_nxy = [3 2]; % of 3 x 2 bf.mic_dxy = [30e-3 30e-3]; % Same x and y spacing bf.plot_box = 150e-3; - bf = bf_design(bf); + bf = bf_design(bf); L-shape ======= -The L-shape array is much like rectangular but only the left and -bottom edge of microphones rectangle is populated. +The L-shape array is much like the rectangular array but only the left and +bottom edge of the microphones rectangle is populated. .. figure:: lshape_array.png :width: 600 - + L-shape array with four microphones. -It was produced by +It is produced by the following: .. code-block:: octave @@ -257,16 +252,16 @@ It was produced by Arbitrary XYZ ============= -It's also possible to define all microphone coordinates manually. The +All microphone coordinates can be defined manually. The following example shows a tetrahedron shape with four microphones. The microphones order is as they are presented in the design script. .. figure:: xyz_array.png :width: 600 - + XYZ array with four microphones. -The tetrahedron shape was made with next script +The tetrahedron shape is made with the following script: .. code-block:: octave @@ -283,18 +278,18 @@ The tetrahedron shape was made with next script bf = bf_design(bf); -Note that the beamformer design is totally unaware of surface effects -of the object. The design equations assume the microphones "float" in -free space. Particularly a 3D array will be impacted by device -mechanics and custom design equations may be needed. +Note that the beamformer design is totally unaware of the surface effects +of the object. The design equations assume that the microphones "float" in +free space. Particularly, a 3D array will be impacted by device mechanics +so custom design equations may be needed. Rotation of the array ===================== -The array orientation can be changed with array_angle with X, Y, and Z -axis rotation angle. The next example rotates the array like it would -be on a notebook display lid corner at 60 degree angle. The steer -azimuth is set to 0 degrees towards notebook user. The plot view angle +Change the array orientation by changing the X, Y, and Z axis rotation +angle in the ``array_angle``. The following example rotates the array like +it would be on a notebook display lid corner at a 60 degree angle. The steer +azimuth is set to 0 degrees towards the notebook user. The plot view angle is changed also. .. code-block:: octave @@ -313,160 +308,154 @@ is changed also. .. figure:: lshape_array_rot.png :width: 600 - - Rotated L-shape array + + Rotated L-shape array. Filter bank design procedure **************************** -The procedure is in file bf_design.m. As coarse description the design -of filter bank is done entirely in (FFT) frequency domain with default -of 512 bins. The conversion to a time domain FIR filter bank for -desired filter length is done with IFFT and kaiser window. The longer -the filters are the less they deviate from the super-directive -frequency domain design. - -The procedure is based on equations equations published in paper -"Superdirective Microphone Arrays" by Joerg Bitzer and K. Uwe -Simmer. It is available in book "Microphone Arrays" by Michael -Brandstein and Darren Ward (Springer 2001). - -The procedure starts with computation of (x, y, z) coordinates of -virtual sound source at specified azimuth (steer_az) and elevation -(steer_el) angle. The point is by default 5m radius away that is -enough for far field with planar sound waves with typical array -dimensions but can be altered (steer_r). Near field (e.g. less than -1m) design may suffer from lack of sound level compensation for +.. note:: + The following procedure is based on equations published in "Superdirective Microphone Arrays" by Joerg Bitzer and K. Uwe Simmer. It is available in book "Microphone Arrays" by Michael Brandstein and Darren Ward (Springer 2001). + +The filter bank design procedure is located in the ``bf_design.m`` file. +Briefly, the design is done entirely in the FFT frequency domain with a +default of 512 bins. The conversion to a time domain FIR filter bank for the +desired filter length is done with an IFFT and kaiser window. The longer +the filters, the less they deviate from the super-directive frequency domain +design. + +The procedure starts with computing the x, y, z coordinates of the +virtual sound source at the specified azimuth (``steer_az``) and elevation +(``steer_el``) angles. The point is by default 5m radius away which is +enough for far-field with planar sound waves that have typical array +dimensions but can be altered (``steer_r``). Near-field (less than +1m) design may suffer from a lack of sound level compensation for microphone channels. -The noise field is assumed to me theoretical homogeneous type and a -coherence matrix is formed with knowledge of the microphones -geometry. The super-directive design is set of coefficients that +The noise field is assumed to be a theoretical homogeneous type; a +coherence matrix is formed with knowledge of the microphone's +geometry. The super-directive design is a set of coefficients that minimize the noise power spectral density of filtered and summed microphone signals but provides a distortion-less response towards the look direction. The used design equations compute a Minimum Variance -Distortion-less Response (MVDR) beamformer. The details are found from -script bf_design.m and the above mentioned book. +Distortion-less Response (MVDR) beamformer. The details are found in the +``bf_design.m`` script and the above-mentioned book. The elegance of the frequency domain design is that the equations can -be solved per each single frequency bin in FFT domain. Since the -process is potentially numerically unstable there is a diagonal -loading factor that is added to the coherence matrix prior to -inversion. The parameters is mu_db. It defaults to -50 dB but smaller -or larger values can be tested for best results. Smaller than default -values need to be used with care. The self noise of the microphones, -via white noise gain (WNG), could get even boosted with near zero -diagonal load designs. Large diagonal load improves robustness of the -design but may compromise other characteristic like beam pattern or -diffuse noise field suppression. - -After solving the equation for all frequencies the filters for each -microphone channel are converted to time domain with IFFT and window -function. The window function shortens the impulse responses to +be solved per each single frequency bin in the FFT domain. Since the +process is potentially numerically unstable, a diagonal loading factor is +added to the coherence matrix prior to inversion. The parameters is ``mu_db``. It defaults to -50 dB but smaller or larger values can be tested for best +results. Smaller than default values need to be used with care. The self +noise of the microphones, via white noise gain (WNG), could even get boosted +with near zero diagonal load designs. Large diagonal load improves the +robustness of the design but may compromise other characteristic-like beam +patterns or diffuse noise field suppression. + +After solving the equation for all frequencies, the filters for each +microphone channel are converted to a time domain with IFFT and window +function. The window function shortens the impulse responses to the desired length. The windowing naturally changes the characteristics so different filter lengths (fir_beta) should be tested. + Design examples *************** Circular array ============== -If e.g. circular array design is revisited the design creates several -plot windows in addition to the geometry and steer direction plot. The -next two show the beam pattern characteristic. The polar plot shows -only frequencies 1, 2, 3, and 4 kHz. The colorful frequency vs. angle -shows more detailed view for the same with all frequencies up to -Nyquist Fs/2. - -It can be seen that the beam patterns are different for different -frequencies. There is a beamformer type for constant directivity but -the performance against diffuse noise is not as good. The narrower -beam towards higher frequencies in super-directive achieves the higher -ambient noise suppression. - -At frequencies above 5 kHz there are side lobes those pass the signal -as well as the main beam. Those are caused by spatial aliasing. The -wave length of audio gets smaller than the array microphones -distance. The array dimensions need to be decreased if spatial -aliasing needs to be avoided. In most cases some it can be tolerated -somewhat. - -In the look direction beam there's some attenuation at lowest and -highest frequencies. The response can be made more flat by increasing -the filter length from default 64 (fir_length). +In reference to the earlier circular array design example, note that the +design creates several plot windows in addition to the geometry and steer +direction plot. The following examples below show the beam pattern +characteristics. The polar plot shows only frequencies 1, 2, 3, and 4 kHz. +The colorful frequency vs. angle shows a more detailed view for the same but +with all frequencies up to Nyquist Fs/2. + +Notice that the beam patterns are different for different frequencies. A +beamformer type exists for constant directivity but the performance against +diffuse noise is not as good. The narrower beam towards higher frequencies +in super-directive achieves the higher ambient noise suppression. + +At frequencies above 5 kHz, side lobes pass the signal as well as the main +beam. Those are caused by spatial aliasing. The wave length of audio gets +smaller than the array microphones distance. The array dimensions must be +decreased if spatial aliasing needs to be avoided. In most cases, some of it +can be tolerated. + +In the look direction beam, some attenuation exists at lowest and highest +frequencies. The response can be made more flat by increasing the filter +length from the default 64 (``fir_length``). .. figure:: circular_polar.png :width: 600 - - Polar response of the circular array + + Polar response of the circular array. .. figure:: circular_spatial.png :width: 600 - - Frequency vs. angle response of the circular array -The performance of the array and beamformer can be also characterized + Frequency vs. angle response of the circular array. + +The performance of the array and beamformer can also be characterized with White Noise Gain (WNG) and Directivity Index (DI) plots. The WNG -plot shows the amount attenuation the design provides for uncorrelated -noise. E.g. self noise of the microphones is uncorrelated noise -type. The directivity index shows the attenuation of noise that -arrives from other directions than steer direction. The noise that -arrives from surrounding noise sources and reflects from walls and -other surfaces and is correlated is called diffuse field noise. - -The impact of diagonal load mu_db in e.g. range -100 to -20 can be -tried and seen best in these plots. A near zero diagonal load with -value -200 dB makes the directivity even negative at some -frequencies. Such beamformer design would boost noise at those -frequencies! +plot shows the amount of attenuation the design provides for uncorrelated +noise. For example, self-noise of the microphones is an uncorrelated noise +type. The directivity index shows the attenuation of noise that arrives from +other directions than the steer direction. The noise that arrives from +surrounding noise sources and reflects from walls and other surfaces and is +correlated is called *diffuse field noise*. + +The impact of diagonal load ``mu_db`` in an example range of -100 to -20 can +be tried and seen best in these plots. A near zero diagonal load with a +-200 dB value makes the directivity even negative at some frequencies. Such +beamformer design would boost noise at those frequencies! .. figure:: circular_wng.png :width: 600 - - White noise gain of the circular array + + White noise gain of the circular array. .. figure:: circular_di.png :width: 600 - - Directivity index of the circular array -Finally the FIR coefficients plot can be checked for sane looking result. The shown -plot shows a typical symmetrical FIR impulse response + Directivity index of the circular array. + +Finally, the FIR coefficients plot can be checked for a sane-looking result. +The plot below shows a typical symmetrical FIR impulse response. .. figure:: circular_filters.png :width: 600 - Filter coefficients for the circular array + Filter coefficients for the circular array. Line array ========== - -The circular arrays have the nice characteristic of nearly similar beam -pattern to any direction. As exercise compare the beam patterns of a -4 mic line array to 0 degrees azimuth steer vs. 90 or -90 degrees. + +The circular arrays have nearly identical beam patterns in any direction. As +an exercise, compare the beam patterns of a 4 mic line array to a 0 degrees +azimuth steer vs. 90 or -90 degrees. Limitations =========== -The above examples defaulted to N microphones to single channel -output. However due to a current limitation in SOF the pipeline the -PCM and DAI need to have the same word length. The limitation will be -addressed in a next release of SOF. +The above examples defaulted to N microphones to a single channel output. +However, due to a current limitation in the SOF pipeline, the PCM and DAI +must have the same word length. This limitation will be addressed in a future +SOF release. -As workaround the beamformer can duplicate it's output channel to -needed number of channels and/or there can be several beams in the +As a workaround, the beamformer can duplicate its output channel to +the needed number of channels; there can also be several beams in the design for different output channels. The latter is actually preferred -for generic stereo capture PCM in typical notebooks. The typical array +for the generic stereo capture PCM in typical notebooks. The typical array dimensions do not provide much subjective stereo sensation. Dual mono example ----------------- -A complete dual mono 0 degree azimuth beamformer could be designed and -exported with script. The beam characteristics are those of 50 mm -spaced pair but the setting of num_output_channels and -output_channel_mix alter the configuration of output mixer of TDFB. +A complete dual mono 0 degree azimuth beamformer can be designed and +exported with a script. The beam characteristic is a 50 mm spaced pair but +the ``num_output_channels`` and ``output_channel_mix`` settings alter the +TDFB output mixer configuration. .. code-block:: octave @@ -491,15 +480,14 @@ output_channel_mix alter the configuration of output mixer of TDFB. Example with two beams ---------------------- -This example creates for left channel a -10 degree beam and for right -channel a +10 degrees azimuth beam. It's quite suitable for notebooks -with emphasis for user direction (and opposite due to rotational -symmetry of line array) and still noticeable channel separation. +The following example creates a -10 degree beam for the left channel and a ++10 degree azimuth beam for the right channel. It's quite suitable for notebooks with an emphasis on user direction (and opposite due to rotational +symmetry of line array) and still have a noticeable channel separation. -The procedure uses bf_merge() to combine bf1 and bf2 designs. The -different out_channel_mix vectors does summing of the filters to -proper channels. The filenames are redefined to avoid to overwrite the -single beam files. +The procedure uses ``bf_merge()`` to combine bf1 and bf2 designs. The +different ``out_channel_mix`` vectors sum the filters to the proper +channels. The filenames are redefined to avoid overwriting the single beam +files. .. code-block:: octave @@ -542,26 +530,23 @@ single beam files. .. figure:: two_beams_left.png :width: 600 - Beam pattern for the left channel + Beam pattern for the left channel. - - .. figure:: two_beams_right.png :width: 600 - Beam pattern for thr right channel + Beam pattern for the right channel. Simulation ********** -Measurement in anechoic chamber is recommended for validation. A quick -check is however available to check correctness of the configuration -blob and C code version TDFB operation. +Measurement in an anechoic chamber is recommended for validation. A quick +check, however, is available to validate the configuration blob and C code +version TDFB operation. -The script tdbf_test.m does a beam patten test. To test own beamformer -design the proper file name need to be edited to test-placback.m4 -(currently coef_line2_50mm_pm90deg_48khz.m4) and the test topologies -regenerated. +The script ``tdbf_test.m`` performs a beam patten test. To test your own beamformer design, the proper file name must be edited to ``test-placback.m`` +(currently it is ``coef_line2_50mm_pm90deg_48khz.m4``) and the test +topologies must be regenerated. .. code-block:: bash @@ -572,7 +557,7 @@ regenerated. octave --gui & tdfb_test -This simulation is emprical and executed with testbench. The previous -bf_design() call for the array created the sine rotation, diffuse +This simulation is empirical and executed with testbench. The previous +``bf_design()`` call for the array created the sine rotation, diffuse field, and random field waveform data files that the simulation run used. The theoretical and simulated beam patterns should match. From 126777ead0750334b756440891ce5aa425b66ca2 Mon Sep 17 00:00:00 2001 From: Deb Taylor Date: Fri, 6 Nov 2020 12:13:51 -0500 Subject: [PATCH 054/290] Minor edits to topology DSP and platforms docs Signed-off-by: Deb Taylor --- developer_guides/topology/topology.rst | 22 +++++++++---------- .../commons/multicore-processing.rst | 3 +-- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/developer_guides/topology/topology.rst b/developer_guides/topology/topology.rst index 30101683..d2f7a4ab 100644 --- a/developer_guides/topology/topology.rst +++ b/developer_guides/topology/topology.rst @@ -298,10 +298,10 @@ where: ------------------ The topology file can specify on which DSP core a pipeline or component will -be scheduled on. +be scheduled. -To specify the DSP core for a pipeline, the token SOF_TKN_SCHED_CORE is used, in -tools/topology/m4/pipeline.m4: +To specify the DSP core for a pipeline, use the SOF_TKN_SCHED_CORE token +located in tools/topology/m4/pipeline.m4: .. code-block:: @@ -310,15 +310,15 @@ tools/topology/m4/pipeline.m4: ` SOF_TKN_SCHED_CORE' STR($4) ... -Then specify this 'core' in your pipeline definition, e.g. in +Then specify this 'core' in your pipeline definition, such as in tools/topology/sof/pipe-dai-playback.m4: .. code-block:: W_PIPELINE(N_DAI_OUT, SCHEDULE_PERIOD, SCHEDULE_PRIORITY, SCHEDULE_CORE, SCHEDULE_TIME_DOMAIN, pipe_dai_schedule_plat) -To specify the DSP core for a component/widget, the token SOF_TKN_COMP_CORE_ID -is used, e.g. in tools/topology/m4/pga.m4: +To specify the DSP core for a component/widget, use the SOF_TKN_COMP_CORE_ID +token located in tools/topology/m4/pga.m4: .. code-block:: @@ -328,8 +328,8 @@ is used, e.g. in tools/topology/m4/pga.m4: ... -2. How to create a new topology? -******************************** +2. Create a new topology +************************ Following sections will show how to define single and multipipeline topologies. @@ -597,8 +597,8 @@ The graph below shows the topology defined in Section 3.1. .. image:: images/tplg2.png -3. Debugging topology -********************* +3. Debug topology +***************** SOF topology files include debug.m4 with couple of simple macros to output data. These are used for extracting information from dai_add, @@ -648,4 +648,4 @@ actually push both messages to a dot file: .. _here: https://www.alsa-project.org/main/index.php/ALSA_topology .. _SOFT: https://github.com/thesofproject/soft -.. comment "master" has been replaced with "main" + diff --git a/platforms/intel-cavs/commons/multicore-processing.rst b/platforms/intel-cavs/commons/multicore-processing.rst index 818fb464..eaa0280f 100644 --- a/platforms/intel-cavs/commons/multicore-processing.rst +++ b/platforms/intel-cavs/commons/multicore-processing.rst @@ -58,6 +58,5 @@ stop**. .. note:: The kernel also needs to enable cores on the host side, before even sending the ``SOF_IPC_PM_CORE_ENABLE`` IPC to the FW. - For details on to specify DSP core in topology file, refer to the - topology documentation :ref:`DSP Core Index `. + For details on how to specify the DSP core in the topology file, refer to the topology documentation, :ref:`DSP Core Index `. From 798b889a4e2267bef3548eaeb351b3584cbb1a5a Mon Sep 17 00:00:00 2001 From: Fred Oh Date: Thu, 12 Nov 2020 12:19:57 -0800 Subject: [PATCH 055/290] ktest: add cleaning up old kernel modules Under current ktest, user needs to clean up old kernel modules manually. Signed-off-by: Fred Oh --- .../setup/setup_ktest_environment.rst | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/getting_started/setup/setup_ktest_environment.rst b/getting_started/setup/setup_ktest_environment.rst index 8b4c244c..1c892ec2 100644 --- a/getting_started/setup/setup_ktest_environment.rst +++ b/getting_started/setup/setup_ktest_environment.rst @@ -267,3 +267,19 @@ detection only works with a UART, not over SSH, so you will have to By having multiple worktrees and configs, you can run tests in parallel on different machines on the same kernel or different branches. + +10. Clean up /lib/modules +------------------------- + +Ktest creates a separate module directory per kernel version. +User needs to clean up old module directory periodically. + +.. code-block:: bash + + $ ls -al /lib/modules + drwxrwxr-x 3 ubuntu ubuntu 4096 Sep 28 15:07 5.9.0-rc4-test+ + drwxrwxr-x 3 ubuntu ubuntu 4096 Sep 24 11:06 5.9.0-rc5-test+ + drwxrwxr-x 3 ubuntu ubuntu 4096 Oct 5 16:39 5.9.0-rc6-test+ + drwxrwxr-x 3 ubuntu ubuntu 4096 Oct 14 21:42 5.9.0-rc7-test+ + drwxrwxr-x 3 ubuntu ubuntu 4096 Nov 2 12:16 5.9.0-rc8-test+ + From cd172e984713c704b45d18388eea56215021cd9c Mon Sep 17 00:00:00 2001 From: Marc Herbert Date: Thu, 12 Nov 2020 01:05:29 +0000 Subject: [PATCH 056/290] ktest: add grub-reboot cheat sheet I found all grub-reboot guides either too long or too short or confusing or all of the above :-) Signed-off-by: Marc Herbert --- .../setup/setup_ktest_environment.rst | 62 ++++++++++++++++++- 1 file changed, 59 insertions(+), 3 deletions(-) diff --git a/getting_started/setup/setup_ktest_environment.rst b/getting_started/setup/setup_ktest_environment.rst index 1c892ec2..01e15d10 100644 --- a/getting_started/setup/setup_ktest_environment.rst +++ b/getting_started/setup/setup_ktest_environment.rst @@ -59,15 +59,71 @@ working kernel if your changes fail to boot. # Use your text editor of choice. sudo emacs /etc/default/grub + sudo update-grub Add ``GRUB_DISABLE_SUBMENU=y`` to the end and save. +Sub-menus confuse ktest. + +5. Get familiar with grub-reboot +-------------------------------- + +ktest relies on grub-reboot. grub-reboot lets you try a freshly built +kernel *only once* and then boot immediately a "safe" kernel again +without interacting with the boot menu: a simple power cycle is +enough. It's a must have for testing development kernels that may not +fully boot. + +In case something goes wrong with ktest, being familiar with grub-reboot +may save you interacting with the boot menu or even better: it may save +you making your system unbootable by accident. Understanding how +grub-reboot works is required to fully understand ktest +configuration. It's much easier to discover grub-reboot alone than when +entangled with ktest. + +There's a lot of grub-reboot documentation online and offline but +apparently no good and very short cheat sheet so here is one below. For +more details search the documentation of your Linux distribution. The +commands below have been tested on Ubuntu 20.04; they should be nearly +identical for most Linux distributions. + +.. code-block:: bash + + # Add/remove entries in grub.cfg after making changes in /boot/ + # grub.cfg is generated, don't edit it! + update-grub + + # See which GRUB entry was booted + cat /proc/cmdline + + # grub-reboot requires "unharcoding" GRUB_DEFAULT + printf 'GRUB_DEFAULT=saved\n' >> /etc/default/grub + update-grub -5. Create new grub entry ------------------------- +Warning: ``update-grub`` does not care about menuentry order and will +mess up what the numbers below point to! .. code-block:: bash - sudo update-grub + # Show the currently selected menuentry + grub-editenv list + => saved_entry=6 + + # Show all, numbered kernel choices without (re)booting + awk '/^menuentry/ { print i++, '\t', $0 }' /boot/grub/grub.cfg + => 5 menuentry ... + => 6 menuentry 'Ubuntu, with Linux 5.4.0-53-generic' --class ubuntu ... + => 7 menuentry ... + + # Attempt to boot menuentry 4 only once + grub-reboot 4; grub-editenv list + => saved_entry=6 + => next_entry=4 + reboot + + # Switch to menuentry number 4 as the new "safe" kernel + grub-set-default 4; grub-editenv list + => saved_entry=4 + 6. Install openssh-server ------------------------- From fa01e09f6c1b43314ecb16e81f04f3ff4bf9b89d Mon Sep 17 00:00:00 2001 From: Curtis Malainey Date: Tue, 8 Dec 2020 15:51:50 -0800 Subject: [PATCH 057/290] algos: update algorithm status Update status of algorithm integration Signed-off-by: Curtis Malainey --- algos/index.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/algos/index.rst b/algos/index.rst index 883bb2d7..34776ba9 100644 --- a/algos/index.rst +++ b/algos/index.rst @@ -17,10 +17,10 @@ build pipelines. "Acoustical Echo Cancellation (mockup)", "Attenuates speaker originated acoustical coupling in microphone capture signal", "Yes", "N/A", "Planned", "1.6" "Asynchronous sample rate conversion", "Converts between common sample rates and connects pipelines with different clock domains", "Yes", "Xtensa HiFi3", "Upstream", "1.5" "Channel selector", "Copies the selected channel from the source buffer to the sink buffer", "Yes", "N/A", "Upstream", "1.4" - "Crossover", "Splits up audio into at most four different bands for individual processing", "Yes", "No", "Planned", "" - "DCBlocker", "Simple highpass filter to remove DC components from audio", "Yes", "N/A", "Planned", "" + "Crossover", "Splits up audio into at most four different bands for individual processing", "Yes", "(Possible via IIR)", "Upstream", "1.5" + "DCBlocker", "Simple highpass filter to remove DC components from audio", "Yes", "N/A", "Upstream", "1.4" "Demultiplexer", "Copies PCM sample frames from one source buffer to multiple sink buffers with configurable channels", "Yes", "N/A", "Upstream", "1.4" - "Dynamic Range Processor", "Compresses and expands an audio signal to bring out quiet sounds and dampening loud sounds", "Yes", "Yes", "Planned", "" + "Dynamic Range Processor", "Compresses and expands an audio signal to bring out quiet sounds and dampening loud sounds", "Yes", "Yes", "In Progress", "1.7 (expected)" "FIR equalizer", "Enhances frequency response with a finite impulse response filter, e.g. improve speaker sound", "Yes", "Xtensa HiFi3", "Upstream", "1.4" "IIR equalizer", "Enhances frequency response with an infinite impulse response filter, e.g. cancel DC component or improve speaker sound", "Yes", "Xtensa HiFi3", "Upstream", "1.4" "Mixer", "Sums with unity gain and saturation source buffers of multiple pipelines to a single output sink buffer", "Yes", "No", "Upstream", "1.0" From 913aec83b8777d96416b79695f80dca307d303d3 Mon Sep 17 00:00:00 2001 From: Deb Taylor Date: Thu, 10 Dec 2020 07:58:15 -0500 Subject: [PATCH 058/290] Update release number and date. Signed-off-by: Deb Taylor --- release.rst | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/release.rst b/release.rst index eb79d7ff..a6097bc8 100644 --- a/release.rst +++ b/release.rst @@ -26,13 +26,11 @@ kernel, and documentation. Download the source code as a zip or tar.gz file: Source and Binary Releases -------------------------- -The latest SOF release is v1.5.1 (June 2020). +The latest SOF release is v1.6.1 (December 2020). -https://github.com/thesofproject/sof/releases/tag/v1.5.1 - -Firmware and SDK tool source code and binary releases are located -on GitHub. The GitHub release page also lists details such as new -features and new platforms: +View new feature information and release downloads for the latest and +previous releases on GitHub. Firmware and SDK tool source code and binary +releases are located here as well: https://github.com/thesofproject/sof/releases From 15833c775b8d483524fcd96517cb3654b20eccca Mon Sep 17 00:00:00 2001 From: Marc Herbert Date: Tue, 15 Dec 2020 05:47:31 +0000 Subject: [PATCH 059/290] ktest: un-hardcode $LOCALVERSION Among other meaninglessness sins, 'test' is not SOF- or even audio- specific and ungreppable. Don't change it the sample configuration (yet?) but at least give the option to change it. This requires dropping the minus sign from '-test' example because update-grub uses minus as a separator and ktest fails with: Could not find ''Ubuntu, with Linux -test'' Also add some comments explaining why things work despite the hack where /lib/modules/x.y.z-LOCALVERSION does not match /boot/vmlinuz-$LOCALVERSION Signed-off-by: Marc Herbert --- .../setup/setup_ktest_environment.rst | 38 +++++++++++++++---- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/getting_started/setup/setup_ktest_environment.rst b/getting_started/setup/setup_ktest_environment.rst index 01e15d10..8a85d8c2 100644 --- a/getting_started/setup/setup_ktest_environment.rst +++ b/getting_started/setup/setup_ktest_environment.rst @@ -257,35 +257,57 @@ If you don't know what options are needed, you can start using configurations ma Use make proper since ktest.pl requires the source directory to be clean. All compilation happens in the -build directory. -6. Edit configuration as needed -------------------------------- +6. Edit ktest configuration as needed +------------------------------------- Save the following in sof-dev.conf. .. code-block:: perl + # The difference between config variables (:=) and ktest options (=) and a + # few other things are explained in tools/testing/ktest/examples/sample.conf + MACHINE = 192.168.1.205 CLEAR_LOG = 1 SSH_USER = root THIS_DIR := ${PWD} + # BUILD_DIR is the source directory BUILD_DIR = ${THIS_DIR}/sof-dev + # OUTPUT_DIR is the actual build directory OUTPUT_DIR = ${THIS_DIR}/sof-dev-build BUILD_TARGET = arch/x86/boot/bzImage - TARGET_IMAGE = /boot/vmlinuz-test - LOCALVERSION = -test + + # ktest requires LOCALVERSION. This is normally a '-something' suffix like + # in 'vmlinuz-5.10-rc5-something'. Let's (ab)use it as the full version so + # we have a constant 'vmlinuz-something' filename and we don't have to + # make changes in /boot/ all the time. + # update-grub will complain but work anyway. + LOCALVERSION = test + TARGET_IMAGE = /boot/vmlinuz-${LOCALVERSION} + BUILD_OPTIONS = -j8 LOG_FILE = ${OUTPUT_DIR}/sof-dev.log CONSOLE = cat ${THIS_DIR}/sof-dev-cat POWER_CYCLE = echo Power cycle the machine now and press ENTER; read a #set below to help ssh connection to close after sending reboot command REBOOT = ssh -o 'ProxyCommand none' $SSH_USER@$MACHINE 'sudo reboot > /dev/null &' + + # This how ktest finds which menuentry number to pass to grub-reboot GRUB_FILE = /boot/grub/grub.cfg - GRUB_MENU = Ubuntu, with Linux test - #GRUB_MENU = ubilinux GNU/Linux, with Linux test - #GRUB_MENU = GalliumOS GNU/Linux, with Linux test + GRUB_MENU = Ubuntu, with Linux ${LOCALVERSION} + #GRUB_MENU = ubilinux GNU/Linux, with Linux ${LOCALVERSION} + #GRUB_MENU = GalliumOS GNU/Linux, with Linux ${LOCALVERSION} GRUB_REBOOT = grub-reboot REBOOT_TYPE = grub2 - POST_INSTALL = ssh -o 'ProxyCommand none' $SSH_USER@$MACHINE 'sudo /usr/sbin/mkinitramfs -o /boot/initrd.img-test $KERNEL_VERSION' + + # update-initramfs does not support any "version-less" 'vmlinuz-test' because it + # does not tell where to find modules like '/lib/modules/5.10.0-rc5test+' + # So we have to use a lower level, more explicit command like: + # mkinitramfs -o initrdfile 5.10.0-rc5test+ + # ktest finds the real KERNEL_VERSION thanks to "make O=${OUTPUT_DIR} + # kernelrelease" + POST_INSTALL = ssh -o 'ProxyCommand none' $SSH_USER@$MACHINE sudo /usr/sbin/mkinitramfs -o /boot/initrd.img-${LOCALVERSION} $KERNEL_VERSION + #REBOOT_TYPE = script #REBOOT_SCRIPT = ssh $SSH_USER@$MACHINE "sed -i 's|^default.*$|default test|' /boot/loader/loader.conf" From aed37cc567ad5db6663e4b4bd7897486caa7cc93 Mon Sep 17 00:00:00 2001 From: Jaska Uimonen Date: Thu, 17 Dec 2020 10:26:25 +0200 Subject: [PATCH 060/290] build-guide: Add note for using external key in signing Add info how the set environment variable for using external key in signing. Signed-off-by: Jaska Uimonen --- getting_started/build-guide/build-from-scratch.rst | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/getting_started/build-guide/build-from-scratch.rst b/getting_started/build-guide/build-from-scratch.rst index 7bf133d9..31759975 100644 --- a/getting_started/build-guide/build-from-scratch.rst +++ b/getting_started/build-guide/build-from-scratch.rst @@ -354,6 +354,18 @@ builds with -r and speed up the build with -j [n] ./scripts/xtensa-build-all.sh -d -r apl ./scripts/xtensa-build-all.sh -d -r -j 4 apl +.. note:: + xtensa-build-all.sh script uses ``rimage`` to build the final firmware image. + ``rimage`` uses by default a public key included in sof repo for signing. + However, if you need to use some other external key for signing you can + specify the path to your key as environment variable before invoking the build: + + .. code-block:: bash + + export PRIVATE_KEY_OPTION=-DRIMAGE_PRIVATE_KEY=/path_to_key/private.pem + + The same export mechanism should work also when building with Docker. + Incremental builds ------------------ From 8da48f1ea4c63f355dee6d5f5ef61d58f09c01f2 Mon Sep 17 00:00:00 2001 From: Pierre-Louis Bossart Date: Tue, 27 Oct 2020 15:20:52 -0500 Subject: [PATCH 061/290] intel_debug: add missing newline Git is not happy without it Signed-off-by: Pierre-Louis Bossart --- getting_started/intel_debug/introduction.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/getting_started/intel_debug/introduction.rst b/getting_started/intel_debug/introduction.rst index 8129bfef..830aef5d 100644 --- a/getting_started/intel_debug/introduction.rst +++ b/getting_started/intel_debug/introduction.rst @@ -126,4 +126,4 @@ drivers and should work when changing the ``dsp_driver`` parameter. The selection of firmware, topology, and UCM files is based on platform capabilities, codec names, and DMI options. While the SOF team and the community try to cover all possible cases, errors will happen when the -wrong file is selected at any of the three layers. \ No newline at end of file +wrong file is selected at any of the three layers. From 1bd5c84226a72471516dc71b0d32626f0918d6a8 Mon Sep 17 00:00:00 2001 From: Pierre-Louis Bossart Date: Tue, 27 Oct 2020 15:26:07 -0500 Subject: [PATCH 062/290] intel_debug: add sections on ME dependency This was missed in earlier patches and a key dependency Signed-off-by: Pierre-Louis Bossart --- getting_started/intel_debug/introduction.rst | 13 +++++++++++++ getting_started/intel_debug/suggestions.rst | 9 +++++++++ 2 files changed, 22 insertions(+) diff --git a/getting_started/intel_debug/introduction.rst b/getting_started/intel_debug/introduction.rst index 830aef5d..e685b4af 100644 --- a/getting_started/intel_debug/introduction.rst +++ b/getting_started/intel_debug/introduction.rst @@ -104,6 +104,19 @@ installing their own firmware. Notable exceptions include Google Chromebooks and Up2/Up-Extreme boards, where the 'community key' is used. +The Intel ME (Management Engine) is responsible for authentication of +the firmware, be it signed by an Intel production key (consumer +products), a community key (open development systems and Chromebooks +since GeminiLake) or an OEM key. If the Intel ME is disabled by an +OEM, or disabled by user-accessible BIOS options, the firmware +authentication will fail and the firmware boot will not complete. If +the ME was disabled by the OEM, the only solution will be to fall-back +to the legacy HDAudio driver. If the ME was disabled by the user, they +will have to re-enable it. There is unfortunately no documented +mechanism for the Linux kernel to query if the firmware authentication +is enabled or not, which means dmesg logs cannot be provided to alert +the user to a ME configuration issue. + 2. Topology file ---------------- diff --git a/getting_started/intel_debug/suggestions.rst b/getting_started/intel_debug/suggestions.rst index 52058861..aa5ae136 100644 --- a/getting_started/intel_debug/suggestions.rst +++ b/getting_started/intel_debug/suggestions.rst @@ -27,6 +27,15 @@ enable two of the four speakers present. All of these cases are orthogonal to SOF issues in that the SOF driver cannot compensate for codec driver problems on its own. +Make sure the ME is enabled +*************************** + +If the ME is disabled by the OEM or the user, firmware authentication +will fail without any explicit feedback provided to the user. In case +of any authentication failure, the user should verify that the ME is +not disabled, more information about the ME in the "firmware binary" +section above. + Test at the ALSA 'hw' device level ********************************** From e5abdaae81404a3587b0439ee5ebc6874aeaa780 Mon Sep 17 00:00:00 2001 From: Pierre-Louis Bossart Date: Tue, 19 Jan 2021 16:26:16 -0600 Subject: [PATCH 063/290] intel_debug: add paragraph on codec/amplifier configurations Inspired by https://bugzilla.kernel.org/show_bug.cgi?id=210633 Signed-off-by: Pierre-Louis Bossart --- getting_started/intel_debug/suggestions.rst | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/getting_started/intel_debug/suggestions.rst b/getting_started/intel_debug/suggestions.rst index aa5ae136..afbd62cb 100644 --- a/getting_started/intel_debug/suggestions.rst +++ b/getting_started/intel_debug/suggestions.rst @@ -27,6 +27,22 @@ enable two of the four speakers present. All of these cases are orthogonal to SOF issues in that the SOF driver cannot compensate for codec driver problems on its own. +Try booting into Windows first, then reboot into Linux +****************************************************** + +On some platforms, e.g. with an HDaudio codec connected to amplifiers +over an I2C/I2S link, the codec driver needs to perform a set of +amplifier configurations. This is often handled in Windows but not in +Linux codec drivers. A classic example of such issues is when +headphone playback works, but speaker playback does not (or not on all +speakers). + +This sort of issues will also happen with the HDaudio legacy driver +and are not SOF bugs proper. To fix such issues, it is necessary to +either get direct support from the codec vendor, or alternatively to +reverse-engineer the missing configuration by snooping HDaudio +commands in a Windows environment. + Make sure the ME is enabled *************************** From 95979badb12fbcaccee717bc84b130cc15a74366 Mon Sep 17 00:00:00 2001 From: Guennadi Liakhovetski Date: Fri, 16 Oct 2020 13:53:45 +0200 Subject: [PATCH 064/290] Add documentation for building and running SOF under Zephyr SOF can be built as a Zephyr application. This document describes the process. Signed-off-by: Guennadi Liakhovetski --- .../build-guide/build-with-zephyr.rst | 84 +++++++++++++++++++ getting_started/index.rst | 1 + 2 files changed, 85 insertions(+) create mode 100644 getting_started/build-guide/build-with-zephyr.rst diff --git a/getting_started/build-guide/build-with-zephyr.rst b/getting_started/build-guide/build-with-zephyr.rst new file mode 100644 index 00000000..509e1a78 --- /dev/null +++ b/getting_started/build-guide/build-with-zephyr.rst @@ -0,0 +1,84 @@ +.. _build-with-zephyr: + +Build SOF with `Zephyr `__ +##################### + +.. contents:: + :local: + :depth: 3 + +This guide describes the process of building and running |SOF| as a Zephyr +application. + +.. note:: + + The example uses ``$ZEPHYR_WORKSPACE`` as the working directory. + +Preparation +*********** + +The easiest way to build Zephyr is by using its recommended toolchain. Follow +instructions in the +`Install a Toolchain `__ +guide for toolchain installation details. + +Check out and build +******************* + +Zephyr uses ``west`` as a source management and building system. Follow the +Zephyr +`Getting Started `__ +guide for dependencies and for ``west`` installation. + +Initialize a new ``west`` repository + +.. code-block:: bash + + mkdir $ZEPHYR_WORKSPACE + cd $ZEPHYR_WORKSPACE + west init + west update + +This checks out all the Zephyr sources, including SOF and rimage. After that a +firmware image can be built and signed: + +.. code-block:: bash + + west build -p -d build-apl -b intel_adsp_cavs15 zephyr/samples/audio/sof/ + west sign -d build-apl -t rimage -- -k modules/audio/sof/keys/otc_private_key.pem + +.. note:: + +The above uses the ``rimage`` signing tool, but it isn't built as a part of the +process. If needed it can be built with + +.. code-block:: bash + + mkdir build-rimage + cd build-rimage + cmake ../modules/audio/sof/zephyr/ext/rimage/ + make + +Then you can add ``-p build-rimage/`` to the list of ``west sign`` parameters +above (before the ``--`` separator). + +.. note:: + + If you need a different SOF version than the one automatically checked out + by ``west``, you can change to ``modules/audio/sof`` and use ``git`` to + select your preferred version. You need at least version 1.6 to use it with + Zephyr. Make sure you branch or tag your code in git otherwise a + future ``west update`` may lose it. See the ``west`` user guide. + +Running +******* + +After the above a firmware image is located at ``build-apl/zephyr/zephyr.ri``, +as usual it can be copied to the usual location on the target systen, e.g. if +built natively + +.. code-block:: bash + + sudo cp build-apl/zephyr/zephyr.ri /lib/firmware/intel/sof/community/sof-cnl.ri + +For firmware log extraction use zephyr/boards/xtensa/intel_adsp_cavs15/tools/logtool.py diff --git a/getting_started/index.rst b/getting_started/index.rst index 88d320fb..9dac6d6d 100644 --- a/getting_started/index.rst +++ b/getting_started/index.rst @@ -19,6 +19,7 @@ is always preffered. build-guide/build-from-scratch build-guide/build-with-docker build-guide/build-3rd-party-toolchain + build-guide/build-with-zephyr Setting up SOF on hardware ************************** From 55bd95190898e3f2180824a89e165516eb6cec05 Mon Sep 17 00:00:00 2001 From: Deb Taylor Date: Mon, 25 Jan 2021 12:57:04 -0500 Subject: [PATCH 065/290] Grammatical edits to building SOF with Zephyr Signed-off-by: Deb Taylor --- .../build-guide/build-with-zephyr.rst | 53 +++++++++---------- getting_started/index.rst | 24 ++++----- 2 files changed, 36 insertions(+), 41 deletions(-) diff --git a/getting_started/build-guide/build-with-zephyr.rst b/getting_started/build-guide/build-with-zephyr.rst index 509e1a78..8c883461 100644 --- a/getting_started/build-guide/build-with-zephyr.rst +++ b/getting_started/build-guide/build-with-zephyr.rst @@ -1,7 +1,7 @@ .. _build-with-zephyr: -Build SOF with `Zephyr `__ -##################### +Build SOF with `Zephyr `_ +##################################################### .. contents:: :local: @@ -12,25 +12,23 @@ application. .. note:: - The example uses ``$ZEPHYR_WORKSPACE`` as the working directory. + The following example uses ``$ZEPHYR_WORKSPACE`` as the working + directory. -Preparation -*********** +Prepare +******* -The easiest way to build Zephyr is by using its recommended toolchain. Follow -instructions in the -`Install a Toolchain `__ -guide for toolchain installation details. +The easiest way to build Zephyr is to use its recommended toolchain. Follow +instructions in +`Install a Toolchain `_ for details. Check out and build ******************* Zephyr uses ``west`` as a source management and building system. Follow the -Zephyr -`Getting Started `__ -guide for dependencies and for ``west`` installation. +Zephyr `Getting Started `_ guide for dependencies and for ``west`` installation. -Initialize a new ``west`` repository +Initialize a new ``west`` repository: .. code-block:: bash @@ -39,7 +37,7 @@ Initialize a new ``west`` repository west init west update -This checks out all the Zephyr sources, including SOF and rimage. After that a +This checks out all Zephyr sources, including SOF and rimage. Next, a firmware image can be built and signed: .. code-block:: bash @@ -47,10 +45,8 @@ firmware image can be built and signed: west build -p -d build-apl -b intel_adsp_cavs15 zephyr/samples/audio/sof/ west sign -d build-apl -t rimage -- -k modules/audio/sof/keys/otc_private_key.pem -.. note:: - -The above uses the ``rimage`` signing tool, but it isn't built as a part of the -process. If needed it can be built with +Note that the above uses the ``rimage`` signing tool, but it isn't built as +a part of the process. If needed it can be built with: .. code-block:: bash @@ -64,21 +60,20 @@ above (before the ``--`` separator). .. note:: - If you need a different SOF version than the one automatically checked out - by ``west``, you can change to ``modules/audio/sof`` and use ``git`` to - select your preferred version. You need at least version 1.6 to use it with - Zephyr. Make sure you branch or tag your code in git otherwise a - future ``west update`` may lose it. See the ``west`` user guide. + If you need a different SOF version than the one automatically checked + out by ``west``, you can change to ``modules/audio/sof`` and use ``git`` + to select your preferred version. You need at least version 1.6 to use + it with Zephyr. Make sure you branch or tag your code in git; otherwise, + a future ``west update`` may lose it. See the ``west`` user guide. -Running -******* +Run +*** -After the above a firmware image is located at ``build-apl/zephyr/zephyr.ri``, -as usual it can be copied to the usual location on the target systen, e.g. if -built natively +After the above instructions are completed, a firmware image is located at ``build-apl/zephyr/zephyr.ri``. It can be copied to the usual location on the +target system. For example, if it is built natively, enter the following: .. code-block:: bash sudo cp build-apl/zephyr/zephyr.ri /lib/firmware/intel/sof/community/sof-cnl.ri -For firmware log extraction use zephyr/boards/xtensa/intel_adsp_cavs15/tools/logtool.py +For firmware log extraction, use ``zephyr/boards/xtensa/intel_adsp_cavs15/tools/logtool.py``. diff --git a/getting_started/index.rst b/getting_started/index.rst index 9dac6d6d..39552eea 100644 --- a/getting_started/index.rst +++ b/getting_started/index.rst @@ -3,15 +3,15 @@ Getting Started Guides ###################### -New to SOF or doing something for the first time ? Read on.... +Refer to the following getting started guides if you are new to SOF or if you are performing a task for the first time. -Building SOF -************ +Build SOF +********* -SOF can be built natively on a host PC or within a container. Use the container -method if the version of your distro is more than 6 months old. The SOF SDK -uses recent version of some external dependencies so the current distro release -is always preffered. +SOF can be built natively on a host PC or within a container. Use the +container method if the version of your distro is more than six months old. +The SOF SDK uses a recent version of some external dependencies so the +current distro release is always preferred. .. toctree:: :maxdepth: 1 @@ -21,10 +21,10 @@ is always preffered. build-guide/build-3rd-party-toolchain build-guide/build-with-zephyr -Setting up SOF on hardware -************************** +Set up SOF on hardware +********************** -SOF runs on a variety of different devices with varying audio capabilities so +SOF runs on a variety of devices with varying audio capabilities so instructions may differ between devices. .. toctree:: @@ -34,8 +34,8 @@ instructions may differ between devices. setup/setup_up_2_board setup/setup_ktest_environment -Debugging Audio issues on Intel platforms -***************************************** +Debug Audio issues on Intel platforms +************************************* Intel platforms rely on different versions of DSP and audio hardware interfaces. The following sections provide hints for integrators and From ea96e7b2f39bce882092845412bf3ab3272d28d6 Mon Sep 17 00:00:00 2001 From: Deb Taylor Date: Mon, 25 Jan 2021 12:06:57 -0500 Subject: [PATCH 066/290] Grammatical edits to ME debug info Signed-off-by: Deb Taylor --- getting_started/intel_debug/introduction.rst | 38 ++++++++++---------- getting_started/intel_debug/suggestions.rst | 32 ++++++++--------- 2 files changed, 32 insertions(+), 38 deletions(-) diff --git a/getting_started/intel_debug/introduction.rst b/getting_started/intel_debug/introduction.rst index e685b4af..6c8559c2 100644 --- a/getting_started/intel_debug/introduction.rst +++ b/getting_started/intel_debug/introduction.rst @@ -30,15 +30,15 @@ On Broadwell, HDMI/DP is handled by an HDaudio controller. On Baytrail/Cherrytrail and Braswell, the BIOS can enable two modes: -* HDAudio-based solution (similar to Broadwell) +* HDAudio-based solution (similar to Broadwell). * LPE HDMI Audio. This mode is used by the majority of tablets and low-cost - devices. It provides functionality similar to HDaudio, but with a different interface. This mode is enabled in Linux via the ``CONFIG_HDMI_LPE_AUDIO option``. + devices. It provides functionality similar to HDaudio, but with a different interface. This mode is enabled in Linux via the ``CONFIG_HDMI_LPE_AUDIO`` option. The DSP cannot control any of these interfaces because SOF does not support HDMI/DP on those devices. -On all of these `legacy` platforms, HDMI support is exposed in Linux as a +On all of these legacy platforms, HDMI support is exposed in Linux as a separate card. PCI devices (introduced after 2016) @@ -91,45 +91,43 @@ force the SOF Linux driver to be used. User space and filesystem requirements ************************************** -Selecting the SOF driver is not enough. Audio properly configured only if +Selecting the SOF driver is not enough. Audio is properly configured only if the following elements are present on the file system. 1. Firmware binary ------------------ The firmware file, ``/lib/firmware/intel/sof/sof-tgl.ri``, contains -all the DSP code and tables. On PCI devices, the firmware can only be +all DSP code and tables. On PCI devices, the firmware can only be signed by an Intel production key which prevents community users from installing their own firmware. Notable exceptions include Google -Chromebooks and Up2/Up-Extreme boards, where the 'community key' is +Chromebooks and Up2/Up-Extreme boards, where the *community key* is used. The Intel ME (Management Engine) is responsible for authentication of -the firmware, be it signed by an Intel production key (consumer +the firmware, whether it is signed by an Intel production key (consumer products), a community key (open development systems and Chromebooks since GeminiLake) or an OEM key. If the Intel ME is disabled by an OEM, or disabled by user-accessible BIOS options, the firmware authentication will fail and the firmware boot will not complete. If -the ME was disabled by the OEM, the only solution will be to fall-back -to the legacy HDAudio driver. If the ME was disabled by the user, they -will have to re-enable it. There is unfortunately no documented -mechanism for the Linux kernel to query if the firmware authentication -is enabled or not, which means dmesg logs cannot be provided to alert -the user to a ME configuration issue. +the ME is disabled by the OEM, the only solution is to fall-back +to the legacy HDAudio driver. If the ME is disabled by the user, the user +must re-enable it. Unfortunately, no documented mechanism exists for the +Linux kernel to query whether or not the firmware authentication is enabled, +which means `dmesg` logs cannot be provided to alert the user to an ME +configuration issue. 2. Topology file ---------------- -The topology file, -such as ``/lib/firmware/intel/sof-tplg/sof-hda-generic-2ch.tplg``, describes -the processing graph and controls to be instantiated by the SOF -driver. The topology can be regenerated and reconfigured with tools -but requires expert knowledge of ALSA/ASoC/topology frameworks. +The topology file, such as ``/lib/firmware/intel/sof-tplg/sof-hda-generic-2ch.tplg``, describes the processing graph and controls to +be instantiated by the SOF driver. The topology can be regenerated and +reconfigured with tools but requires expert knowledge of the ALSA/ASoC/topology frameworks. 3. UCM file ----------- -The UCM file, such as ``/usr/share/alsa/ucm2/sof-hda-dsp/``..., configures +The UCM file, such as ``/usr/share/alsa/ucm2/sof-hda-dsp/``, configures the controls exposed by the topology file and the external audio chips. UCM can be used in a terminal via the ``alsaucm`` command but will typically be used by audio servers such as PulseAudio or @@ -139,4 +137,4 @@ drivers and should work when changing the ``dsp_driver`` parameter. The selection of firmware, topology, and UCM files is based on platform capabilities, codec names, and DMI options. While the SOF team and the community try to cover all possible cases, errors will happen when the -wrong file is selected at any of the three layers. +wrong file is selected at any of the three layers. \ No newline at end of file diff --git a/getting_started/intel_debug/suggestions.rst b/getting_started/intel_debug/suggestions.rst index afbd62cb..7e74a1c2 100644 --- a/getting_started/intel_debug/suggestions.rst +++ b/getting_started/intel_debug/suggestions.rst @@ -15,10 +15,9 @@ when filing a bug. Disable SOF on PCI/HDaudio devices to test audio playback ********************************************************* -When audio issues occur, the first step is to check if the HDaudio legacy -is able to generate sound on speakers and headsets. This can be -accomplished by adding "options snd-intel-dspcfg dsp_driver=1" to -``/etc/modprobe.d/alsa-base.conf``. +When audio issues occur, first see if the HDaudio legacy can generate sound +on speakers and headsets. Accomplish this by adding "options +snd-intel-dspcfg dsp_driver=1" to ``/etc/modprobe.d/alsa-base.conf``. If no sound can be heard and jack detection is not functional, an HDaudio external codec configuration is likely. In some cases, the @@ -30,27 +29,25 @@ problems on its own. Try booting into Windows first, then reboot into Linux ****************************************************** -On some platforms, e.g. with an HDaudio codec connected to amplifiers +On some platforms, such as with an HDaudio codec connected to amplifiers over an I2C/I2S link, the codec driver needs to perform a set of amplifier configurations. This is often handled in Windows but not in Linux codec drivers. A classic example of such issues is when headphone playback works, but speaker playback does not (or not on all speakers). -This sort of issues will also happen with the HDaudio legacy driver -and are not SOF bugs proper. To fix such issues, it is necessary to -either get direct support from the codec vendor, or alternatively to -reverse-engineer the missing configuration by snooping HDaudio -commands in a Windows environment. +These types of issues also occur with the HDaudio legacy driver +and are not part of SOF bugs proper. To fix such issues, either obtain +direct support from the codec vendor, or reverse-engineer the missing +configuration by snooping HDaudio commands in a Windows environment. Make sure the ME is enabled *************************** If the ME is disabled by the OEM or the user, firmware authentication will fail without any explicit feedback provided to the user. In case -of any authentication failure, the user should verify that the ME is -not disabled, more information about the ME in the "firmware binary" -section above. +of any authentication failure, verify that the ME is not disabled. More +information about the ME is available in the "Firmware binary" section of :ref:`intel_debug_introduction`. Test at the ALSA 'hw' device level ********************************** @@ -59,8 +56,7 @@ When the legacy HDaudio driver produces audible sound without distortion and an SOF-based solution does not, user space configuration issues are possible. -The following commands can be used to check if the SOF driver is -functional at the hardware device level: +Use the following commands to check if the SOF driver is functional at the hardware device level: .. code-block:: @@ -84,7 +80,7 @@ Verify mixer settings A classic issue with Linux audio is that a mixer control value remains muted or with a volume set to zero. The ``alsamixer`` command can be used to check if any paths are disabled (represented as "m") or if the -volume settings not correct. +volume settings are not correct. Note that randomly playing with ALSA mixer settings can damage audio accessories, speakers, or your hearing. Never change mixer @@ -97,7 +93,7 @@ To avoid spamming all Linux users with audio-specific information, only critical errors are reported in the ``dmesg`` log. That information may not be enough to debug a specific issue, and the recommendation is to add the following options to the ``/etc/modprobe.d/sof-dyndbg.conf`` -file +file: .. code-block:: @@ -132,4 +128,4 @@ following command to extract DSP traces: .. code-block:: bash - sof-logger -t sof-tgl.ldc + sof-logger -t sof-tgl.ldc \ No newline at end of file From b72872b89a6555d024b5e006d981dfd70c7959a6 Mon Sep 17 00:00:00 2001 From: Deb Taylor Date: Mon, 25 Jan 2021 14:40:18 -0500 Subject: [PATCH 067/290] Updated copyright to 2021 Signed-off-by: Deb Taylor --- conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf.py b/conf.py index 14969018..9f975954 100644 --- a/conf.py +++ b/conf.py @@ -63,7 +63,7 @@ # General information about the project. project = u'SOF Project' -copyright = u'2020, SOF Project.' +copyright = u'2021, SOF Project.' author = u'SOF Project developers' # The version info for the project you're documenting, acts as replacement for From 41fea5d9562f18b4cda402a5d41765a85d5563a4 Mon Sep 17 00:00:00 2001 From: Marc Herbert Date: Tue, 26 Jan 2021 00:31:27 +0000 Subject: [PATCH 068/290] Convert .travis.yml to github actions "deploy" steps not converted yet. I have never seen them run, are they still in use? Either way this first and most important part can be merged already. Signed-off-by: Marc Herbert --- .github/workflows/pull-request.yml | 107 +++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 .github/workflows/pull-request.yml diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml new file mode 100644 index 00000000..9cdc1f21 --- /dev/null +++ b/.github/workflows/pull-request.yml @@ -0,0 +1,107 @@ +--- +# Tools that can save round-trips to github and a lot of time: +# +# yamllint -f parsable pull_request.yml +# pip3 install ruamel.yaml.cmd +# yaml merge-expand pull_request.yml exp.yml && +# diff -w -u pull_request.yml exp.yml +# +# github.com also has a powerful web editor that can be used without +# committing. + +name: Pull Requests + +# yamllint disable-line rule:truthy +on: + push: + branches: [master] + pull_request: + branches: [master] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# As of January 2021, no YAML anchors :-( +env: + ubuntu_base_deps: doxygen make default-jre graphviz cmake ninja-build + +jobs: + + supported-reqs: + + name: 'Supported scripts/requirements.txt' + runs-on: ubuntu-20.04 + + steps: + - uses: actions/checkout@v2 + + - name: apt-get install + run: sudo apt-get -y install $ubuntu_base_deps + + - name: PATH += .local/bin + run: echo "$HOME/.local/bin" >> $GITHUB_PATH + + - name: 'pip install -r scripts/requirements.txt' + run: pip install -r scripts/requirements.txt + + # No YAML anchors; this is copy/paste + - name: configure SOF doc + run: | + git clone https://github.com/thesofproject/sof + cmake -GNinja -S sof/doc -B _build_doxy + + # TODO: change the (bad) default value for SOF_DOC_BUILD in + # sof-docs/Makefile and remove this command line override + - name: build + run: | + make html VERBOSE=1 SOF_DOC_BUILD=_build_doxy + du -shc _build*/* + + lax: + + name: "PIP_IGNORE_INSTALLED=0 requirements-lax.txt" + runs-on: ubuntu-20.04 + # Makefile downgrades the Sphinx warnings, they are not errors any more + env: {LAX: 1} + steps: + - uses: actions/checkout@v2 + + - name: apt-get install base dependencies + run: sudo apt-get -y install $ubuntu_base_deps + + - name: temporary python3-pil HACK because github is out of date + run: sudo apt-get -y install libimagequant0 libwebpdemux2 && + wget http://security.ubuntu.com/ubuntu/ubuntu/pool/main/p/pillow/python3-pil_7.0.0-4ubuntu0.2_amd64.deb && + sudo dpkg -i python3-pil_*.deb + + - name: apt-get instead of pip + run: sudo apt-get -y install + python3-pip python3-setuptools python3-wheel + python3-sphinx python3-breathe python3-docutils + python3-sphinx-rtd-theme python3-sphinxcontrib.plantuml + + - name: PATH += .local/bin + run: echo "$HOME/.local/bin" >> $GITHUB_PATH + + # should be a no-op + - name: 'pip install -r scripts/requirements-lax.txt' + run: pip install -r scripts/requirements-lax.txt + + - name: config tweaks + run: | + # sphinx-build < 1.7 doesn't support "auto" and we're not sure + # all default modules are "thread-safe" + sed -i -e '/SPHINXBUILD/ s/-j *auto/-j 1/' Makefile + # We don't want plantUML to raise the contribution bar + sed -i -e 's/^\(plantuml_output_format *=\).*/\1 "none"/' conf.py + + # No YAML anchors; this is copy/paste + - name: configure SOF doc + run: | + git clone https://github.com/thesofproject/sof + cmake -GNinja -S sof/doc -B _build_doxy + + - name: build + run: | + make html VERBOSE=1 SOF_DOC_BUILD=_build_doxy + du -shc _build*/* From 2dd1e239cc8a7a61e76a164299f8e7079bb69bc7 Mon Sep 17 00:00:00 2001 From: Deb Date: Tue, 2 Feb 2021 10:05:12 -0500 Subject: [PATCH 069/290] Updated release date for SOF 1.6.1 Signed-off-by: Deb --- release.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) mode change 100644 => 100755 release.rst diff --git a/release.rst b/release.rst old mode 100644 new mode 100755 index a6097bc8..2e5a8d64 --- a/release.rst +++ b/release.rst @@ -26,7 +26,7 @@ kernel, and documentation. Download the source code as a zip or tar.gz file: Source and Binary Releases -------------------------- -The latest SOF release is v1.6.1 (December 2020). +The latest SOF release is v1.6.1 (January 2021). View new feature information and release downloads for the latest and previous releases on GitHub. Firmware and SDK tool source code and binary From 564de22f7b4d77b26f0d42c63caa5510fdb982bf Mon Sep 17 00:00:00 2001 From: Pan Xiuli Date: Thu, 28 Jan 2021 10:05:57 +0000 Subject: [PATCH 070/290] CI: disable Travis to avoid depoly conflict Will use GitHub Action to do deploy. Signed-off-by: Pan Xiuli --- .travis.yml | 68 ----------------------------------------------------- 1 file changed, 68 deletions(-) delete mode 100755 .travis.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100755 index bf708e63..00000000 --- a/.travis.yml +++ /dev/null @@ -1,68 +0,0 @@ -dist: focal - -before_install: - - sudo apt-get update -qq - - sudo apt-get install doxygen make default-jre graphviz cmake ninja-build - - -jobs: - include: - - - name: "Supported scripts/requirements.txt" - - language: python - python: "3.6" - - install: - - pip install -r scripts/requirements.txt - - script: &main_script - - pushd .. && git clone https://github.com/thesofproject/sof.git - && pushd sof/doc && cmake -GNinja . - - popd && popd - - make html VERBOSE=1 - - ls _build - - before_deploy: - - mkdir _build/latest - - mv -v _build/html/* _build/latest - - mv _build/latest _build/html - - touch _build/html/.nojekyll - - mv scripts/publish-README.md _build/html/README.md - - mv scripts/publish-index.html _build/html/index.html - - deploy: - - provider: pages - skip_cleanup: true - github_token: $GITHUB_TOKEN - repo: thesofproject/thesofproject.github.io - on: - branch: publish - local_dir: _build/html/ - target_branch: master - - - - name: "PIP_IGNORE_INSTALLED=0 requirements-lax.txt" - - language: minimal - - # Sphinx warnings are not errors any more - env: LAX=1 - - install: - - sudo apt -y install - python3-pip python3-setuptools python3-wheel - python3-sphinx python3-breathe python3-docutils - python3-sphinx-rtd-theme python3-sphinxcontrib.plantuml - - # Ideally, this pip3 command installs almost nothing. - - PIP_IGNORE_INSTALLED=0 pip3 install --user - -r scripts/requirements-lax.txt - - # sphinx-build < 1.7 doesn't support "auto" and we're not sure - # all default modules are "thread-safe" - - sed -i -e '/SPHINXBUILD/ s/-j *auto/-j 1/' Makefile - # We don't want plantUML to raise the contribution bar - - sed -i -e 's/^\(plantuml_output_format *=\).*/\1 "none"/' conf.py - - script: *main_script From e83ab9d1ee4b9648783d36353710daac4cc0826b Mon Sep 17 00:00:00 2001 From: Pan Xiuli Date: Tue, 2 Feb 2021 03:35:45 +0000 Subject: [PATCH 071/290] CI: GitHub: add local action to create publish folder use local action to create publish folder for local test Signed-off-by: Pan Xiuli --- .github/actions/create-publish-folder.sh | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100755 .github/actions/create-publish-folder.sh diff --git a/.github/actions/create-publish-folder.sh b/.github/actions/create-publish-folder.sh new file mode 100755 index 00000000..1ac8f6c9 --- /dev/null +++ b/.github/actions/create-publish-folder.sh @@ -0,0 +1,9 @@ +#!/bin/bash +# create publish folder for github.io + +mkdir _build/latest +mv -v _build/html/* _build/latest +mv _build/latest _build/html/ +touch _build/html/.nojekyll +mv scripts/publish-README.md _build/html/README.md +mv scripts/publish-index.html _build/html/index.html From abab289de581e5726aa2a0920c14e34f6c09711e Mon Sep 17 00:00:00 2001 From: Pan Xiuli Date: Tue, 2 Feb 2021 03:37:46 +0000 Subject: [PATCH 072/290] CI: GitHub: enable action to deploy use public action https://github.com/marketplace/actions/github-pages-action to deploy HTML to our github.io repo when we make a push to publish branch Signed-off-by: Pan Xiuli --- .github/workflows/pull-request.yml | 39 ++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index 9cdc1f21..d9947aa8 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -14,7 +14,9 @@ name: Pull Requests # yamllint disable-line rule:truthy on: push: - branches: [master] + branches: + - master + - publish pull_request: branches: [master] @@ -57,8 +59,41 @@ jobs: make html VERBOSE=1 SOF_DOC_BUILD=_build_doxy du -shc _build*/* - lax: + - name: prepare file for deploy + if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/publish' }} + run: ./.github/actions/create-publish-folder.sh + + # store the build result to artifact, used for later deploy or download for debug + # https://docs.github.com/en/actions/guides/storing-workflow-data-as-artifacts + - name: upload HTML for deploy + if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/publish' }} + uses: actions/upload-artifact@v2 + with: + name: html + path: _build/html + + deploy: + needs: supported-reqs + runs-on: ubuntu-20.04 + if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/publish' }} + steps: + # download the build result from the same workflow + # https://docs.github.com/en/actions/guides/storing-workflow-data-as-artifacts + - name: download HTML + uses: actions/download-artifact@v2 + with: + name: html + path: html + + - name: deploy + uses: peaceiris/actions-gh-pages@v3 + with: + personal_token: ${{ secrets.ACTIONS_DEPLOY_KEY }} + publish_dir: ./html/ + publish_branch: master + external_repository: thesofproject/thesofproject.github.io + lax: name: "PIP_IGNORE_INSTALLED=0 requirements-lax.txt" runs-on: ubuntu-20.04 # Makefile downgrades the Sphinx warnings, they are not errors any more From c6d6c58dbf70d7d03a0a18b57195c77cf564b0fd Mon Sep 17 00:00:00 2001 From: Deb Taylor Date: Mon, 1 Feb 2021 05:18:24 -0500 Subject: [PATCH 073/290] Addition of files used to run Woke word checker; Xiuli edits Signed-off-by: Deb Taylor --- .wokeignore | 20 ++++++++++++++++++++ rules-woke.yaml | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 .wokeignore create mode 100644 rules-woke.yaml diff --git a/.wokeignore b/.wokeignore new file mode 100644 index 00000000..2f1f79d6 --- /dev/null +++ b/.wokeignore @@ -0,0 +1,20 @@ +# The following files can be ignored when running Woke. + +rules-woke.yaml +conf.py +*.pu +tox.ini +Makefile +.travis.yml +.github/workflows/*.yml +index.rst +release.rst +introduction/index.rst +maintainers/merge_rights.rst +contribute/process/bug-tracking.rst +getting_started/setup/setup_up_2_board.rst +developer_guides/virtualization/files/q-v6.sh +developer_guides/topology/topology.rst +developer_guides/fuzzing/testbench_afl_fuzzing.rst + + diff --git a/rules-woke.yaml b/rules-woke.yaml new file mode 100644 index 00000000..c8d582e0 --- /dev/null +++ b/rules-woke.yaml @@ -0,0 +1,39 @@ +# Use this customized file to ensure that non-inclusive language is identified +# and corrected. Keep it in the top level of the sof-docs directory. +# Customization and improvement of this file is ongoing. +# The following command calls this file: +# woke -c ./rules-woke.yaml + +rules: + - name: whitelist + terms: + - whitelist + - white-list + alternatives: + - allowlist + + - name: blacklist + terms: + - blacklist + - black-list + alternatives: + - blocklist + + - name: slave + terms: + - slave + alternatives: + - secondary for firmware-related topics and consumer for hardware-related topics + + - name: master + terms: + - master + alternatives: + - main for firmware-related topics and provider for hardware-related topics + + - name: rule of thumb + terms: + - rule of thumb + - rules of thumb + alternative: + - rule, rules \ No newline at end of file From 6e1974004395f21cb5d6a771016ce71c4307addb Mon Sep 17 00:00:00 2001 From: Pan Xiuli Date: Thu, 4 Feb 2021 04:21:14 +0000 Subject: [PATCH 074/290] CI: GitHub: enable woke test on all code by using run-woke use a public action from action market https://github.com/marketplace/actions/run-woke to run woke test on whole repo by manully trigger Signed-off-by: Pan Xiuli --- .github/workflows/woke.yml | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 .github/workflows/woke.yml diff --git a/.github/workflows/woke.yml b/.github/workflows/woke.yml new file mode 100644 index 00000000..8943d2a7 --- /dev/null +++ b/.github/workflows/woke.yml @@ -0,0 +1,28 @@ +--- +# Tools that can save round-trips to github and a lot of time: +# +# yamllint -f parsable pull_request.yml +# pip3 install ruamel.yaml.cmd +# yaml merge-expand pull_request.yml exp.yml && +# diff -w -u pull_request.yml exp.yml +# +# github.com also has a powerful web editor that can be used without +# committing. +name: woke manually checker + +# yamllint disable-line rule:truthy +on: + workflow_dispatch: + +jobs: + woke: + name: woke check for all file + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v2 + - name: woke + uses: get-woke/woke-action@v0 + with: + # Cause the check to fail on any broke rules + fail-on-error: true + woke-args: -c ./rules-woke.yaml From 1995c1c4d66a8680047187901381a2219d4db2aa Mon Sep 17 00:00:00 2001 From: Pan Xiuli Date: Fri, 29 Jan 2021 07:04:45 +0000 Subject: [PATCH 075/290] CI: GitHub: enable woke test on PR by using run-woke-with-reviewdog use a public action from action market https://github.com/marketplace/actions/run-woke-with-reviewdog to run woke test on PR Signed-off-by: Pan Xiuli --- .github/workflows/woke_pr.yml | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 .github/workflows/woke_pr.yml diff --git a/.github/workflows/woke_pr.yml b/.github/workflows/woke_pr.yml new file mode 100644 index 00000000..0c307257 --- /dev/null +++ b/.github/workflows/woke_pr.yml @@ -0,0 +1,35 @@ +--- +# Tools that can save round-trips to github and a lot of time: +# +# yamllint -f parsable pull_request.yml +# pip3 install ruamel.yaml.cmd +# yaml merge-expand pull_request.yml exp.yml && +# diff -w -u pull_request.yml exp.yml +# +# github.com also has a powerful web editor that can be used without +# committing. +name: woke PR reviewdog checker + +# yamllint disable-line rule:truthy +on: + pull_request: + branches: + - master + +jobs: + woke_pr: + name: woke check for patch + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v2 + - uses: get-woke/woke-action-reviewdog@v0 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + # Change reviewdog reporter if you need [github-pr-check,github-check,github-pr-review]. + reporter: github-pr-review + # Change reporter level if you need. + # GitHub Status Check won't become failure with warning. + level: warning + # Enable this to fail the check when violations are found + fail-on-error: true + woke-args: -c ./rules-woke.yaml From b61089bcf7376ca4271c2a1933ea797b7ee8eeab Mon Sep 17 00:00:00 2001 From: Deb Date: Fri, 5 Feb 2021 08:43:50 -0600 Subject: [PATCH 076/290] Remove old comments re: master/slave reference Signed-off-by: Deb --- platforms/intel-cavs/commons/work-queue.rst | 3 --- 1 file changed, 3 deletions(-) mode change 100644 => 100755 platforms/intel-cavs/commons/work-queue.rst diff --git a/platforms/intel-cavs/commons/work-queue.rst b/platforms/intel-cavs/commons/work-queue.rst old mode 100644 new mode 100755 index bdd74005..78953b9b --- a/platforms/intel-cavs/commons/work-queue.rst +++ b/platforms/intel-cavs/commons/work-queue.rst @@ -43,6 +43,3 @@ component other then dai can be also driven by work queues. .. uml:: images/work-smp-cavs.pu :caption: Work queue flow for CAVS SMP - -.. comment "master" has been replaced with "primary" -.. comment "slave" has been replaced with "secondary" From 9558df072a7f32caca5ba0d6dd76d28711015c79 Mon Sep 17 00:00:00 2001 From: Curtis Malainey Date: Mon, 8 Feb 2021 13:15:43 -0800 Subject: [PATCH 077/290] administrators: add cujomalainey cujomalainey is an admin, docs should reflect also remove tabs so formatting is always nice --- maintainers/admin.rst | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/maintainers/admin.rst b/maintainers/admin.rst index 867b8248..209858f9 100644 --- a/maintainers/admin.rst +++ b/maintainers/admin.rst @@ -7,18 +7,20 @@ Given the size of the project, maintainer rights are granted to multiple contributors: +---------------+-------------------+---------------+ -| Intel | Lech Betlej | @lbetlej | +| Intel | Lech Betlej | @lbetlej | +---------------+-------------------+---------------+ -| Intel | Liam Girdwood | @lgirdwood | +| Intel | Liam Girdwood | @lgirdwood | +---------------+-------------------+---------------+ -| Intel | Marcin Maka | @mmaka1 | +| Intel | Marcin Maka | @mmaka1 | +---------------+-------------------+---------------+ -| Intel | Pierre Bossart | @plbossart | +| Intel | Pierre Bossart | @plbossart | +---------------+-------------------+---------------+ | Intel | Ranjani Sridharan | @ranj063 | +---------------+-------------------+---------------+ | NXP | Daniel Baluta | @dbaluta | +---------------+-------------------+---------------+ +| Google | Curtis Malainey | @cujomalainey | ++---------------+-------------------+---------------+ Administrators may override specific merge rules, for example merge a PR even if it does not meet all criteria defined by a repository, but From 4495a1daf624eefd9f055e7522829c8977779ec5 Mon Sep 17 00:00:00 2001 From: Curtis Malainey Date: Mon, 8 Feb 2021 13:35:31 -0800 Subject: [PATCH 078/290] tsc: update to reflect current state of github group -Marcin +Ben +Beata +AMD Also remove tabs so formatting is always nice --- tsc/representatives.rst | 42 ++++++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/tsc/representatives.rst b/tsc/representatives.rst index c5c42143..4e5bf74b 100644 --- a/tsc/representatives.rst +++ b/tsc/representatives.rst @@ -6,20 +6,28 @@ TSC Representatives The TSC is currently made of the following contributors -+---------------+-------------------+---------------+ -| Company | Name | Username | -+===============+===================+===============+ -| Intel | Lech Betlej | @lbetlej | -+---------------+-------------------+---------------+ -| Intel | Liam Girdwood | @lgirdwood | -+---------------+-------------------+---------------+ -| Intel | Marcin Maka | @mmaka1 | -+---------------+-------------------+---------------+ -| Intel | Pierre Bossart | @plbossart | -+---------------+-------------------+---------------+ -| NXP | Daniel Baluta | @dbaluta | -+---------------+-------------------+---------------+ -| Google | Curtis Malainey | @cujomalainey | -+---------------+-------------------+---------------+ -| Google | Dylan Reid | @dgreid | -+---------------+-------------------+---------------+ ++---------------+----------------------+-----------------+ +| Company | Name | Username | ++===============+======================+=================+ +| Intel | Lech Betlej | @lbetlej | ++---------------+----------------------+-----------------+ +| Intel | Liam Girdwood | @lgirdwood | ++---------------+----------------------+-----------------+ +| Intel | Pierre Bossart | @plbossart | ++---------------+----------------------+-----------------+ +| Intel | Beata Baranowska | @beatabaranoska | ++---------------+----------------------+-----------------+ +| NXP | Daniel Baluta | @dbaluta | ++---------------+----------------------+-----------------+ +| Google | Curtis Malainey | @cujomalainey | ++---------------+----------------------+-----------------+ +| Google | Dylan Reid | @dgreid | ++---------------+----------------------+-----------------+ +| Google | Ben Zhang | @bzhg | ++---------------+----------------------+-----------------+ +| AMD | Carl Wakeland | @cwakeland | ++---------------+----------------------+-----------------+ +| AMD | Virendra Pratap Arya | @vp-arya | ++---------------+----------------------+-----------------+ +| AMD | Basavaraj Hiregoudar | @bhiregou | ++---------------+----------------------+-----------------+ From 6204397ca56ba3bdfba6d96f39ee8a93e20a2fcd Mon Sep 17 00:00:00 2001 From: Guennadi Liakhovetski Date: Tue, 9 Feb 2021 10:13:19 +0100 Subject: [PATCH 079/290] zephyr: update installation instructions Update installation instructions under Zephyr to clarify post-installation verification and new rimage procedures. Signed-off-by: Guennadi Liakhovetski --- .../build-guide/build-with-zephyr.rst | 73 +++++++++++++------ 1 file changed, 51 insertions(+), 22 deletions(-) diff --git a/getting_started/build-guide/build-with-zephyr.rst b/getting_started/build-guide/build-with-zephyr.rst index 8c883461..59cd7446 100644 --- a/getting_started/build-guide/build-with-zephyr.rst +++ b/getting_started/build-guide/build-with-zephyr.rst @@ -7,7 +7,7 @@ Build SOF with `Zephyr `_ :local: :depth: 3 -This guide describes the process of building and running |SOF| as a Zephyr +This guide describes the process of building and running |SOF| as a `Zephyr` application. .. note:: @@ -18,17 +18,19 @@ application. Prepare ******* -The easiest way to build Zephyr is to use its recommended toolchain. Follow +The easiest way to build `Zephyr` is to use its recommended toolchain. Follow instructions in -`Install a Toolchain `_ for details. +`Install a Toolchain `_ +for details. Check out and build ******************* -Zephyr uses ``west`` as a source management and building system. Follow the -Zephyr `Getting Started `_ guide for dependencies and for ``west`` installation. +`Zephyr` uses `west` as a source management and building system. Follow the +`Zephyr` `Getting Started `_ +guide for dependencies and for `west` installation. -Initialize a new ``west`` repository: +Initialize a new `west` repository: .. code-block:: bash @@ -37,43 +39,70 @@ Initialize a new ``west`` repository: west init west update -This checks out all Zephyr sources, including SOF and rimage. Next, a -firmware image can be built and signed: +This checks out all `Zephyr` sources, including SOF. Additionally `rimage` has +to be downloaded if it isn't yet available: .. code-block:: bash - west build -p -d build-apl -b intel_adsp_cavs15 zephyr/samples/audio/sof/ - west sign -d build-apl -t rimage -- -k modules/audio/sof/keys/otc_private_key.pem + git clone --recurse-submodules https://github.com/thesofproject/rimage.git -Note that the above uses the ``rimage`` signing tool, but it isn't built as -a part of the process. If needed it can be built with: +If you don't have an `rimage` executable yet installed on your system you can +use this repository to build and optionally install one. This can be done by .. code-block:: bash - mkdir build-rimage - cd build-rimage - cmake ../modules/audio/sof/zephyr/ext/rimage/ + mkdir rimage/build + cd rimage/build + cmake .. make + cd - -Then you can add ``-p build-rimage/`` to the list of ``west sign`` parameters -above (before the ``--`` separator). +You also need it for platform-specific configuration. + +Next, a firmware image can be built and signed: + +.. code-block:: bash + + west build -d build-apl -b intel_adsp_cavs15 -p zephyr/samples/audio/sof/ + west sign -d build-apl -p rimage/build/rimage -t rimage -D rimage/config -- -k modules/audio/sof/keys/otc_private_key.pem .. note:: If you need a different SOF version than the one automatically checked - out by ``west``, you can change to ``modules/audio/sof`` and use ``git`` + out by `west`, you can change to ``modules/audio/sof`` and use `git` to select your preferred version. You need at least version 1.6 to use - it with Zephyr. Make sure you branch or tag your code in git; otherwise, - a future ``west update`` may lose it. See the ``west`` user guide. + it with `Zephyr`. Make sure you branch or tag your code in git; otherwise, + a future ``west update`` may lose it. See the `west` user guide. Run *** -After the above instructions are completed, a firmware image is located at ``build-apl/zephyr/zephyr.ri``. It can be copied to the usual location on the +After the above instructions are completed, a firmware image is located at +``build-apl/zephyr/zephyr.ri``. It can be copied to the usual location on the target system. For example, if it is built natively, enter the following: .. code-block:: bash sudo cp build-apl/zephyr/zephyr.ri /lib/firmware/intel/sof/community/sof-cnl.ri -For firmware log extraction, use ``zephyr/boards/xtensa/intel_adsp_cavs15/tools/logtool.py``. +and reboot the system afterwards. Note, that the location and name of your SOF +firmware image vary by system. Search your kernel logs for a line like + + sof-audio-pci 0000:00:0e.0: request_firmware intel/sof/community/sof-apl.ri successful + +to identify which file under ``/lib/firmware/`` your hardware is using. After reboot +verify, that the new firmware is being used by running + +.. code-block:: bash + + dmesg | grep zephyr + +You should see something like + + sof-audio-pci 0000:00:0e.0: Firmware info: used compiler GCC 9:2:0 zephyr used optimization flags -Os + +You might also need to build and update your system audio topology file. For +details see :ref:`build-from-scratch`. + +For firmware log extraction, use +``zephyr/boards/xtensa/intel_adsp_cavs15/tools/logtool.py``. From 02e8e77aa588cf922fbcbf28a3a7a9dac11204db Mon Sep 17 00:00:00 2001 From: Curtis Malainey Date: Tue, 9 Feb 2021 13:11:25 -0800 Subject: [PATCH 080/290] tsc: fix typo is username --- tsc/representatives.rst | 50 ++++++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/tsc/representatives.rst b/tsc/representatives.rst index 4e5bf74b..4084da2e 100644 --- a/tsc/representatives.rst +++ b/tsc/representatives.rst @@ -6,28 +6,28 @@ TSC Representatives The TSC is currently made of the following contributors -+---------------+----------------------+-----------------+ -| Company | Name | Username | -+===============+======================+=================+ -| Intel | Lech Betlej | @lbetlej | -+---------------+----------------------+-----------------+ -| Intel | Liam Girdwood | @lgirdwood | -+---------------+----------------------+-----------------+ -| Intel | Pierre Bossart | @plbossart | -+---------------+----------------------+-----------------+ -| Intel | Beata Baranowska | @beatabaranoska | -+---------------+----------------------+-----------------+ -| NXP | Daniel Baluta | @dbaluta | -+---------------+----------------------+-----------------+ -| Google | Curtis Malainey | @cujomalainey | -+---------------+----------------------+-----------------+ -| Google | Dylan Reid | @dgreid | -+---------------+----------------------+-----------------+ -| Google | Ben Zhang | @bzhg | -+---------------+----------------------+-----------------+ -| AMD | Carl Wakeland | @cwakeland | -+---------------+----------------------+-----------------+ -| AMD | Virendra Pratap Arya | @vp-arya | -+---------------+----------------------+-----------------+ -| AMD | Basavaraj Hiregoudar | @bhiregou | -+---------------+----------------------+-----------------+ ++---------------+----------------------+------------------+ +| Company | Name | Username | ++===============+======================+==================+ +| Intel | Lech Betlej | @lbetlej | ++---------------+----------------------+------------------+ +| Intel | Liam Girdwood | @lgirdwood | ++---------------+----------------------+------------------+ +| Intel | Pierre Bossart | @plbossart | ++---------------+----------------------+------------------+ +| Intel | Beata Baranowska | @beatabaranowska | ++---------------+----------------------+------------------+ +| NXP | Daniel Baluta | @dbaluta | ++---------------+----------------------+------------------+ +| Google | Curtis Malainey | @cujomalainey | ++---------------+----------------------+------------------+ +| Google | Dylan Reid | @dgreid | ++---------------+----------------------+------------------+ +| Google | Ben Zhang | @bzhg | ++---------------+----------------------+------------------+ +| AMD | Carl Wakeland | @cwakeland | ++---------------+----------------------+------------------+ +| AMD | Virendra Pratap Arya | @vp-arya | ++---------------+----------------------+------------------+ +| AMD | Basavaraj Hiregoudar | @bhiregou | ++---------------+----------------------+------------------+ From 4bf68fa49aab558152feb012f7623d03ee88f454 Mon Sep 17 00:00:00 2001 From: Michal Wasko Date: Wed, 10 Feb 2021 10:22:22 +0100 Subject: [PATCH 081/290] Update representatives.rst Michal replaced Lech role - update --- tsc/representatives.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tsc/representatives.rst b/tsc/representatives.rst index 4084da2e..9b1916da 100644 --- a/tsc/representatives.rst +++ b/tsc/representatives.rst @@ -9,7 +9,7 @@ The TSC is currently made of the following contributors +---------------+----------------------+------------------+ | Company | Name | Username | +===============+======================+==================+ -| Intel | Lech Betlej | @lbetlej | +| Intel | Michal Wasko | @mwasko | +---------------+----------------------+------------------+ | Intel | Liam Girdwood | @lgirdwood | +---------------+----------------------+------------------+ From fe6f9dd3a4da6c34022027532b0b9b89e9cf0525 Mon Sep 17 00:00:00 2001 From: Marc Herbert Date: Thu, 11 Feb 2021 18:48:37 +0000 Subject: [PATCH 082/290] .github: apt-get update to work around github's broken package index See comments and reference in the file. Signed-off-by: Marc Herbert --- .github/workflows/pull-request.yml | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index d9947aa8..1437ec59 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -9,7 +9,7 @@ # github.com also has a powerful web editor that can be used without # committing. -name: Pull Requests +name: Build and Deploy # yamllint disable-line rule:truthy on: @@ -37,6 +37,12 @@ jobs: steps: - uses: actions/checkout@v2 + # FIXME: remove this time consuming step once github stops + # providing a broken package index, see + # https://github.com/actions/virtual-environments/issues/1757#issuecomment-777700920 + - name: apt-get update github broken package index + run: sudo apt-get update + - name: apt-get install run: sudo apt-get -y install $ubuntu_base_deps @@ -63,7 +69,8 @@ jobs: if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/publish' }} run: ./.github/actions/create-publish-folder.sh - # store the build result to artifact, used for later deploy or download for debug + # store the build result to artifact, used for later deploy or + # download for debug # https://docs.github.com/en/actions/guides/storing-workflow-data-as-artifacts - name: upload HTML for deploy if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/publish' }} @@ -101,14 +108,15 @@ jobs: steps: - uses: actions/checkout@v2 + # FIXME: remove this time consuming step once github stops + # providing a broken package index, see + # https://github.com/actions/virtual-environments/issues/1757#issuecomment-777700920 + - name: apt-get update github broken package index + run: sudo apt-get update + - name: apt-get install base dependencies run: sudo apt-get -y install $ubuntu_base_deps - - name: temporary python3-pil HACK because github is out of date - run: sudo apt-get -y install libimagequant0 libwebpdemux2 && - wget http://security.ubuntu.com/ubuntu/ubuntu/pool/main/p/pillow/python3-pil_7.0.0-4ubuntu0.2_amd64.deb && - sudo dpkg -i python3-pil_*.deb - - name: apt-get instead of pip run: sudo apt-get -y install python3-pip python3-setuptools python3-wheel From bdad433f78117619a68cfbeed5726c9a9440ddd3 Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Thu, 11 Feb 2021 10:36:08 +0200 Subject: [PATCH 083/290] build-guide: build-from-scratch: Use SOF_WORKSPACE throughout the page Use SOF_WORKSPACE consistently throughout the page to make it easier to follow the instruction if the SOF_WORKSPACE != ~/work/sof Signed-off-by: Peter Ujfalusi --- getting_started/build-guide/build-from-scratch.rst | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/getting_started/build-guide/build-from-scratch.rst b/getting_started/build-guide/build-from-scratch.rst index 31759975..f62ac591 100644 --- a/getting_started/build-guide/build-from-scratch.rst +++ b/getting_started/build-guide/build-from-scratch.rst @@ -303,7 +303,7 @@ Build and install for each platform. ``--prefix=`` expects an absolute path. Define XTENSA_ROOT according to your environment. -The required headers are now in ``~/work/sof/xtensa-root``, and cross-compilation +The required headers are now in ``"$SOF_WORKSPACE"/xtensa-root``, and cross-compilation toolchains for xtensa DSPs are set up. Step 3 Build firmware binaries @@ -313,7 +313,7 @@ After the SOF environment is set up, clone the *sof* repo. .. code-block:: bash - cd ~/work/sof/ + cd "$SOF_WORKSPACE" git clone https://github.com/thesofproject/sof One-step rebuild from scratch @@ -327,7 +327,7 @@ Build the firmware for all platforms. .. code-block:: bash - cd ~/work/sof/sof/ + cd "$SOF_WORKSPACE"/sof/ ./scripts/xtensa-build-all.sh -a .. note:: @@ -373,7 +373,7 @@ This is a more detailed build guide for the *sof* repo. Unlike ``xtensa-build-all.sh``, this doesn't rebuild everything every time. Snippets below assume that your current directory is the root of the -``sof`` clone (``~/work/sof/sof/``). +``sof`` clone (``"$SOF_WORKSPACE"/sof/``). CMake recommends out-of-tree builds. Among others, this lets you build different configurations/platforms in different build directories from @@ -529,7 +529,7 @@ only the minimum subset of :git-sof-mainline:`tools/`. .. code-block:: bash - cd ~/work/sof/sof/ + cd "$SOF_WORKSPACE"/sof/ ./scripts/build-tools.sh ./scripts/build-tools.sh -h usage: ./scripts/build-tools.sh [-t|-f] @@ -541,7 +541,7 @@ Incremental build .. code-block:: bash - cd ~/work/sof/sof/tools/ + cd "$SOF_WORKSPACE"/sof/tools/ mkdir build_tools && cd build_tools cmake .. make -j4 @@ -582,7 +582,7 @@ the kconfig repo, and the :ref:`sof_driver_arch`. .. code-block:: bash sudo apt-get install bison flex libelf-dev - cd ~/work/sof/ + cd "$SOF_WORKSPACE" git clone https://github.com/thesofproject/linux cd linux git checkout topic/sof-dev From 5693201b4312ffd2ba0e5f5a96c0a130c48d84d6 Mon Sep 17 00:00:00 2001 From: Deb Date: Thu, 11 Feb 2021 15:21:37 -0500 Subject: [PATCH 084/290] Grammatical edits to Build SOF with Zephyr Signed-off-by: Deb --- .../build-guide/build-with-zephyr.rst | 109 +++++++++--------- 1 file changed, 56 insertions(+), 53 deletions(-) mode change 100644 => 100755 getting_started/build-guide/build-with-zephyr.rst diff --git a/getting_started/build-guide/build-with-zephyr.rst b/getting_started/build-guide/build-with-zephyr.rst old mode 100644 new mode 100755 index 59cd7446..aee0ce7a --- a/getting_started/build-guide/build-with-zephyr.rst +++ b/getting_started/build-guide/build-with-zephyr.rst @@ -7,8 +7,7 @@ Build SOF with `Zephyr `_ :local: :depth: 3 -This guide describes the process of building and running |SOF| as a `Zephyr` -application. +This guide describes how to build and run |SOF| as a Zephyr application. .. note:: @@ -18,91 +17,95 @@ application. Prepare ******* -The easiest way to build `Zephyr` is to use its recommended toolchain. Follow -instructions in -`Install a Toolchain `_ -for details. +The easiest way to build Zephyr is to use its recommended toolchain. Follow +instructions in `Install a Toolchain `_ for details. Check out and build ******************* -`Zephyr` uses `west` as a source management and building system. Follow the -`Zephyr` `Getting Started `_ -guide for dependencies and for `west` installation. +#. Install **west**. + Zephyr uses west as a source management and building system. Follow + the Zephyr `Getting Started `_ guide for dependencies and for the west installation. -Initialize a new `west` repository: + .. note:: -.. code-block:: bash + If you need a different SOF version than the one that west + automatically checks out, change to ``modules/audio/sof`` and use git + to select your preferred version. You need at least version 1.6 to use + it with Zephyr. Make sure you branch or tag your code in git; + otherwise, a future ``west update`` may lose it. See the west user + guide. - mkdir $ZEPHYR_WORKSPACE - cd $ZEPHYR_WORKSPACE - west init - west update +#. Initialize a new ``west`` repository. This checks out all Zephyr sources, + including SOF: -This checks out all `Zephyr` sources, including SOF. Additionally `rimage` has -to be downloaded if it isn't yet available: + .. code-block:: bash -.. code-block:: bash + mkdir $ZEPHYR_WORKSPACE + cd $ZEPHYR_WORKSPACE + west init + west update - git clone --recurse-submodules https://github.com/thesofproject/rimage.git +#. Download **rimage** if you haven't already done so: -If you don't have an `rimage` executable yet installed on your system you can -use this repository to build and optionally install one. This can be done by + .. code-block:: bash -.. code-block:: bash + git clone --recurse-submodules https://github.com/thesofproject/rimage.git - mkdir rimage/build - cd rimage/build - cmake .. - make - cd - + If you need to install a rimage executable on your system, use this + repository to build and optionally install one: -You also need it for platform-specific configuration. + .. code-block:: bash -Next, a firmware image can be built and signed: + mkdir rimage/build + cd rimage/build + cmake .. + make + cd - -.. code-block:: bash + You also need it for platform-specific configuration. - west build -d build-apl -b intel_adsp_cavs15 -p zephyr/samples/audio/sof/ - west sign -d build-apl -p rimage/build/rimage -t rimage -D rimage/config -- -k modules/audio/sof/keys/otc_private_key.pem +#. Build and sign a firmware image: -.. note:: + .. code-block:: bash - If you need a different SOF version than the one automatically checked - out by `west`, you can change to ``modules/audio/sof`` and use `git` - to select your preferred version. You need at least version 1.6 to use - it with `Zephyr`. Make sure you branch or tag your code in git; otherwise, - a future ``west update`` may lose it. See the `west` user guide. + west build -d build-apl -b intel_adsp_cavs15 -p zephyr/samples/audio/sof/ + west sign -d build-apl -p rimage/build/rimage -t rimage -D rimage/config -- -k nmodules/audio/sof/keys/otc_private_key.pem Run *** After the above instructions are completed, a firmware image is located at -``build-apl/zephyr/zephyr.ri``. It can be copied to the usual location on the -target system. For example, if it is built natively, enter the following: +``build-apl/zephyr/zephyr.ri``. -.. code-block:: bash +#. Copy the firmware image (``build-apl/zephyr/zephyr.ri``) to the usual + location on your target system. For example, if it is built natively, + enter the following: - sudo cp build-apl/zephyr/zephyr.ri /lib/firmware/intel/sof/community/sof-cnl.ri + .. code-block:: bash -and reboot the system afterwards. Note, that the location and name of your SOF -firmware image vary by system. Search your kernel logs for a line like + sudo cp build-apl/zephyr/zephyr.ri /lib/firmware/intel/sof/community/sof-cnl.ri - sof-audio-pci 0000:00:0e.0: request_firmware intel/sof/community/sof-apl.ri successful +#. Reboot the system. Note that the location and name of your SOF + firmware image may vary by system. Search your kernel logs for a line + such as the following to identify which file under ``/lib/firmware/`` your hardware is using: -to identify which file under ``/lib/firmware/`` your hardware is using. After reboot -verify, that the new firmware is being used by running + ``sof-audio-pci 0000:00:0e.0: request_firmware intel/sof/community/sof-apl.ri successful`` -.. code-block:: bash +#. Verify that the new firmware is being used by running the following: - dmesg | grep zephyr + .. code-block:: bash -You should see something like + dmesg | grep zephyr - sof-audio-pci 0000:00:0e.0: Firmware info: used compiler GCC 9:2:0 zephyr used optimization flags -Os + You should see a line such as the following: -You might also need to build and update your system audio topology file. For -details see :ref:`build-from-scratch`. + ``sof-audio-pci 0000:00:0e.0: Firmware info: used compiler GCC 9:2:0 zephyr used optimization flags -Os`` For firmware log extraction, use ``zephyr/boards/xtensa/intel_adsp_cavs15/tools/logtool.py``. + +You might also need to build and update your system audio topology file. For +details see :ref:`build-from-scratch`. + + From 53868d7a6823fadce32251095faea43b55a259d3 Mon Sep 17 00:00:00 2001 From: Jaska Uimonen Date: Mon, 22 Feb 2021 11:07:27 +0200 Subject: [PATCH 085/290] algos: fix demux documentation Signed-off-by: Jaska Uimonen --- algos/demux/demux.rst | 23 +++++++++++++++-------- algos/demux/images/demux.png | Bin 41697 -> 67055 bytes algos/demux/images/mux.png | Bin 41331 -> 66394 bytes 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/algos/demux/demux.rst b/algos/demux/demux.rst index 89b55d2d..fa5c5e9f 100644 --- a/algos/demux/demux.rst +++ b/algos/demux/demux.rst @@ -30,22 +30,29 @@ is fully configurable, we have a matrix for all multiplexer input streams or all demultiplexer output streams. The 8 x 8 binary matrix takes up to 64 bits and is controlled with eight unsigned char values. +.. note:: + mux/demux component can't mix channels. If you try to setup mixing + in the configuration matrix you will get error in component initialization + phase. + .. figure:: images/mux.png Example of multiplexer configuration matrices with 2 input streams. - In this artificial mux example, Input stream 1’s channel 1 is copied - to both output channels; Input stream 2’s single channel is copied - to output channel 1. + In this artificial mux example first input stream's channel 1 is copied + to output stream's channel 1. Second input stream's channel 2 is copied + to output stream's channel 2. If the streams have only 2 channels the + matrix values outside the 2x2 square don't have any effect. .. figure:: images/demux.png Example of demultiplexer configuration matrices with 2 output streams. - In this artificial demux example, Input stream’s channel 1 is copied to - all output streams channels (1 channel to 4 identical channels in 2 - output streams). + In this artificial demux example input stream's channel 1 is copied to + first output stream's both channels and input stream's channel 2 is copied + to second output stream both channels. -Using a routing matrix means also that this component can leave out -channels or mix multiple channels into one. +.. note:: + Note that demux matrix configuration is opposite to mux configuration: + input channel is the matrix column and output is the row. Topology ======== diff --git a/algos/demux/images/demux.png b/algos/demux/images/demux.png index 3d87dc79991a263d08f7c17eafd43ca5b9b82e70..ee3cf8731e854894997de8445d4156f518bff1c5 100644 GIT binary patch literal 67055 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 SV$FFAGS1W0&t;ucLK6VTi-oxW diff --git a/algos/demux/images/mux.png b/algos/demux/images/mux.png index 65df01bd27d70c57257c314f702ce384c72c4bab..bb867516c7cdb8b07f046f6151044b246ad6e10e 100644 GIT binary patch literal 66394 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 literal 41331 zcmce;cU+Ut*EUE%Ac80)({$9QL`D8f0e!!N+TghClkzofjs`nciT zrP$B>KGW2Ku~RpM!gb&0R)pqi@!WS>qsg~xe6?^ucbfc`vx_CDvr_Zx*0ZQ00sIHHkYj{(B2O=$%dUPJypndaTxM z-v1AZ=cT5zb;x3y`aYS`{xR=wr7Pc&P5(6d)AVHU*Z>upHONXiIMxxK&lT)%vFWpbc?XQK#LJ5awMAa&)(PfH~< zN6LfVq5E}vxj4K;&9AJQjk`b$yg^QLk?5)@$M`JfH_q=yE3h02gt*u|9_0Fiqb(6^Y(`@}4xWlN?8ev5`vPj}n(~cpW0WOg+>-l<^TR$czT-AWsW6wZ6d3$Na-#>34fob~j=xO$nK)oYK7ipO( zj5ZbNByt{{f;B;z@ahnjUR$QxbmvhP_CSxGHzVsG*=|G(@D|o!+H4&kR|zY z;1CWzq0bvdw6e^uzhtxZQEe^Ky}2Nk5x6cNndEvVu=QQIX#mSvWXw}sjl|Rj6Eb9Q z=B%yM_T66I@f%jOg!9gQ5^629kQf$!wtG%wBlV%Bm9llUSxK1mwUy_ZxsAjeE3Paw zE9-?34)dX@1{Oa!+{4V$o}C*pn)<2K)7p%J_&ax$j1d_l9;#HQv1ZDlcNKQK_1AZ_ zP%oD1Qk&M~4;^|L4e=ds>&or~B;GmX!hB5}$YSr+jZE@;{;l%Uh7|Ga>^oq~2;1XM zl$EpPWkYoR4R{*#wQ?zs9?|`pItDn)BPtWxiS-uNr+HqZI=0X-&frnxnDt(+ z7XlKey4%}+5WyeF=dW-6Xesa${Z{#*i$3%BiJ3R3eN&I;=Z;oN3JuD0v1BVg9~kE% zqhe{W<_`(%t`nq#DnGc^GSBw@e)5*{_)~h!n>*fVB7ud8?3FLgD(RGzO>hS57X!S9 zxk_^rEiow3yDyNUi%ykFO%@`l4yVpC$2hC_>V4!mGDuP<8rI!@xR_AGbM->moX*)Q zH&F#c)C2oQgnS(X>~ypRLLerU6yo9A>s}bhWD@$V1w^!@sSjozE!n8Z16cWsDPgF8b zw0y2#@-p9pWnGpN!LxgJOAl+8r|L~|_>kolN(upjB$MxTXE#LnU|Qv^DK*Wdmp*~} z=?oOj01adQK`Y^B%?u6GHk6#xeFBMVbW79>j9!o@vgm`FNM?lpOufyL!Jw(TF!`uT zRZ2Zb1AZ4wMN%5p6x%5tSXj|Yp)HJMhM1QuxCce=KCw|=e#WGIvo$LI$`=!7?NVAq zOKvj5LhkUnhsTRHhnw&Hc+V>(!W!D3{ZK(GS?LNN>@$|Au|!rimTlb7Bx#xl!C)(# zQ#Lb)`95Jz)$*R1Hc$(GbUf(EgJ-i}5Zx{!`_9Eb>+uqKpB$Ra=r;9wAVt(h*WoQa zWpD?>!hyGPcaFh_Y{sJNLGe7j4K6FDD?U;v@jzi?ClMLKwGD1tK_=)B;=OJ!Hh#eL zEM3RlPD2w_licdim8Nz?%YF#!2Aqcy9&T1J>}S!XN+MT!x>}b9t6vmjQxsCpl8_KS zo+1H(L62@QITDk~yeNa5X-6{nxhCDOPM^wq0QYps^HLw7`YUMiSYBLKC(tIr~OBN8tpf9Ltj@8c<%FO@#9_lL1a zaH^n9WY(t4IA27K{KA-s6aT^#2}oA1VRmQ?Su|Y?cfm_hbl_lbjaQ`UTJ1DhgJkm6?5*2JO~Vlkn#Grj3I(Z8tAD zA4C|@w|7@5m~KQ8-!BymLMjKP^JxAWnhYP zlfI8@H$)9xvK`syH(C=a_Bz~tP<6f)t6%4rf{YJYDq5yeX4{&ui|8$}-g4c+XL{r6 z)Ly+6FnE(@Kkiu2ho8bGs}ziSPNWP2Jl=c0B%^$;HTUf!dtc1B-F7eQsLXCQE!y#x zW2fcoG|3;eszsu-<(8kd={hhs}3< zI>bUqSL?M-D6fV22>G19(fzPnf9-o#^EQ2LeTC>OR)1K3FI6*Ytzz8yR-li!BX&Z4 z537AU`_1MP&5`=P+CGIl-Qoo+c?Uh9jf(G~yMh)NId7h^qT0&9ajb`Ci>*zIwxP_= z2vcXLH;*g!zR>ZDhu3olQrUJ33Az6?ciV_sYzt;6LxYMen~P zoE8dhT8j);ilNhA9X-he4@oUD&i&g%E$x#}W5`5%$euR5*SgI^O9s}RogLh8 z>uJ1okfI5o(XqxuyK^PddqYkue_&zx48Cz(5&|m;&^l1$FQ6Ib? zoXAWpe!eF>%x--`=mX3^@|&3_SoIjzCdapj33Dn;wI zD%&4Xo_`PKO7jx(`GE4i<&Ro3nc6k&d zw7rj}7xbUR$g%68-tLTB78G10ReT&U{lPxIU(YtLv|n$@p%(R`))NXmB7}dzZAS6G z@}oF$!~NRrb3?;hwx7R6N?xemXf|Tlt&=$DV_x5>-8Et@UL8i4<1tuU{O^erxzz~+ zTwVDL2D@8EGmFPB$T+l6OZgcbdXhEzj`#|-;D4NB$6gX*JDMuEYzOIJY&!)K7N{Dz z9dh}D zb@>jypxhuq4lRXhJ?yg<+G^-N76fImJqbr)`C{e11%5lRhi_to9p57+^+j&yOP?8} zq2ORSY=|;S?mY6~T8jTf!_r9I&Ja#lSiyJF>UeUb4R3;AEh8n^2@79Lag7TTcfHJ1 z92F(To+5a+ACGI5H9URDaL(KFctEPI_K zek?n|Fu8zv#&R4(no7`A9`I|OB{m5(@*d{VmWGJ^avVj323-w6wft&V^S%|pVkrDa zr$NFTu%_Ow^%6}Y5f3_h66my}u@Y~sZprZ;AT}XK=q8I(Fc62zN`Dl9%g*+3&!#?! zbAR!T&HuykQ2oRvcMvUZs^Z?yty2Rz-ZyQKjSw|>8t#`pZB|d*pBtD{*f0`e_-7dm zP!R-Oj}qis{}z=Gh8{EW>KaR`-;+c6!e(EG!*%57tUH@VyC zpDoBmtjLBXiZ$3;Yj+hk=kB_SX_QTf{$W+O{;PlNP@FR|gr!c9ynYIUl`50{3Pn-~bJWToT zfhi*mzVA0v;K7`|-!Y(&>`1n;X3su6?fY$6gW@Lf%P(xUNLzj+R}CVbBtPi+;ACiDYn(&R>+UBHa8_y zVSiwvB^hf~yd+=u=sd+7aMLl}!4wdhZcqhtC%X)P59b;$I{0cgp|c;6-cOiCkOpcq zw%hrf6Jb3`m!)~xEYX0@g9Ejt8?-u}BKL+q2l#X!9pY(ZYs@C`SnSzyhjz+A0iz1e z{Yg$4Pi*-}oj3A#++6FvmjXV2SN@O=8Ke8nRMdZKo}T?JYoUexp|o5M!E?MMjkxLm zF`rg>VG56pfA_Thur}p>KiA`E-q_LUyKrdO`}JxOmifM+uNif)qkr=`?1bRJ zts^lnK99eA+a&yB>GrQJENYT7YCNtWh$nKcb|yIHGr|424LpqN=YQ<)Iu<#tmwP9H zSv1$vq-->8kODf=Zw8vHPU5oxX}fk%wRnwvBu_jE*`1CWwaRO`he0Cb$3$(+M97d) zlHW{~srai-eK_)W_nsvWrfn%V+8(b7**pvhNT|h5wR>KAMk{MbLV*eRMNe7#F?>}M zno90ggqV-j1Vh;qbClYDqm0zcQZ}kts>b@hSt<21p}W(|MR0Z|);FDEBr4h+HVx|H zO(p0+{UVImyKzVJ6mMKO*_)u%PdkU^Z+8M#Q_E)xnmf~vgm;Tb(T4gC`~{|ZvyEn^ z00}(b!|CF+zp2nG_sFrn9dAy99ZLKm*&Ck5U4k2TnVd$On(*f{@*h$Wbi0*CWa7MV zO(){T@b}@bIZ1_K$ZJRZ&Bx-%#a+t-&*clQs36lIoG&?Egl@nDa6=97tJw4BLkPPc z^z94hR~Hb7ge7}UHXcnX`$U7feXW1_j@AGm@{s~ZQ3tslL<_au>`Jls=Jhp4rJ~tx zTAdrZN8MT@TAFNTch;@arY2_4Igy%%^v69@!ucalG|m4qVUBDmU$F4}X&OFdc46>! z?9OY-8ODUpP7cw-yrV-v37^qC+o;UbSbRdrcf!5;yYaVDA>@A0(}7)o*~i(t4;!wQ z>Kv~uCn)-Hs~Oi|6R<|W&#r*DpUBqMX(uGJ5R1bQ2jNs85y}r}gM|Anf2pGFj*N&W zad5Ag%{kWB%uzBN$d%Ux@|Oy%*Bs;TwWacVv6n_LDXW@?{4}+bmdcLMoXBBw5jtA( z*hv_1AcCRxElvStGKK#{*V7}TCsrHNEuXA@v*^(a)jkqW(8m*`H)?5O^NpXLHIeam zYOfha^_tAqUM7Nq(9F)DFGW2^!`yLCPn+>laU)PtcJRz--l~yWEdFI=9@NuI!1AMeW)yz31M6^lsNRwD@68 z-zVuGW4mKbM*d%1Wg_rx#fH|*Jg`M;y=xUVTdrv7LsuHfu3c9a{Ff*F?$ysc4)jK@ zt}r#ckwvYg6r115tYoeq*#$U6J#%g0R1p=yRl);fG9p-T0?EDJ1a{<+f$!S=Yw6*a z>j+iBRpKytT(zTl6#j5gZm%dwqKw$Qm<1_h zmMh~I7QX32K0k=8XMlT8(V&I+4r7qAKXwJaqcMV9^36kJurfv?c<%;va2VEMQkqq5 zg9TZH_&m7l*1=R?y_-tBU>X>mIQ&A0aMysfMI3z~=m-o1R0&jeg|H~Xhof5X;ZN=H z2ZWX1QPq}L;A$(k?~q9I=4aaiRdVz17ucLrDmy-t&@4YfC+(k>^a{yj^|+X%XNUWsILzh1nI(j6Z+UB{RbAfq0C=aO$f1t4rFhmmC(U=p2HHEN zKfTQ}9BY5WzwoG;eWE}pdrEn~&gBuFLEQ28BO1A0DwtMJ)<*BhUBq<(#@@2b(0Vgv zA>Waay%m`h{B!Q@&m#`D3V8MdD=+)7y>W5axU0I5%vNuJJ$g@OXVh@JCxzhBNVbCe zEoKK4y*JJvR&?;OjtlkvN_z0v|A*MYvnRx4v}IJm-!nf1pk;iA`tuH^e|cGb*CyeJ z;4WHAjmm&1%G*vsK0KNT@ZDc?tjcD`cZlw%C?Gm4Q4u7Cy<9LCZH?Cw8f_xZ_9Z8S zoe$^>>UXJ|wzy$7V=PdJ=Y?mOi6x~h zlxU9k!slRgwsO&Lh@sCJ;aU#UL9u1iBu{!pI(I@8M)A1k?NaaiOBwO|69xJ9akh`m z-WR`Dg@-TIdmZHImoI_QD1v<&0;7evF(#y zRHlHR;<0?EjL@Qh&xmr<8LM^AN%DLw3Mg9HRZ00+ zensAuLZZ35FXOWF^qHkQ!(D$n;u_@D0v&M^SmX&|KCutEMVBl>+(HCm>pD#<4RM`e-Df&8g>1Pbzkq zglrlIL?2}ddL>f)6@2>4DgN{qG%(1=lH!sA=NNEmFWHs%%gCjQF-Tgk!73@An9q;+yl%j#ra1d*TluyZmvtSqD;%te+Dcrd45e z#Z2#7&Tg)=vGffhtslO}n4Q$|AO+@{Q8sQpPrC z11Vyg8(d#_@WIX9K3Bxw;e*exG*i1l=0*#@U*QhYSQ;Wy%z!p!oENz$r-K{J639R` z@kfgXMW5D~D!Qi-$$1f`)Y(hhDW`Ee>3M`&mZyDV)G$*I7q*5mX=apuNrkY7n%39D z#la-PFf8yE%da9tA?}&EN2cj4JZ&=LtMQ9loAC4(>{PTjIDIyCH@diBKh5+A}PUXuUC7VfIJCaELJNpH5E5S)h2lafee(kFpv8nczg&#{k zRGhV8SFG$IfKJp72p(mfJhjYf*$y9J!G|;dX9GzvJelCA>0> zytujLBI{>+b;d_m?7B9DE9tamj2;%hqkx)8^q8WR<01_Mns*eBuKo%bJ45K$1kd0j zNh?u#iSeR)dCOiFTKWjDc1yLPM+VnkLo&pJ!g1}KrjuTAb_r{oN;-ZnsFWLVM9^un zAnR`+(Iwekk_QDQiJg6QLG{9!1&>*6P- z&a!FcWtZ;o(~1r)Bg73MhZu?FpRU7=P!qe4TH{#$G8L4vt$sLr6f3VIrJ5h&C5oFA zm^rt;&5z^yKEb*?7eIK_xz@G@}5U-t!tVM1G9Bs$N!F) zB11w}q4j+!e3lFXg!yh$aSpiPvLyVJfJdlVb1QeE4D^RR?JIIOLf0jNV2J6U8@r8S zcfSiVYuN5ff$Om-e7x8zKwGv;yw4R{t$U3@`~HjSWC*8-X*eYtJ^QjrDOlYpgCkyQw-;272SVXS@Q>Ytdv?bdHPM?oj zvYSs+t%?ZJ0>8?5ygN5`moq9dd1LIOG@72Y@J3(xS=3`D%We54s8CXox%z`hX|@+t z32RCz*=Wi2m*Lq;n;$cLmanUzRH%Y!ulqz#Yce-32_>rnI3?$gU`UGaeRp|?3)WPI zFS7N_rOb>Vr`3{+tNWz-sO4pqVrPfPbDTA1Bw+b^cxU6!v%lRXpAD)?-@r|6cB~Kg z(N>3lrX|_UsG~CSWDN%!Rufvf@lvtBgf!>`VaoD{i{Q5DRPz(~@Vyb%(p%7^xuT4B8+f?8q z?0+92`5WMAI;d}$3w^bpnk&wEdHsPKeRVjK0xK+1<}VgK2Bidk@qdKFK`n5-j6tF7 zBi?4zGQR8VhhDcYA;jC)=t(Zr?>D#8pTn~sS{JYBhoUA7RQw`~so-{^pb?rCO20AI z5cRtv?;Jd#Z#RteRbvx=WFnxM0K$jx8(~Ex98#s{2sFT*5;2%TPjZaxO>sjJ0E63s z8!p)s{5gWz;9>ZmhyTVD{_u$2W6A}f|M7>QmZNoVAqpOpbA>eItE7sc)^;8gH2{u+ zY;5xf9OmO&HhY;Y%Zj?ZmCgN9oBD$}@x!0#cVv!u&V()2FsW(63m0Zja^%N2a&Qq( zp2vNhj#?<8pZ@ZsiuHp&zUG@u1X80}uEL<%$hYNdQ_A$NitWPXL+b=Xlb4Am!0k2Y zu+%;|*8f)LQ#I=cnPn_0Wn}l$y@JKvVu^saYdZ?7fojwBi@Bn?5aP*D+xdR>(FIxb z>-~HesuWvj1cpg*0Jcci-^JR$uto5}xYkCti3R6Rx>9|x1?c6NQJ4ePKv?--`T(8- z9`*8wbP(>XBboz*Y)drxt$tr=dlyqMo(i;?ir_jXVOzaK9PYLvTPyTY69lUVwgKqF zDIh4?H11KY+@88RyI}OmcUWo-YbH)?9vpLKoaIO8+Ln>mY*bp2AfyI#&de*sTOi^LYColwko&-ac@zz|K4)}1{P z8Z|`G*lA-f;OjCmv{EF!=zPF!cn!hvB!co=sgw#$1Rfyo>8syBMnG%IvoNz;C$H1; znkEBZ+eXEeVVnY9_2l&(+1++K;03##jGU>)J`P*2cu0=J>rXh}_=yXeY*Dxfb4hZo zb!ClKz@tP~Yhlo>T%t+;ovqKWFIAH?=+`+Z2V6@&15JH$+Q|9G*3iC!i|crk6E3BG zL*`b{YKB1htg|+8HzC7Q*3;C`dnLkKnO=c}EYS2e{Ct3$WJX&GORJbPwt{T;ch|!0 z+FS7oMXg{^;%_XNZXtQW`faIaef#XuMrZvbjsn`bL=7QqK67C{ruDiWkl;<-we*Nx zz=@QC&L6bhPbt+`=W1T7EbzN@5~h`C7JT_4OjFoe*l6e3hKDyR!<6LW_Jv4_>nYfu z19VC}+H>_Q2|MVu&ieVE28QI3QbLI-v{ZoZqYP0mO5O%m$ z;OauA?~tm**5`|NlJgwFcjC$1@>dcbD-~COt3hvta)FJf4A3u)(N9F?(cE#^&&$t1Lg z@T3!`M3$^zJpB*oF7v@&D&U{_zKg}i=<8TIo~B*m4`UER{$eJY9e*|oApS3uJ9+q9 zWU~l=2GwaOX@go|bl6*7(kpj2AI3t`RpB)oo$^G#M~B+k{IAHtF24?HdPT;MxNr`p zgfi&634NNV*-ndq(ssu%Nlax2TJ=aJY}?)y?1avmOPn_>nLtrG!`vbPJ@aN$g*2xT~TL3!~`pPcd-BO;af^y)cL zd#yQjZXv04|4aDD{YwGORu4w7u0NDRY;VKO`+vMwQ{@rO=xrWYBso+Hzd;eaIfo*F-ODQ)>cLo$LgVT9VTOr~8yr{!vMR9v=rBB<_ zp}eW?9-81rZ0HYk(k1DhnbUwje28QCkmpl_I17)XgNLiSx21O3IWwwaIpkaxK->(us}q9oqgitJL6EAiP5Zl17VtN})lN&?>TN3*LRbL7kgyob&U<%s zNV+kD&tR5j`4kgrWOHEe(A`IRfx^-!a{61Fb_zR}Wx$1RM+NmhWHlLP_W}h2 z>4wY-KDXOl7eZDv#P1+(j_YVE$2G`id4kk=r!EKA#HcD;{*05*>831P^jw^Sw%FKB zcyAb_!OQKAj=oxL>hISncs^JpeG8e~T;N#xlAv-tVNu_5EGoZu#L-3>%wNV|MJ3E6 z_R2*9sY+iTta)KuyC@mQI%CES65oj%7^=urax(aTTDh7~2Csb2gnxH z&aN#xff$mBFlh-D!U?b8`1I}-OV7~5YlDI?C0{L;i&LYnICo10m9wy)A0GT33|H%_ z8UXE0MvdrX#6NYm@)MiL8a|#D@UTox_edps1Ymx@9WlC%l?W82V>U%q&4keP-lqGp_ zt@C(k+qVRZZezo=;_W7=fzI-LXy%@x%mWjw<7zIpSePO1#Ks%^Sn}9bJqvUB(LHod zs;9dZ6`t6?vYfyLzo6`L(b5IYvMS2C;V!ceR8-l-X}OM;=`y#k0Vt{LkVP@$le1{s z(>D5Nrzrz0+J9FW4Oby{XJTsYmijFz`lG5Kib}i{y!oQ#^|$;SROY2V8rN^J-oFrK zBul+sP|fOV0Ow$nuz!j4rZC}yPf1p_rLdW;qh-?~jXLWWo>VJ?U0}hOB7@zKvpT|T z)6ZnZe}Bwx6!m~qNu!8tDT0CTx4_W=!XYKGvYbO=9v)q2nCMF(ExpvBp$$*lC~Do{ zUP|=Mzna|I9BMUVv{RSE3v++1z!^LfB}H#AtNvRjp{9g17}DrB=eO-g{?5$}fIgEY z1Oxm#{p$qHXX{JL0arkFx65rf%UiTufB{_O(C$0?IcT#zP#V9dh$v(oVbY`T z5NyF&xSt(5!n=Dk2EW>@ed6*loXyH4gJ$c8Wjg}uqWVuKlQ_`NU%<>yJjp*n3lx96LIzbOJ-e6g{gx?TtCrts!iXP!uH9a|a@aI2p+|C}VS%{e z35@~fMh=K2Z7V?s*k{o12_Yy%1vjSJrrvJsLx|hl7D}e3XO}!rUuIx!fX$_F4J|3( zqgNG<9L~6}dx5lpE;F3%=fYO4jeGglRv}se=`dZOSDQ198s9Z&n!tY{k&eLU6n7Sq zL4)%--2O#PYzAOe&$`6inmnnFVqQTi#}N(!z6XK<(Gsxkh75!k>PdY^{{HTpWkQs- zd}3`6UAHdqm!-(L1BVa&?-qyQ&-+g%%KbMEYw8H^D;??TPZ%iWV9C)OmG*|dc^%_* zkSLKn!Sr8oAqw+9Oeg9DA?~hsQTE~b?@t?h+gq4}8Zmg9gFr^z!PMIRzx2~71k*b8 zH}XUJ-^#BKFbzB2Hw4{*t@wYR$sB$Cm{tF)9kIz7IPRCSO!el_$a4brJ$4n!}#O|DZQYu1{tPt++aa%j`_?dw%CIk-Srx9*YF;im`>{0(8CPw?RrT*Ym!hW#bR!nI=-KQ=c7}*o(aM3NpF9a^Rz6z{%wv>9f)EPZo)-SlG|VgUnP8sO_y0mWFuWuzC!biv&sxiOmn{5lm+?jqj2K2PQ5yCvOOpYgm)_VA6G4h~^zLC9Kyh@A#0z%D-;;bi zhxYUJD>{MKUy1B~!S6>h9?N2 z;#Bt#U5fW@_(xX|k@8B?+=!>r%E#J6x(T$aJ}T^VPAs-(h#dFQwP?;&O;Un)oqIdJ zK+bb=L;Ym%!|8`hjYEc`MlmE4Am0L>$O8|zzM#otI;^K6V8sjt0l>GcUdBSc^B=|r z?rEqn^4c8}tFIBxfD8>jT1|yaie`^k^|z*|1JbB*li6Pl2Bs# zh03`m-baT|GV&W+{}>e~GOG!A0*J;`$6Uk~WJ2*-0-F4~d}&oe%u=?$f)4 zv#bGM^hOZh!kmC+uupEVT|~YYU5@~iiv!l_ z_A$rMJ~CC-1t4}!0D@Wwki16Kau_~9Ct>?=dNw;PTl}@jgA)TgE9K=h!6hP^J*gyI zz&!Mjjlq37D=Pm$oHY zR~EJ>n~jwQ9D@hSGdB~o4-LX~>6O)hVRbSMbQ*P_2$mS_5{kn~%w}B94vHTCc9pd1 zmXOvM4#a|`sH-Z8X&31VsuFV2$Q0k#Q-r>wE64!5x4}dT_`EwnQo%`B*(4XD!qrkp zX0t0Ggqt}hee^EZMOYJmNRA$p`!mgi*o3yU6CX{AS%^cIdgHl3R~<;*NYzD^7@Rio zWFdwCrJ?x6?BhQRX)orvTg6tE_F z7$8>;_3n$g;LLSW!Nz@T*~y}$GTzD^dhIo;@Ik9DgQ$HT} zq76f2WwJt%dp(xy>9m|rim8MDgI+!8FYDxkQSXN*ghvCRT;7wi%G`~+tcULA1ZY9B z2LV0hFg_Y`HM#pco}O}!pTuO@=0T~qdW@nixS>LXZzs0Njk%5;IIr))aotgS z!Y%X0eW|a(oJFF%e?5FHQ!|K-i7b?s_zt8QXVCD;gMwXL)Z$*Ca2>Y}QIiy7N&Ijw z5r+)JhE>G6+N2-7q>!J4-*Pa)+6JzcjqC|~t+&>K><$~$W!O*2F5#bu@BJ;bw=%jl zg_kzp1FG@U>Xi&S(2_<8#ixBE{_+E~lxoijLU=XzZMbrj6Wi3gtZIQnz?KPYt5L*( z8p{?f!@St*t@auWqDBlm?9mQE+fHKT?T54sM%et_2u2L|BFgZ6aoBVLlT?BjJp5(X z)P{L#M4oSyh$@0Xn=@?dO0wL;@?uW{MN*V9tRtU&VB(Gu0d77giy&dTA({=KQWb&F zkW3dd7MfRi`{5bZ#EKpB406^lk+_GJU$G?+4hy$fzt#lYG+J6;OPv{9FR;qroJb!O z*0A>o%NvkPj^VNI<@&`f8au$NnPxv*Zz!`X(8~k@`7U(5uv~eiz-deTI7~eiFArQ=D#u5nBCqzqc zZbmKFGzf|f*g~6Uy`zliZ-y%{uPKurbDuD6x`artsOh4!PZEKXU^XLFrH7?{$<-0( zFdan^JY9CY`e_CwdIC=(q&CHz2%dgNOz=}2g%5(9G6>mxKCDV7n?-cg2-uzwYw)BB zR*5pFkVowHdp_*;%1Hzr9p!M5HpBy$*u6SqyO}SjX})*B$I$FC9!LK}4oicSy#YUa z%*TAX5iRe;q-7utB>lO0wLbt!JwoSlRny`?YJb?-hRmb8|Fi%ErE^`i2*Crw5J%L4 z5TpnV2Z?~7!T%-AYrXSUpgrotrGkg0IX%1WJLA6j(>+#9$be}~@yC%}kSNC!mPT-v zc^n+*Rk>MbuHDZa^>mo_^#2_(VUK&{yV7Tki)eN%0sNZs=7wA(6N-_>6N)gqgU>cKV2XDA1N-^4 z67}L7<K?oCG>|kBloKv33@sXJS7^z{ctCjncafjZiU|3t6;^0xn=@W7)eRV$MVTY?PlZFVv47I@U z!D*X`MPiO-ryY{|`4cxo_ zC>*Uo2usneqbr+JhJAdw5xd*%<0D>f&b_Yq#_GBRLN+(uy24&#vzU!h0#Ua&yy*SHU%x-n*Cq5DwxA)=9O=Whe7;uGx)qmI!dvxel^$H0FXF_`g z8P_4%aq|M$ogg(-73XULaw$gK#PAwv85c@M%spe?E12;2WP;;H@7KMSxT{HEUlGJ2 zl_&H03`gOaL=7mv1zW7D+NNnb@p*U}ML-~@VZlg@Bp=Lws^6ZHvxIj8k4u_poqp+9 z$^CZeqRY|1F62b3BRF2DZ9AvJ(VsOy-I z%rF2X$_k5*Fh2K%e0L`ef}&q4)_u`0FQW;@;9GuBYCo87ymd18G&B5C)V-fp!msn~ z;iq=f=!GJ=&%s2*3Mp_z5JR+5hCST$`sIwz->vL(aMMb8rvhlH4AHofBxDi#ihR^v zM9Y?H&HASC)Q0pxDgc@1pbFSlLysQS>H=o-?e=F>)`8K?TI1^aXN{vNpwCsSrL%tI zjZBJB^j=pUNWUKdPl3czgvPCR-Wx0{hn(> zOg10hJ4Z&e1wwOW)WKh9(1FBsgrHVv1EMBp%QSqjFG*a60tUJIQV6dauYi4N*@uy& z_7NZHOzD)`i-UY7a4%?f_KX+sMo=$9^NYVmfvdZd6efS@RWI>+T)W>u*#64aKa}d-vri7k zq-wH|n3Shiz|dVn=N2IIx}?`t!|wMGf^mQeL4aS?5(0f7+A?ST>Hf}Vv#6CvQS$Es zv_WvZ<;UTBK&a*j4y1*Q%e+B6F6QPoFxWu0sH(Wmt$2JPO9G%**vu1voHeOjc*6%S z4uYS9o*Vw%N6cr2mub^jZ0LL?HSF_zvh@{O6czJ;G3wQ~g2tEL;{l6W~8xHD@WF82<x8fQP*fCjtOp(tTZF2OkyecrehfX_L zhUX^~>&zP`m#hjG^CzvVp265%Rgig&{3Jj%RHu6FYe3w|jQ;c02npK`0EI*Rn-bsB z+VWJNP;~f7epRSh)00~oT=x8B1#T`)(vK|aoU{kc=_j}l48F=V$&25@Sh_N zp9J3}NbH2oO&nMpbP$_dIaM_8|1cp(1uRK)r;W4wp{r{04N1V5@{uzS4kJON%RS}j z{|KMH4C!y;<{%j%3!yt+!{N}s^n0pW7j8cG3*;gD+MAh2?>hR9EE99s55I4wJOS%{ za1AJ&!QQJ+Fh)f2E;$qsMDNaD?|riehpIZwo`Qder2M<2hrIe7ygdnVghVL#{g_=A z)ZFA!R|Pyrs^?y7HH)>5!K^zUA}HE*k>uGgtXT|tNr@>?wFpGWCQpq zqDcbT(|xCP+(}WGOP{n88&br|bKwD`VK@2i4I** zgxMURRxG^K-C^pTiDxM+#>8^LR) zku*ezsOp}0e^ug(YJV2^0iWr$TSUfR{x5R`yOZviYQ0s_*TQHs(* zK)Og1sZymzB??Lxq!$qZ0RaW1Lll%=q)Qhmp|?m0gk;u^`upDb=ACQiJ7>;Z*WnKn zclKU;t+iKq?&rRrXLIvDT^!h~b;mj$vh>)w#KSN#Gq;qt7Y5B1W~z%`ON|Zy-~rw$ zvmsK2?WKfCZuL_D|K9IBpen>a{LIWzFfv4DgF((4Rdv&L&sWy5m(k@D;}#b}4qWwO z4nJ;V8xY@}z{x~Qo2?SfW*u1g8x*PsUzL@OCrn)__EZT5XU`q;Id(b;|&8rFxj`!oF#@-E-a{UZ6>GMmrYUStt9e=vGjfy;MpX;s8H zjgvW5me4+@nmX^+dlXHfs7}i#IBPf1Ik>!(M5f~|V!I%7r%$o@GAA3Qauey5{TFD5 zzXU`E*sl1GE$@kMlUvtl>a_xkG1ccXAInC`2gcLG@CV)XMm5#OUwy&y1z>V7DG(C7A|JUKjX?8WITg{zExw){S7`Vgy?0+f~JqJ4=#!G}-ppe%($=GpA z$NTu8q!-Kb!GDV#6`NzHzw5+q4*lvobjmZwT4KzmbPi|>1SL3Zl0X8PbiXNYHq=dS z_Htl>z4zn}yX_QW`CX8vHfqed!-YjU`zP^N?(2)nfQtKxh7maj~O^v9#JI zG3(t;(AC|>1Df|YRp$HRp>X!H&PYPtfJf_Vu!R4Xk^y8{f8V?`^Z@eMB#6p!iX;Z3 zh6VnL(#+UkP4i#>h}hy$sNny&4iD=0hm~3|I$Up5#}9g01PmDlm>nEuZ#p#e59;YU z2H%)_BmU#c-`WFb7=YVQ7#CT%wn7gZDgLKqV0hA*S2-F5(wOQ0b?}8Wm=d4>j8v@h>D{5+;tpKS1JPu5L z4ldm0=?9U3e!S>K+70(_qm9j3J;&S_L3F!@ki)z=;Zr{R0$_zWosquA5z* zV?{1QGQ+B;ojZjHvV8Avw~~A5FZcr(-}*14BQs(U-3fX_lLIbaY-O_bg{yNS6SW-~ zPyP2aEf5h@&Zsv*-144)lDhm>|9!s*58U@t=o0kV?jI_18OMwOLJtJEIvj^_k@owI z;x@PD6yyRb{^43x6(0a~pEW=;Q_e-Gts+eHV7VV^>z2d66C!$1qZu0Qbla%y@ZL3n zooroXDI-+XG-+o9(9Z>TzujjHZtTm9)t{kp1M&M@zlE$J9-@DYR%_Ksopjk6&$h@rt zGX26|y%U6wfq-M#z*a&_44DB8may>m;T3+Dtl;phl6aR%_W%O#0-~BZB{r~o-}oR` zRmwH)(GQtqxBoKDm{!}_lxXmeP{`UkbJtcyZ!LFc6>*WzVBa80<`uCeo2bfG?J|1 zBo_H^8eM-h2iW8{F;FWjXPXrYDLd6#fyfa!l{&1T&=)ayvuD>P2B;tz3n@X+H9b5n zzzb96c>p~);lGH?0pTNICmI{X*`u4Vvpc8Hro?hlPHY03bryNx4KUxuUzUYexq)1P zZifyN!mG4zGKD}~YYUFj|AB&(3NeMclL~tVphM}HKj`pT%f~M7hqx~9*DI<8U~T|7 z0O6qO&EcG*^=H$UY}mwq`Dp`=!osxf?Qdv^41+ORU~xYr?}8++2)VLPiqq-GLZBFP z#@iKnXRDpN*-wQy0|Kthmvo5HcU^ZzD^P#XgrSJc%#l+A@^GXB6&XJ0WoF$oY{gQ`|itNyxyV7k@11H6LO{T0UI&)kA!_s zKv^ZFm_d>(3e3iFN%wtwv4u2}G``oJni-HTa~}m1w$QJ;tz+*paG&2|Z(M)Vs&FUX zkNQxoRN76vs4fe4+A&yV-7~{9P6E(|<`-vzGq%Xd6{)~fZW(?5#Nh|^L9sr$NT2w)5V&5W|lGb5FWXeVy`IE zcKPdF9rf$LEuaOWKO+=~MlcW@G3wt0GxPZLhN6D1FS8++Ad`J!Lxwma4p8KK_S@eX zeu{Sncr4tnJ-z@d1i0`f_Z`0Tw#IMT6{I&S%8eaWT!AsN|J7C;#MT^Ts=%;{UCrn$ z)d5Qc5T038-EzE3*RViAXOYIBxRX5bE9Y4qR&M`bA}cK4*AsMbZE(=BU$5phon|4{ z=+rsI4CnQ{>f9UmxUCl$I6Zn}4u<4!fEqWrO-n8mW0!Y$%nk{UKnh$k89ZLY%>R5`Oqph}(315CAk%l#H|@rRJCIS}FYpz9!9oZlRn z$qmOCF!`)<$)|xBuo=^GlmhBz=fR3H7AiXfn$3v81$lFu4~h>a0`@g}oU50OC{mdI z13psL|K;rdC?hXoUh%$hPK6pc@W^%4TmW8d9`zWX$t7pPeWczF)zrLPa}YsYj3x7R zpH^=zinS?9IvT%MeA{#cJ+*b`;hMM1iH=DZ+^m^5Ybv-Ee^A52sN`9n!}Z@YEjb^) zU!db%ua-`p1zcKVAPwlCY`|=SO7GZ_;xUzC6Q1F8NN(ZwSrNR)i~L=Z0x15SB48CD z3hara_EZOJiP2GHb_vi(N(p)9r~~LL5)kPw41+DMT!VsC0oQ`sp}m0X)D(ZgKOhmO z!tSn4vXe&IodUwoo->MK0D{S=mMHr%+)6sdZ5=TEs!LM5IC+LYv%P}taP1|V(oPy# z=uuqfCbXJiSBuN6q5wM2%z2w)5qcfmOMa4^CVtU+rKTj@O91S9hqt zj7S1h+KJ!zFOmb2bf#9^dT8Ds)Lt5D1Y$Z3kahaCp`PB8$$)DNHvDq`A1c$px zk07Q`RPh#@g?9h}qTysycW0U+)}#SEbAv<04qZln{dfvj@l^QvQHR{uEJvzchSbDm=!Rqd;_1gh4sUDvPc4nlhe>VHn1{u%g~fEVmDQ-G|MgOg#0EJ12=j^m8Ij;^VjM*yDsFmRCK+$=3$ zU#g}UU<5P2OshfB7U$%dJiwDJyB!G$e)hDzgRMXdf#dQJEL7sFhilI|OR^HUDL`Oh zHV3BFlR5Dv46kMHNrx(`MyN;f{Z>d~`TFsz^gtlVa#{#G@kaC-C;Ob0YI;PW;#AnRqv0c1J{7wv2(gp>TXZ>h!_e;JKr3v|4EfOtrO$0G@wN&F zv?f#3*FbE}Cf`8>uTEG+yu?LvuEalvIB{&H>!5>lk?}u_4?Vomxppey4Ec#c@jwu5 z;mS_!v`B$?veu%IR;EH~P;g>wKK$D@=cIx)eY~#A@kcDTvAPPSNBzfaFaGv&40HE3 zzH2Un%pWJch3% zJaqg=_2&dUL2P)Nv#;gS>@joW)Zk1#9;{L(8 z^(&9yka}>s_a2lz9;gGSFc|5!;&IOXoE%!Fe;GTM;Hpjy5H1q=Gk|uVT?DQ91Ngyw zCo6i%^zK3-pbNpk{}*=e_t+-q1Njqx1_pu>_b747!e*Pe^kG_Y3*>q)E<&wht&Ffe ze5ipjF}bJGiXxqaWC|Ta{K*)C6s_58SEH^*WX1{jZw8(L<}IOTi;wUG*^Tq3hD!?t z;XP&GvMOw#DVbr%ofX8sY9r)c0v8FwBQB7!kUh8mT!wj><<*aXXD9{geE9or&GX!u zswLFp#kFx*Hm+|!Qt`v?Y?nDbaadbRklJZxM$2 zO(kW!i(`Fa6xOA<%%;0E!`M}Nopx1#DBitr`}k$NCu+}|QH%`BDp4LxC6S&&&(r$mn? zC^rBE)>Xas^GQK>B^~Bx(qejLg`qVRSoB6wmDT`QS0U$g#Wv#2@sDIlZR6f%MA9D= z22$km{#P=Q>FsodjBcjG(e!2uQhmMChdo z5Qj?*NE)8!2iMOT=zpzVDQQqX!qX`c?g8L#z>k-4{8BaJB@mNTG*gn;S{{l z{pUC-I@#MNl};KA&CZ7@V9}FD7T6`lKqCvyf^)H*UOx0m*#VN zDG=^8_5xO)1Axdgc|EWGlUOnk!hV;Ai%6?lwRAmH1Px6axgv2=@g5Ldh9A^3+L5{p zSD{^ag*5OKy|hALNu{O;gJh4r!4;kP1NtYb5&<^>7$J~lhqB&pW!^?&tS|kHZ^QB0 zrODvl1Bi(XiXxC^*gu=<%{MT zxWCv-GoK!2H)1we{xMkK1Z+tA%mN!n`n%K9q(qO>oDOJB7!ZPl>R zJ=p!;m{rjSZ*B-e{{Hx>p!wxG#K7NJW#&0;;C zi@O}J!We*bQ29>)TInIn7-<=Z@QV}6Edi$g2f~~4BxVHUsD1Qa%qF(O`r)UI;bUHQ znRn$s;NDjrL5lAt7;=Xl83LNbAaTPV-u&6^UR3Cy0cI++FXO`~X-1AzrKZkdL$k}k zde=J|3`TbcAmlz6eg;()XnMPAma2h+cp2fAtisHr^{|Pfao_HoFv(FCeff}W7Fov-klO) z>L{-*un^<&@qjqDUkv(}X($eS0#K5<+VMBAT0Ho805ayt#K#8w5vvT5W3Pj1}~nT zoR0CPtT%C49+V@>K+QT=66CF~qMge26X24B8NH7uQW6oNL%Ci6R@nl^zJGB^I8_?j zaxMdc=%aaHZOe%TV1@vhM)Pam=d+iZWUEg}I2`k#Ir78-FuzCZ&#{WJ-`8t5_#*54 z__0x-{Mb7n+2H;9=%|RV+Pu;9Wk95{Jq6_22CtSE>&$TIa;p?qO3+4lA2?6$iz#-L z{R`u$KkbgZn2#$+V+Ir%iS(`8^9@{qTbFKl1Qsuz>l(LNCI~Q=h|;zT_*{Cx zGK@Y($fwEk6aH;U-RFSSLc z!VU#~c@v(Q8Juo(OsBlWA?cxTTF|Y|bp9YuTsoOC>nI{Y08Py3*d-@LRif$Q3?ZM> zfNacLT1LxdLIimm*X-V0W|w9W*m{2ba1~|Gyqx))`=Tr$Uexkv2q@@aR$|SbrAaT7+l%3&=17uYkOORd@nH-xipI~A8t9` zC$jhWm8pSOHB~@E#&3awrGzu#Xs4>qnEj6_ih5vyV798hp24Oi2#`K$NJ}Rl?B<)E z0I5IjyPnWJV0k}?qcEWEkOl;ECQVmFhL3;{pf&YY4AdKVxo!Rdq~O~&t{Y5gvT!Cy zMS$Ql=P52+Po`tAr-OOP$|udD)hxAmFB6OHAv@Wk zRB!|Jb-u{H&$YjU1bCL|M4^G_OWb6FeZ)-D!l!2H%N5DYE zV72O^Ww4V_eBN~;6tg$Ij&}jvgf!MSk|0F_g2houko^wiU084O8>+<0n~bc@cI*#A z907Qr52pgaJkaaK#KBv_o{Z)eK~lR^ib)_y93{&YQBa(ql`@g?ol!ERmrJFf^MtZ& z+~|x}Sch1qX}q4+TTv+fPnUbz7@HIcd{%3zkQ?LC`-9|shDuUQl{1py)cWQOxWkDlnO2eFG15?PW~y4KNJ)VSe|3dH2@mn2zViq z)>JC}Z=&XyVJiWOeUmzD24%z`k}(nrVx#zVbt-_VJh)9xelgCU@@2;F(+ zBhSGngiMOx#Hae+Gv(+&~Z6oeCw+qe3gd(&Q_Lsz1eYJocxcvqs0)x^f zG*DRd0sA&n@sNs@zCQ=|q@?q(n+ZKP-*{dAmI-r~+L3DvPaaPGTvS994PH#jq@ery z6H1aE24=$R+n9;Az}?=hM^VX^5s#FE%u`}Pj@hyqHrLtR-n)Gq zr}JVIc=Z8+=%CB}Q`Ybity0k7e7_?b$juR#{FI{mCSIk;$;Wq%V}#4mg9AjCfkY2b zv|0D$#;@-XV@i;e^(Wr4WO9xWBZYv2tZxhvfmtgs8X#Z zGbj#!AwyB$&K7a{6kO?e(ZTe)+lxy~!sp@Zfg3r!GB(6_Pr7nc6!a`wF_}S+-Sx;! z)gxWy#b!AGq=zi}hr$#0zu56Wdxqr!*u-X`JRDf$sGD#_YdHjW!aY3})*Ge-dJr6y z(5U?}8dj_J>kY`UInCMYedo*hQ}6?pL97p0*W*(?ZY%<@grv|8YX@0getyyDeT8hi z8B>Of%uOPv<#^@5t_Vn-t=AyF%7NSe4%TvCGdzFSGi(OlS2p6ZI#_)(xm9?WlXn>k zf+)O_>U&9)d%-zbQI#;~`ma!_`@onuoK9gy2n2;KrGfLhsrG;4B=u7f5Z$3z%FwYy1=;6tO|BVj6${YAs~Ba~P>#S)Swgv#Ky^gFMQ zSsJ999!9k1IrP>Ieu)|qf8tvC^%N}Q*A|EFF)d3ES|ilVKLQ&x%bwD zAa9Ycd1tIq<}Y+1a!Vi9_WrgOj0%AmRYJ%vzRP-g-@o&AixgHMU{%Y6cDVo^ceLuB z-?I?pSg5xlTG)L$TcgliGj5j$O;=~XdSCj`!imJC=kQsoyZwGCU02Oj7`eF7JxU0| zs)Fp@y|kbhr;*xi!H-Vyracx20VjI{b@S_ph3D`%L`lpA)kq7w#igdfQwRa-U;4F8 zHkWFp^FzFqV4~ix!+x?|uWz8E;9CYTA&h^nr2vjU5B@%+L`8x}ogk+4LGQ3t{&o`A@^f-PABoghR7!EK6J1 zCc^wx$(XDVX8EGv-I?u-3z?`Bl5@|(ml_6b_w$t>PT!ioY<)wuchf}|rq`9S7nAAl z)@c}!3a77s!c;F7F_gnk-DchPjDTW{tNige>nILL=`W(Qx>cucIR}#(-EvRwCtG%M}269xtH!)FofT&ziz#aYA| z(OY&zKG4~#dBj?(dd& zk-6lfXDS{d^!QeJNxm9VvJPu1U3p_)RR5Lpel;ID*J{Cd#omo(V?yeT1_w#}iSTAu zrMwZzXGI9ioTZQOxY5A9+YdHD@=q1{VzH*zx#9C?)4xyKK1fUMmY&HOrAcp3ssEMI z&tih1-|RY>+=p?T9*K>5LmW!xXKGb%EZnp9Fh|^|9eImdNcPPkN}cdb4=cR6kCh{q zz$|l7oqH*y3pyw;Y(n92nq5mDljW#DI_V*B8<~k&z^CzA&;M%geJ#t8l9TCfj%cqb z^pR#=pB9qqEaJ-&MqiL8JlB`<0m zo4jGu-BxsguXR-gUjqIY3~ycGL$_sJN0{ce@5Sb}&6Ec$y_|5yd!k)WUxii;K5Mi# z9!%0>;7LK>v|<10m@0J4vgwKN@yP*9%KKizWS1Si2=c8zSX;A1kqKT7hQsB1f!?B^ zfY!5UP?TUH{GSsdk>9b&caW;hP_gI}vWT1V2wiyu1GtzfV*|QB8VP%;6%wljdjh9N z{w|g(L*2Uf(O$T7>u_tD-)jFo{G!A=i?t1jbErpc6YuS+XSne18q9)i`in`Al8xms zgN0@z&U;mZ=F}#{;g1f+fvYbkZ1IZ&1r8qxnPu$rtm-hOYtSDW?!~R*Bz5n>H-whs z#bCJ^{(?Bvr_Yo^9(YO+W3a(gLAXjgGI|exHf7hs6x?9rmsO&|GD2mAA{5CJE5vicwu=Y08^a^x@iVH zaa9NccvXw%&!fCyhZbHQC@giEXFg4Srl4%-{NEk^uU!w_m0TFP zntzI=vUET`z;R4)1g@JX+%s*iTW_$SRq$LK3@%4)*BLxnE3v3`SQ*q-QC-;?7gFBr z!Z;o44!5Xt&sZcqGpQ4oW=dwPXUFxS#*3*k;Pnfmo~wr%A_HdC3SdUV{iPRujyq9J zrfw5#JpvqzRqJpil;wj8q_H^o%c}XQ$QN?)P&lYJE2P!TT{891+(#n*Qb7T!lsS9gV)V^GDWsJ={Cy~D~o7o z#|W{@o`LOF+Z=VvV_f%?V7;B4dmi@(tVolKF03o%qyr<1>3g9U6gAY;8g&hO?F z=DO#iBEC`82KVXc zpvhG(*-|>ha~kKsg~?2}WQKa4Af~#RR9=K%lV1_b^&vVfg={YubVr{V^?-@s=Hojz%9 z?o(0Q3hA{qPgN0!SV3w_{gF6!w`ScvuQAUKD$BwPGufs52m(Q(PGQ%PE1%1eo<|P4nlUXW)SM0kQRC8BbKM$D#AYA4hQ>ph=S_d@$f_A2ahyXw;=SI9O_OH_9-Co7GXypQmxUHa#> zald315o6yEt;g@{Armrk`GuGkTLxo_EId0l^99kBw-~8R$^)-vB4d>iGqqdw602*Q zYDEva<`#YKd>lr`?qY5EJ%zOFlk-qMJn zA34up=aa}Gv*56Cuv1jnc9e=W$^3#{u{YG(Ybgw;%v)*kGC5%Y1$(jS}-JDX4K6m1* zdav!fM@DNl5zNO)XPyXSAEdz|yqB;gQG?Nx2gr*=Dr~afP@%_f_zQczY~lqul`NHf zeuThJQK>=&iTTRA)^k7ZQBN)k1%US*)YwbR<)7y3{c<*3`Q^Eyr|_BUH(9cc#v`*A zEPS2L1~<)~u}#Cd#_i@ zCr!DtlQKx1f9>$bP{gat{OHQ{qN)QzgZowPdA89>?D;hj9>udC#ZF(#I$p#&uajml zkjQu`A3lR^6Ye;(n2z`DRral!p0Nv$&`7mEP%@xUH2E+nO_DV`u}b1JTB=;n>#4n= zC&P3KA9*9;MQ=}Fep#>ibU8TdB+3p5Sq-;=K(T z8Ya)LHJ8Nj+QUt=I$kw7X0<<2O*|i-)leS38}Ikb(;~7j?Z#tTC5)PgvQFrO(!uMV1T3NUu%~Go#5LW zUfu=kY;22d?uJLi6^xCCA#_^MMEc{=&Y(m^BQ2M+MFu0XIfyNUo>l)En%n*T7_F5s|5U{A!Ez z()Qds=0a%)?_o2#`r^0Wrq3rE9lkUCm?nU}Uf}%AkHf}BQHTa-ScZogtmNypPHZ~K z|33P?$36XmVk7jc6>|?Wczv<3LI3$=8=Yurziv-}Dqkb@^Bv>*Kb{@gm#4C1yq7Gl zC7%8)um2-?qiD#oe2rf-MeX0AvNSSB6*GPKRoI{EF##UVCP0}NF3;Bi1N+Rl))r5k z{@lVZZf{_~hfiAj*qmH$S-u6Tq5~7XDQ2Q^)2XBn*#E({jLOM1>mAJ@{|)<}$0sMXYgL&`4<-*Ec4xXY(w}i-Q=O@J`7khDP9Yx* z*{C4_qZWD^f-hS4ShUj38)&lHl&t)(j>sRgWDV}S?B3Gaf$|N>J}bpWpd4^Z`tVPpz6|KUX`0XP?GtdjoI*;Q>*UaC)w2=Pg-;!1DF9km-`N zMI)9|dfW3TfF3*?ZTVCSH?R9h$30O3qs(SKwy&}e6ZSmUIH1%8d5bZwMJnB0A^nj* z<3eXTSae(wXyL0$I0S$4rr-;>?StFC-MY@sXq=1li^Z^_)g*Y_aZ~pU&LWhrR@?Xk zFr;`s<${0>ci9E!;nC9wfl#e!f36~wJguj=(;0MeHI?PlXR|4t=QBgkpluiw&0St} zH0u#_bJC5f$v8z`)}w|<_a?j5rJAVp5Nv}hrIv3380u4|61POmNpDt~g&<203By^t zx=F2wqlM*e0cBr_<(%vcwmzCOb2KW)@WV>XXP?D%H?XlgH!i}iNBBKeiQ63v5Roi` zXN^1cD{N}+yR#1$l4`IM0?1pP)$6-m?j@?gmZ7iraLabePg3|^3eS$QAMZ?)M#gQ4 zX`wgpg)%O#r@=B4<{6yP<-R1ki}2LS8=$^>BV;%awP3oSprwMX+0+`t&fiVbhc!j| z<&tW)u#QR5U~N2rBv;Qt|J*&13UCS8@c#oS zkdQG2a2Ocz{}!KEV$o~y7>rlNrqJ0XF%U$R_&;=V-NcysKNv3b0(zUYUeGY<3IO6} z##y@m3=loS{sDIg=&t`A=KP=H6Y6sy%d{}_`2D8aKulA50WC4HJ~qjO+01NwvJ|np ze`n`Im%sfE-o+oIk02}=uCk63$M#s6UW}~luD>PX%QX_QWP?wj?rHjb>p$L8QWY|LLU6 z1j@+@`C>QSV?oXPEy+Dn!CsI*|H3sc(x{>Gam|=bEjc|XVdR5$_oWnBn_rDVZv6`` z*_x>@uPHf&@Na4BO4^(M`L2n0XmCt&bZ2M3Y*1mFY4ySC{43tnu8#4EA519mWs2sR*t*e zHGo;5=10mWV#QCRS)5{$Crzi^0yNm%H$uB^-CHdW7*F;`8d+CdN3`l?5C|WdZ!PK;0I#Fvw5c99LPmUGqw2)0${~1#F3JVl0SqO zm==xhIton&S9O@Ex)@hNN$2o=W{o%RRe#>2wiJxZV#*(d1GBjDfToZAyGBgl=0}P4 z{=1#VBnZL0UCAN>tC#gj-c+jjM}N5&#Q@GA1S*YgT#XSkBK=~>u3;zTC6|l6(vZyv zSbpNd*+ zUVH^cuZ?}L?l$O9tXFHNT<7$*$Z0+|O=t~HVHQckKTfo|PuhMav@KGqh%HYG;vM|MGdQnKz!b-J!_IPA3s` zXl+g}>zrvtPs8x^YY`3VNw?!SuVpw->3i$E%m&WceEQcuY`-y&@@`K5{WLr$TH7mL z$%eSj6+c{NCu@}((5Br@Fp*YFHocjB9ns!FEG;W76-|_w00lb1bo5Ph(G{99qFtc) z0R@imUi8~iQO|7jpK6wgr9Z1$767xama%@Zkc|cqF2<^}DeiHsZ6Za&SDkhN9CB`W zH(_!ZFgxoDF91Y(wNXpsIbQ-7JR3j;57BkKnkL4#&XBS-fZKc;q&ff&`in-Iu*I?x zGp2f<;h{pDrVu-9u4x0D3miusc8s6cB775GFN%yY(k+Nm*wi@g1(mGI- zT0Uccf=URWY;2kx`_n>aq)qG;s-X66)6c`+8mkv+k&)A|`v-yS_^(rB1CJIoFvyiK zfBQOXkN;}UHpi$5LV&4pNk{MWVNa%0^UvY7pC9G*4-_|d%0eWLKygnIEj@cx-iDiK11+vRJk9?*ZxEHPo+4k1t*64P+6b&J+hLI|RSMqG;DAq~B8cYu382yR<( zcZ)s6am2aOCU2NXt^G<*^a#9sY3Dqzz!DG zqSWgqkTe?n;Ua+2JZ>k{y%^d{XnCO_Ivy;1;XQ|2Gp}w!$3mNS&l&M-7d==L_E_8` zuaESLMjoaZX}P;*^!0pKkGek+(2X*ma{L-)C5)eb2SAQEzh;1%i%-PWv?TrGSxd># z`sbIvT_tp1Q2m3)F35A80KBMA!JNXZ}Ul z#A4dla8~Pg5pfwGSms|im@Qarr4v}3LQtGG_WA7~EmIi3jdm6e9zw|D} zv=g%qct<$ogFb7((t+NCS<3UBPLxT&p9+}pdQC&y?*AFMKaVb&3s;>%4}H2U_iSpj z>q+%W_E*p*;JfjzAxd$2K0WCPO4YFH+y?d!PTQ{67W8)v-1hvnp_D+`A-`=(g}LqX znWxDH!k~;fsV1UIixRLuHg(^v_w%3XZ0W$7f}7%|xASLTg75AT@%9LCBfHn2{a_Rr z!(zlz=A~+hyPww@*}P4yp>>5)Quo$&i|N>gp0jhk`_;6we1O>LFach>U9A)AMoz%3 zEGjFqsa3R4vsrZETCO+Srd9wjfmUTD)Gp|dd?HBzaV@0dpYL1O0Dx*#jzx8?*LlhyC1?-@c&aHXw8mxRFbfdNv-WAY*`5X z53Ga2{<0yM?quQu?Rx)7R21EBjsd`0`3VM4M`dUY^!Nes5z!lfBY+0ROY*|S01-fd zBKcQ7!iFdL#Hfph-hjc@s9%vmn+3*l|8YF#3ZB}O_*8D>BB|MqV?|mZKW?9Pv~K}l z>$N=WH8NPcW&C{u@It*CenkZFHj8p+v-}yZk29)+w~^;~$bV?KZJA{Cf!ePvsEk|Gff`u;icJezLn3 zx^F{5N@E&0J-?%zSsiy#`KfYS-=~Bkwp+2ek-iIg7?cTT?F>nJfQKhEdeg74+K+EBpeA<2o3+!Er$`m%le=E z4C(}RpW=h|AD2i|_k)_`B-J9=*at)4D>C1=wMuFV1CH(yoK0Rjo4?t1nYultWg9?B zlXx(mhw-MQJwfa;vKYJ)6jZl-k_r?f)|?h3M_SDOoQ=ZRxpuv$YB4GB_gw3@ko8@g zn{dwWSr7e1l(Sqzmz2*4nFW&Sq;_W4)`OZzn=L_S(|?l7h(d}~aO)-v)^y!Y57wnj zzXr;E$nfIxk?8uGff`#8XedDEDC(*ng<1?gn6!_ra*Zk^iB{Zyzm8mG21gZ-wfuOj zYH96?yN$!Ff~Itg^Z!#2@}EK;>hApb@j04iMf5xN#wyJ}7fud*9+>Wrhtb^;ozQa+6x{n1R0qi#5_@CCgQ(}oO|J3yMf7e_g zR?}Z?POB4IW&63|5oi7s{8)8T=IH89I&IsJM-e>agWg8RT5gwT{jT=g(@(75kLd2K ze6C&%==-6AK?H%5C~RLKMZP=n6R@8ZCQ3ApqH32_B0Wl>UzUnN$2+V2uCBHkxu`Wu z7J`B`G-y7l>+Wa;p>~->zMJtAKK(eP;PasK)iy2klcR1$)9uLg=w~Z8CdF9@ndGB) zLoPcE2Kq(H4G?Zz8*Z!eTy(jA8T6;(l&mvG!(^3cVG_*KW6oK<+DK^@4vJBPDUny2 z|I?pfQ6^6luqY$Y;6B`F9wan<6k&c*k*Jjm4b&4Gos;uLl72gRI3ZSZe8%Ea?{OR( zl7~E7(C>@z5L@aGoIY&M`70CCmm1(DIxT;VU`fA;# zX^^AzS|hnFFiVV$D`uaTdF6v`$J%3wTF(c2-m4>mZd`T5?8(_2PI>xmkUADF3OkU*scDFLVcB6j;6DRdlzd^B${fo%i^=YQ`OS@yd zX@Tu?i{AdLObyAaJ1cV--cY;r?cK?YKITHfRqWjc0}8!Kg_oZxA!%M@Rejr*E4PdH;j`wyBO~V$rV(JiU=KmiMIT;5BZaB z2KwwvWs_URjjm1!6~egj$wh~z?mN!X+upUulR{L}1P$cwv&#~!oq(S|#|QEoMc-0N z;n9Os1aHF#>Uck;*1XmhhXj3?!d`#1vX%_accV|FWwCjckw5tiI;-7tQ6enxY!jbu zYR+4J3Dov!Aq9tD61+qD#i>5e@Rj~@3QV~gskjoB*D~gqn#S0dR<{BLF@6J;ShAQQ zT3w|F_wmpP-=C`DY(vu>(ai0_8ftOaaH=yJioY^iirw%YhUsg$4OG2)Vi%^ zG_}d^+3rvaWE3u>T?Zk5+}z@f{b}-|51RyB{~IU6S=I>B(hZnpe^e_?C_9S2vIlu< zn!m`7aDBS49Um+Zve#2E9x=8kP`>G9Wt|BZhJ^7to>+>C(`{^y|Z6_Pn zC$v&=o9u^vZ^rdzH)fZV_(XD??G%zHL#G~>(j#x37FPQ5T&$oJKHFj(=(4s}#+n$+ zbiG}>2cT1$4xs-J3NFVsZ=XGhX#c=A@swBVn7gb!w-0EqQtt$WTZJHY$ex^sCQI&-&Nz!ROaa~_2hsrY10l+uOx{w>!`S@Rm z3o7d8zp@RnHAAGZpHHgvwxLVhs5Jr{l8oMJUU6e^Fr*PNJn=GB+&UK6BVby=>-9B^ z;HP`^Pd{N9XSQ$GZnB^XQn@@slb17q0TR4Q}u`5n85qcmzDr z!mnRqq>Kh-zqYN$e>Db=UDm$+WM7MAPNI;cpsUU4z7{F;&B1tvXfZF9NSmK1yOAPt1r=(&XWZP6{yz^fG-@T=e6|WTmf<2qVk+jkxJt zqpfdhi9QQV8SE2!MKxuy@e^&@U9uf*dSC8ap5HhXeM71@?E#}t>v%w}9{RF{S|v-T z6ke=|X5Lh@hv%_PTi83XBuwH&%VPUr=s8=@p3e>W&y?@Q)C>^RBXBz>4S}6aUNhO+ zM#lFumK)BfwHnY&nXrd-U1&d9uu)=zswsYM*I)CA=b{n}SB{(h;4g%fe4?toj}zU@3}1nxmj&ZEOHtR30i1=^ zc9cZV)x_+@w}@V|1|I?14gocdThw$g*9p(S+=WSNMr4O^jO|~tDXz`N3F4F8h h$W-`W|9v_^Ky?YS6j$&tLpwjkbtTPfg~;2F{~M2Z{saI3 From 6fb4cbe06a0af97d46385192f2e5ba22bc791d5f Mon Sep 17 00:00:00 2001 From: Deb Date: Thu, 25 Feb 2021 12:27:21 -0500 Subject: [PATCH 086/290] Minor grammatical edits to demux.html Signed-off-by: Deb --- algos/demux/demux.rst | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) mode change 100644 => 100755 algos/demux/demux.rst diff --git a/algos/demux/demux.rst b/algos/demux/demux.rst old mode 100644 new mode 100755 index fa5c5e9f..e36da7af --- a/algos/demux/demux.rst +++ b/algos/demux/demux.rst @@ -23,36 +23,28 @@ Configuration ============= The component configuration defines how audio channels are copied from -input to output stream. As the ASoC/SOF audio stream can have up to 8 -audio channels, a stream-to-stream specific 8 x 8 routing matrix +input to output streams. As the ASoC/SOF audio stream can have up to 8 +audio channels, a stream-to-stream specific 8x8 routing matrix defines the channel mapping from input to output. Because every stream is fully configurable, we have a matrix for all multiplexer input -streams or all demultiplexer output streams. The 8 x 8 binary matrix takes up +streams or all demultiplexer output streams. The 8x8 binary matrix takes up to 64 bits and is controlled with eight unsigned char values. .. note:: - mux/demux component can't mix channels. If you try to setup mixing - in the configuration matrix you will get error in component initialization - phase. + The mux/demux component can't mix channels. If you try to set up mixing in the configuration matrix, you will get an error in the component initialization phase. .. figure:: images/mux.png Example of multiplexer configuration matrices with 2 input streams. - In this artificial mux example first input stream's channel 1 is copied - to output stream's channel 1. Second input stream's channel 2 is copied - to output stream's channel 2. If the streams have only 2 channels the - matrix values outside the 2x2 square don't have any effect. + In this artificial mux example, the first input stream's channel 1 is copied to the output stream's channel 1. The second input stream's channel 2 is copied to the output stream's channel 2. If the streams have only 2 channels, the matrix values outside the 2x2 square don't have any effect. .. figure:: images/demux.png Example of demultiplexer configuration matrices with 2 output streams. - In this artificial demux example input stream's channel 1 is copied to - first output stream's both channels and input stream's channel 2 is copied - to second output stream both channels. + In this artificial demux example, the input stream's channel 1 is copied to both channels of the first output stream and the input stream's channel 2 is copied to both channels of the second output stream. .. note:: - Note that demux matrix configuration is opposite to mux configuration: - input channel is the matrix column and output is the row. + The demux matrix configuration is opposite to the mux configuration: the input channel is the matrix column and the output is the row. Topology ======== From 3298ca680397a73c24efdeaaae9b2085b796dc32 Mon Sep 17 00:00:00 2001 From: Deb Date: Thu, 25 Feb 2021 13:01:27 -0500 Subject: [PATCH 087/290] Removed reference to "master" in cavs-dsp-boot-overview doc Signed-off-by: Deb --- architectures/dsp/intel/cavs-boot/cavs-dsp-boot-overview.rst | 2 -- 1 file changed, 2 deletions(-) mode change 100644 => 100755 architectures/dsp/intel/cavs-boot/cavs-dsp-boot-overview.rst diff --git a/architectures/dsp/intel/cavs-boot/cavs-dsp-boot-overview.rst b/architectures/dsp/intel/cavs-boot/cavs-dsp-boot-overview.rst old mode 100644 new mode 100755 index 79adf3f0..24fde842 --- a/architectures/dsp/intel/cavs-boot/cavs-dsp-boot-overview.rst +++ b/architectures/dsp/intel/cavs-boot/cavs-dsp-boot-overview.rst @@ -125,5 +125,3 @@ Booting with Boot Loader .. uml:: images/boot-ldr-flow.pu :caption: SOF Boot Loader Flow - -.. comment "master" has been replaced with "primary" \ No newline at end of file From fcfddc5d3a79bcd650ee1e2e672c995f6e2d8593 Mon Sep 17 00:00:00 2001 From: Curtis Malainey Date: Thu, 25 Mar 2021 15:29:08 -0700 Subject: [PATCH 088/290] dsp: fix typo this is a big astraction Signed-off-by: Curtis Malainey --- architectures/dsp/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/architectures/dsp/index.rst b/architectures/dsp/index.rst index 8cac2ec6..1d19a785 100644 --- a/architectures/dsp/index.rst +++ b/architectures/dsp/index.rst @@ -51,7 +51,7 @@ Adding a new DSP architecture to SOF This is not yet a guide for architecure porting, but in general are two ways to add support for new DSP architectures to SOF. -#. Write a new Hardware Astraction Layer (HAL) for your DSP. +#. Write a new Hardware Abstraction Layer (HAL) for your DSP. #. Use an existing RTOS that supports your DSP architecture as a HAL for SOF. From 5a780241fe11484c70d3ec2ac3505696ad8f120f Mon Sep 17 00:00:00 2001 From: Deb Date: Fri, 2 Apr 2021 05:40:49 -0400 Subject: [PATCH 089/290] Update release page to reflect 1.7 Signed-off-by: Deb --- release.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release.rst b/release.rst index 2e5a8d64..6318e41e 100755 --- a/release.rst +++ b/release.rst @@ -26,7 +26,7 @@ kernel, and documentation. Download the source code as a zip or tar.gz file: Source and Binary Releases -------------------------- -The latest SOF release is v1.6.1 (January 2021). +The latest SOF release is v1.7 (April 2021). View new feature information and release downloads for the latest and previous releases on GitHub. Firmware and SDK tool source code and binary From 8fc8b493945453c7511ea48a5af9c63d2b972096 Mon Sep 17 00:00:00 2001 From: Ranjani Sridharan Date: Thu, 22 Apr 2021 11:25:10 -0700 Subject: [PATCH 090/290] components: update the device state machine diagram Update the component device state machine diagram to remove the transitions during the XRUN trigger. Signed-off-by: Ranjani Sridharan --- .../firmware/components/images/comp-dev-states.pu | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/developer_guides/firmware/components/images/comp-dev-states.pu b/developer_guides/firmware/components/images/comp-dev-states.pu index 7f9f4e3d..85d91941 100644 --- a/developer_guides/firmware/components/images/comp-dev-states.pu +++ b/developer_guides/firmware/components/images/comp-dev-states.pu @@ -7,8 +7,8 @@ COMP_STATE_READY ---> COMP_STATE_PREPARE : COMP_TRIGGER_PREPARE COMP_STATE_PREPARE --> COMP_STATE_ACTIVE : COMP_TRIGGER_START -COMP_STATE_ACTIVE --> COMP_STATE_PREPARE : COMP_TRIGGER_STOP, COMP_TRIGGER_XRUN -COMP_STATE_PAUSED --> COMP_STATE_PREPARE : COMP_TRIGGER_STOP, COMP_TRIGGER_XRUN +COMP_STATE_ACTIVE --> COMP_STATE_PREPARE : COMP_TRIGGER_STOP +COMP_STATE_PAUSED --> COMP_STATE_PREPARE : COMP_TRIGGER_STOP COMP_STATE_ACTIVE -> COMP_STATE_PAUSED : COMP_TRIGGER_PAUSE From 400a91e71f52bf2da4ff644b4cb2ba16685c7110 Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Wed, 19 May 2021 11:54:45 +0300 Subject: [PATCH 091/290] build-guide: Switch to gcc10.2-gdb9 for crosstool-ng and xtensa-overlay config-*-gcc8.1-gdb8.1 no longer builds for various reasons for different platforms, switch to gcc10.2-gdb9 configs. Signed-off-by: Peter Ujfalusi --- .../build-guide/build-from-scratch.rst | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/getting_started/build-guide/build-from-scratch.rst b/getting_started/build-guide/build-from-scratch.rst index f62ac591..898b5c6f 100644 --- a/getting_started/build-guide/build-from-scratch.rst +++ b/getting_started/build-guide/build-from-scratch.rst @@ -159,7 +159,7 @@ platforms. crosstool-ng ------------ -Clone both repos and check out the ``sof-gcc8.1`` branch. +Clone both repos and check out the ``sof-gcc10.2`` and ``sof-gcc10x`` branch. .. code-block:: bash @@ -167,9 +167,9 @@ Clone both repos and check out the ``sof-gcc8.1`` branch. git clone https://github.com/thesofproject/xtensa-overlay git clone https://github.com/thesofproject/crosstool-ng cd xtensa-overlay - git checkout sof-gcc8.1 + git checkout sof-gcc10.2 cd ../crosstool-ng - git checkout sof-gcc8.1 + git checkout sof-gcc10x Build crosstool-ng and install it in its own source directory. @@ -192,34 +192,34 @@ download gcc components. .. code-block:: bash # Baytrail/Cherrytrail - cp config-byt-gcc8.1-gdb8.1 .config + cp config-byt-gcc10.2-gdb9 .config ./ct-ng build # Haswell/Broadwell - cp config-hsw-gcc8.1-gdb8.1 .config + cp config-hsw-gcc10.2-gdb9 .config ./ct-ng build # Apollo Lake - cp config-apl-gcc8.1-gdb8.1 .config + cp config-apl-gcc10.2-gdb9 .config ./ct-ng build # Cannon Lake, Ice Lake and Jasper Lake - cp config-cnl-gcc8.1-gdb8.1 .config + cp config-cnl-gcc10.2-gdb9 .config ./ct-ng build # i.MX8/i.MX8X - cp config-imx-gcc8.1-gdb8.1 .config + cp config-imx-gcc10.2-gdb9 .config ./ct-ng build # i.MX8M - cp config-imx8m-gcc8.1-gdb8.1 .config + cp config-imx8m-gcc10.2-gdb9 .config ./ct-ng build ``./ct-ng`` is a Linux kernel style Makefile; so the sample commands below -can be used to fix some out of date ``config-*-gcc8.1-gdb8.1`` file or find +can be used to fix some out of date ``config-*-gcc10.2-gdb9`` file or find default values missing from it: .. code-block:: bash ./ct-ng help - cp config-apl-gcc8.1-gdb8.1 .config + cp config-apl-gcc10.2-gdb9 .config ./ct-ng oldconfig V=1 - diff -u config-apl-gcc8.1-gdb8.1 .config + diff -u config-apl-gcc10.2-gdb9 .config "Install" toolchains by copying them to ``$SOF_WORKSPACE``. From a3a7f8f2a02ec9c0846eff056c91f6fc85420fff Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Wed, 19 May 2021 11:57:01 +0300 Subject: [PATCH 092/290] build-guide: Update supported platform list as of May, 2021 Sync up the supported platform names based on the output of ./scripts/xtensa-build-all.sh Signed-off-by: Peter Ujfalusi --- getting_started/build-guide/build-from-scratch.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/getting_started/build-guide/build-from-scratch.rst b/getting_started/build-guide/build-from-scratch.rst index 898b5c6f..bf777324 100644 --- a/getting_started/build-guide/build-from-scratch.rst +++ b/getting_started/build-guide/build-from-scratch.rst @@ -335,9 +335,9 @@ Build the firmware for all platforms. This script will only work if the PATH includes both the cross-compiler and ``xtensa-root`` and if they are siblings in the same ``sof`` directory. -As of April 2020, you may specify one or more of the following platform -arguments: ``byt``, ``cht``, ``hsw``, ``bdw``, ``apl``, ``cnl``, -``sue``, ``icl``, ``jsl``, ``imx8``, ``imx8x``, ``imx8m``. Example: +As of May 2021, you may specify one or more of the following platform +arguments: ``byt``, ``cht``, ``bdw``, ``hsw``, ``apl``, ``skl``, ``kbl``, ``cnl``, +``sue``, ``icl``, ``jsl``, ``tgl``, ``tgl-h``, ``imx8``, ``imx8x``, ``imx8m``. Example: .. code-block:: bash From 2ee472230075098a3bdfe22b0b15b6976f6999ad Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Wed, 19 May 2021 11:58:36 +0300 Subject: [PATCH 093/290] build-guide: Add information about Tiger Lake Extend the build guide to cover Tiger Lake as well. Signed-off-by: Peter Ujfalusi --- .../build-guide/build-from-scratch.rst | 28 +++++++++++++++---- substitutions.txt | 1 + 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/getting_started/build-guide/build-from-scratch.rst b/getting_started/build-guide/build-from-scratch.rst index bf777324..ef0c231d 100644 --- a/getting_started/build-guide/build-from-scratch.rst +++ b/getting_started/build-guide/build-from-scratch.rst @@ -8,7 +8,7 @@ Build SOF from scratch :depth: 3 You may boot and test |SOF| on a target machine or VM. Current target -Intel platforms include: |BYT|, |CHT|, |HSW|, |BDW|, |APL|, |CNL|, |ICL| and |JSL|. +Intel platforms include: |BYT|, |CHT|, |HSW|, |BDW|, |APL|, |CNL|, |ICL|, |JSL| and |TGL|. Support also exists for NXP i.MX8/i.MX8X/i.MX8M platforms. @@ -153,7 +153,7 @@ Step 2 Build toolchains from source =================================== Build the xtensa cross-compilation toolchains with crosstool-ng for Intel |BYT|, -|CHT|, |HSW|, |BDW|, |APL|, |CNL|, |ICL|, |JSL| platforms and NXP i.MX8/i.MX8X/i.MX8M +|CHT|, |HSW|, |BDW|, |APL|, |CNL|, |ICL|, |JSL|, |TGL| platforms and NXP i.MX8/i.MX8X/i.MX8M platforms. crosstool-ng @@ -200,7 +200,7 @@ download gcc components. # Apollo Lake cp config-apl-gcc10.2-gdb9 .config ./ct-ng build - # Cannon Lake, Ice Lake and Jasper Lake + # Cannon Lake, Ice Lake, Jasper Lake and Tiger Lake cp config-cnl-gcc10.2-gdb9 .config ./ct-ng build # i.MX8/i.MX8X @@ -235,7 +235,7 @@ default values missing from it: |BYT| and |CHT| share the same toolchain: xtensa-byt-elf - |CNL|, |ICL| and |JSL| share the same toolchain: xtensa-cnl-elf + |CNL|, |ICL|, |JSL| and |TGL| share the same toolchain: xtensa-cnl-elf i.MX8 and i.MX8X share the same toolchain: xtensa-imx-elf @@ -283,7 +283,7 @@ Build and install for each platform. make make install rm -fr rm etc/config.cache - # Cannon Lake, Ice Lake and Jasper Lake + # Cannon Lake, Ice Lake, Jasper Lake and Tiger Lake ./configure --target=xtensa-cnl-elf --prefix="${XTENSA_ROOT}" make make install @@ -457,6 +457,24 @@ for |JSL|: make jasperlake_defconfig make bin -j4 +for |TGL|: + +.. code-block:: bash + + mkdir build_tgl && cd build_tgl + cmake -DTOOLCHAIN=xtensa-cnl-elf -DROOT_DIR="$XTENSA_ROOT"/xtensa-cnl-elf .. + make tgplp_defconfig + make bin -j4 + +for |TGL| H: + +.. code-block:: bash + + mkdir build_tgl-h && cd build_tgl-h + cmake -DTOOLCHAIN=xtensa-cnl-elf -DROOT_DIR="$XTENSA_ROOT"/xtensa-cnl-elf .. + make tgph_defconfig + make bin -j4 + for i.MX8: .. code-block:: bash diff --git a/substitutions.txt b/substitutions.txt index f382c610..8912770a 100644 --- a/substitutions.txt +++ b/substitutions.txt @@ -11,6 +11,7 @@ .. |CNL| replace:: Cannon Lake .. |ICL| replace:: Ice Lake .. |JSL| replace:: Jasper Lake +.. |TGL| replace:: Tiger Lake .. |TSC| replace:: Technical Steering Committee .. These are replacement strings for non-ASCII characters used within the project From 84c5ca5fa824f0df610cd3fe6404d4dca8634daa Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Wed, 19 May 2021 09:33:37 +0300 Subject: [PATCH 094/290] conf.py: Add support for sphinx 4.0+ add_stylesheet is removed with sphinx 4.0 and this will cause error in conf.py Fix it by trying to use the new add_css_file introduced in 1.8 and fall back to add_stylesheet for older sphinx version. Signed-off-by: Peter Ujfalusi --- conf.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/conf.py b/conf.py index 9f975954..b41577f5 100644 --- a/conf.py +++ b/conf.py @@ -185,7 +185,10 @@ def setup(app): # add_stylesheet() was renamed to add_css_file() in sphinx 1.8 released # in September 2018. add_stylesheet() will be removed in sphinx 4.0 - app.add_stylesheet("sof-custom.css") + try: + app.add_css_file('sof-custom.css') + except AttributeError: + app.add_stylesheet('sof-custom.css') # Custom sidebar templates, must be a dictionary that maps document names # to template names. From ad956e1bc196cd95e9c3c3fae1c532062b62053b Mon Sep 17 00:00:00 2001 From: Marc Herbert Date: Fri, 28 May 2021 20:11:38 +0000 Subject: [PATCH 095/290] zephyr: simplify instructions thanks to new xtensa-build-zephyr.sh rimage is downloaded automatically. logtool.py is (slowly) being replaced. Signed-off-by: Marc Herbert --- .../build-guide/build-with-zephyr.rst | 31 +++++-------------- 1 file changed, 8 insertions(+), 23 deletions(-) diff --git a/getting_started/build-guide/build-with-zephyr.rst b/getting_started/build-guide/build-with-zephyr.rst index aee0ce7a..58ef9859 100755 --- a/getting_started/build-guide/build-with-zephyr.rst +++ b/getting_started/build-guide/build-with-zephyr.rst @@ -44,33 +44,18 @@ Check out and build mkdir $ZEPHYR_WORKSPACE cd $ZEPHYR_WORKSPACE west init - west update - -#. Download **rimage** if you haven't already done so: - - .. code-block:: bash - - git clone --recurse-submodules https://github.com/thesofproject/rimage.git - - If you need to install a rimage executable on your system, use this - repository to build and optionally install one: - - .. code-block:: bash - - mkdir rimage/build - cd rimage/build - cmake .. - make - cd - - - You also need it for platform-specific configuration. + # Significantly smaller and faster than a full "west update" + west update hal_xtensa sof #. Build and sign a firmware image: .. code-block:: bash - west build -d build-apl -b intel_adsp_cavs15 -p zephyr/samples/audio/sof/ - west sign -d build-apl -p rimage/build/rimage -t rimage -D rimage/config -- -k nmodules/audio/sof/keys/otc_private_key.pem + cd $ZEPHYR_WORKSPACE + ./modules/audio/sof/scripts/xtensa-build-zephyr.sh # shows usage + ./modules/audio/sof/scripts/xtensa-build-zephyr.sh $your_platform + ls build-*/zephyr/zephyr.* + => build-*/zephyr/zephyr.ri ... Run *** @@ -103,7 +88,7 @@ After the above instructions are completed, a firmware image is located at ``sof-audio-pci 0000:00:0e.0: Firmware info: used compiler GCC 9:2:0 zephyr used optimization flags -Os`` For firmware log extraction, use -``zephyr/boards/xtensa/intel_adsp_cavs15/tools/logtool.py``. +``zephyr/boards/xtensa/intel_adsp_cavs15/tools/README.md``. You might also need to build and update your system audio topology file. For details see :ref:`build-from-scratch`. From a31ee37bae5f2d7aa2d6c1546220aba7de4c94ed Mon Sep 17 00:00:00 2001 From: Marc Herbert Date: Fri, 28 May 2021 21:17:06 +0000 Subject: [PATCH 096/290] Toolchains and getting started guide: remove duplication, other fixes Fix the CMake example, it has been broken since defconfig change https://github.com/thesofproject/sof/pull/3821 Fix the default target when building tools. Replace a lot of the massive copy/paste with "for platform" loops. Move PATH changes to newlib section and explain that they don't need to be permanent. Signed-off-by: Marc Herbert --- .../build-guide/build-from-scratch.rst | 213 +++++------------- 1 file changed, 52 insertions(+), 161 deletions(-) diff --git a/getting_started/build-guide/build-from-scratch.rst b/getting_started/build-guide/build-from-scratch.rst index ef0c231d..b1f56994 100644 --- a/getting_started/build-guide/build-from-scratch.rst +++ b/getting_started/build-guide/build-from-scratch.rst @@ -152,9 +152,13 @@ Create or append to the ``LD_LIBRARY_PATH`` environment variable. Step 2 Build toolchains from source =================================== -Build the xtensa cross-compilation toolchains with crosstool-ng for Intel |BYT|, -|CHT|, |HSW|, |BDW|, |APL|, |CNL|, |ICL|, |JSL|, |TGL| platforms and NXP i.MX8/i.MX8X/i.MX8M -platforms. +Build the xtensa cross-compilation toolchains with crosstool-ng for +Intel |BYT|, |CHT|, |HSW|, |BDW|, |APL|, |CNL|, |ICL|, |JSL|, |TGL| +platforms and NXP i.MX8/i.MX8X/i.MX8M platforms. Building the toolchains +may take about an hour but only once and it removes the dependency on +the Docker image. + +For more details go to https://crosstool-ng.github.io/ crosstool-ng ------------ @@ -184,7 +188,7 @@ Toolchains ---------- The config files provided refer to ``../xtensa-overlay/`` and point at -different ``./build/xtensa-*-elf`` subdirectories. Copy the ones you +different ``./builds/xtensa-*-elf`` subdirectories. Copy the ones you want to ``.config`` and build the cross-compiler(s) for your target platform(s). ``./ct-ng build`` requires an network connection to download gcc components. @@ -221,13 +225,26 @@ default values missing from it: ./ct-ng oldconfig V=1 diff -u config-apl-gcc10.2-gdb9 .config -"Install" toolchains by copying them to ``$SOF_WORKSPACE``. +While other steps take minutes at most, building all toolchains may last +about an hour depending on the performance of your system. Run this loop +to build all toolchains without interruption: + +.. code-block:: bash + + time for i in config*gcc10.2-gdb9; do + cp "$i" .config && ../ct-install/bin/ct-ng build || break ; + done + + +"Install" toolchains in the expected location by linking +from ``$SOF_WORKSPACE`` to them: .. code-block:: bash ls builds/ # xtensa-apl-elf xtensa-byt-elf xtensa-cnl-elf xtensa-hsw-elf xtensa-imx-elf xtensa-imx8m-elf - cp -r builds/* "$SOF_WORKSPACE" + cd "$SOF_WORKSPACE" + for i in crosstool-ng/builds/xtensa-*; do ln -s "$i"; done .. note:: @@ -239,16 +256,6 @@ default values missing from it: i.MX8 and i.MX8X share the same toolchain: xtensa-imx-elf -Add your toolchains to your PATH variable. - -.. code-block:: bash - - PATH="${SOF_WORKSPACE}"/xtensa-byt-elf/bin/:$PATH - PATH="${SOF_WORKSPACE}"/xtensa-hsw-elf/bin/:$PATH - PATH="${SOF_WORKSPACE}"/xtensa-apl-elf/bin/:$PATH - PATH="${SOF_WORKSPACE}"/xtensa-cnl-elf/bin/:$PATH - PATH="${SOF_WORKSPACE}"/xtensa-imx-elf/bin/:$PATH - PATH="${SOF_WORKSPACE}"/xtensa-imx8m-elf/bin/:$PATH Additional headers ------------------ @@ -263,40 +270,29 @@ switch to the `xtensa` branch. cd newlib-xtensa git checkout -b xtensa origin/xtensa -Build and install for each platform. +Temporarily add toolchains to your PATH variable. This is *not* required +when using high-level scripts described below, only this time here or +when invoking CMake manually. In other words you don't need to adjust +your PATH permanently; no risk to interfere with non-SOF tasks. + +.. code-block:: bash + + for i in "${SOF_WORKSPACE}"/xtensa-*-elf; do PATH="$PATH:$i"/bin; done + +Build and install the newlib headers for each toolchain: .. code-block:: bash XTENSA_ROOT="${SOF_WORKSPACE}"/xtensa-root - # Baytrail/Cherrytrail - ./configure --target=xtensa-byt-elf --prefix="${XTENSA_ROOT}" - make - make install - rm -fr rm etc/config.cache - # Haswell/Broadwell - ./configure --target=xtensa-hsw-elf --prefix="${XTENSA_ROOT}" - make - make install - rm -fr rm etc/config.cache - # Apollo Lake - ./configure --target=xtensa-apl-elf --prefix="${XTENSA_ROOT}" - make - make install - rm -fr rm etc/config.cache - # Cannon Lake, Ice Lake, Jasper Lake and Tiger Lake - ./configure --target=xtensa-cnl-elf --prefix="${XTENSA_ROOT}" - make - make install - rm -fr rm etc/config.cache - # i.MX8/i.MX8X - ./configure --target=xtensa-imx-elf --prefix="${XTENSA_ROOT}" - make - make install - rm -fr rm etc/config.cache - # i.MX8M - ./configure --target=xtensa-imx8m-elf --prefix="${XTENSA_ROOT}" - make - make install + time for toolchain in ../xtensa-*-elf; do + ./configure --target="${toolchain#../}" --prefix="$XTENSA_ROOT" && + make && make install || break; + rm etc/config.cache + done + ls "$XTENSA_ROOT" + => share xtensa-apl-elf xtensa-byt-elf xtensa-cnl-elf xtensa-hsw-elf ... + +This should take a few minutes. .. note:: @@ -332,8 +328,8 @@ Build the firmware for all platforms. .. note:: - This script will only work if the PATH includes both the cross-compiler and - ``xtensa-root`` and if they are siblings in the same ``sof`` directory. + This script works only if the cross-compiler and ``xtensa-root`` are + siblings in the same ``sof`` directory, as instructed above. As of May 2021, you may specify one or more of the following platform arguments: ``byt``, ``cht``, ``bdw``, ``hsw``, ``apl``, ``skl``, ``kbl``, ``cnl``, @@ -389,122 +385,18 @@ for |BYT|: .. code-block:: bash mkdir build_byt && cd build_byt - cmake -DTOOLCHAIN=xtensa-byt-elf -DROOT_DIR="$XTENSA_ROOT"/xtensa-byt-elf .. + cmake -DTOOLCHAIN=xtensa-byt-elf -DROOT_DIR="$XTENSA_ROOT"/xtensa-byt-elf -DINIT_CONFIG=baytrail_defconfig .. make help # lists all available targets - make baytrail_defconfig make bin -j4 VERBOSE=1 -for |CHT|: - -.. code-block:: bash +You can replace ``byt`` above with any other platform listed in the help +output of the ``sof/scripts/xtensa-build-all.sh``. Find the toolchain +matching each platform in the same script or above. - mkdir build_cht && cd build_cht - cmake -DTOOLCHAIN=xtensa-byt-elf -DROOT_DIR="$XTENSA_ROOT"/xtensa-byt-elf .. - make cherrytrail_defconfig - make bin -j4 - -for |HSW|: - -.. code-block:: bash - - mkdir build_hsw && cd build_hsw - cmake -DTOOLCHAIN=xtensa-hsw-elf -DROOT_DIR="$XTENSA_ROOT"/xtensa-hsw-elf .. - make haswell_defconfig - make bin -j4 - -for |BDW|: - -.. code-block:: bash - - mkdir build_bdw && cd build_bdw - cmake -DTOOLCHAIN=xtensa-hsw-elf -DROOT_DIR="$XTENSA_ROOT"/xtensa-hsw-elf .. - make broadwell_defconfig - make bin -j4 - -for |APL|: - -.. code-block:: bash - - mkdir build_apl && cd build_apl - cmake -DTOOLCHAIN=xtensa-apl-elf -DROOT_DIR="$XTENSA_ROOT"/xtensa-apl-elf .. - make apollolake_defconfig - make bin -j4 - -for |CNL|: - -.. code-block:: bash - - mkdir build_cnl && cd build_cnl - cmake -DTOOLCHAIN=xtensa-cnl-elf -DROOT_DIR="$XTENSA_ROOT"/xtensa-cnl-elf .. - make cannonlake_defconfig - make bin -j4 - -for |ICL|: - -.. code-block:: bash - - mkdir build_icl && cd build_icl - cmake -DTOOLCHAIN=xtensa-cnl-elf -DROOT_DIR="$XTENSA_ROOT"/xtensa-cnl-elf .. - make icelake_defconfig - make bin -j4 - -for |JSL|: - -.. code-block:: bash - - mkdir build_jsl && cd build_jsl - cmake -DTOOLCHAIN=xtensa-cnl-elf -DROOT_DIR="$XTENSA_ROOT"/xtensa-cnl-elf .. - make jasperlake_defconfig - make bin -j4 - -for |TGL|: - -.. code-block:: bash - - mkdir build_tgl && cd build_tgl - cmake -DTOOLCHAIN=xtensa-cnl-elf -DROOT_DIR="$XTENSA_ROOT"/xtensa-cnl-elf .. - make tgplp_defconfig - make bin -j4 - -for |TGL| H: - -.. code-block:: bash - - mkdir build_tgl-h && cd build_tgl-h - cmake -DTOOLCHAIN=xtensa-cnl-elf -DROOT_DIR="$XTENSA_ROOT"/xtensa-cnl-elf .. - make tgph_defconfig - make bin -j4 - -for i.MX8: - -.. code-block:: bash - - mkdir build_imx8 && cd build_imx8 - cmake -DTOOLCHAIN=xtensa-imx-elf -DROOT_DIR="$XTENSA_ROOT"/xtensa-imx-elf .. - make imx8_defconfig - make bin -j4 - -for i.MX8X: - -.. code-block:: bash - - mkdir build_imx8x && cd build_imx8x - cmake -DTOOLCHAIN=xtensa-imx-elf -DROOT_DIR="$XTENSA_ROOT"/xtensa-imx-elf .. - make imx8x_defconfig - make bin -j4 - -for i.MX8M: - -.. code-block:: bash - - mkdir build_imx8m && cd build_imx8m - cmake -DTOOLCHAIN=xtensa-imx8m-elf -DROOT_DIR="$XTENSA_ROOT"/xtensa-imx8m-elf .. - make imx8m_defconfig - make bin -j4 .. note:: - After the 'make \*_defconfig' step, you can customize your build with + After the cmake step, you can customize your build with 'make menuconfig'. DEBUG and ROM options are available for the FW binary build. Enable them @@ -513,8 +405,7 @@ for i.MX8M: .. code-block:: bash mkdir build_cnl_custom && cd build_cnl_custom - cmake -DTOOLCHAIN=xtensa-cnl-elf -DROOT_DIR="$XTENSA_ROOT"/xtensa-cnl-elf .. - make cannonlake_defconfig + cmake -DTOOLCHAIN=xtensa-cnl-elf -DROOT_DIR="$XTENSA_ROOT"/xtensa-cnl-elf -DINIT_CONFIG=cannonlake_defconfig .. make menuconfig # select/deselect options and save make bin -j4 @@ -542,8 +433,8 @@ Step 4 Build topology and tools One-step rebuild from scratch ----------------------------- -Without any argument :git-sof-mainline:`scripts/build-tools.sh` rebuilds -only the minimum subset of :git-sof-mainline:`tools/`. +Without any argument :git-sof-mainline:`scripts/build-tools.sh` builds +the default CMake target "ALL" of :git-sof-mainline:`tools/`. .. code-block:: bash From ba6378bff1742ceec7287a60e28455b51a71ab9e Mon Sep 17 00:00:00 2001 From: Marc Herbert Date: Fri, 28 May 2021 21:15:36 +0000 Subject: [PATCH 097/290] Add installer to getting started guide It's been one release since https://github.com/thesofproject/sof/pull/3845 was merged. Signed-off-by: Marc Herbert --- .../build-guide/build-from-scratch.rst | 55 ++++++++++++++----- 1 file changed, 41 insertions(+), 14 deletions(-) diff --git a/getting_started/build-guide/build-from-scratch.rst b/getting_started/build-guide/build-from-scratch.rst index b1f56994..8823fe6a 100644 --- a/getting_started/build-guide/build-from-scratch.rst +++ b/getting_started/build-guide/build-from-scratch.rst @@ -302,8 +302,8 @@ This should take a few minutes. The required headers are now in ``"$SOF_WORKSPACE"/xtensa-root``, and cross-compilation toolchains for xtensa DSPs are set up. -Step 3 Build firmware binaries -============================== +Step 3 Build and sign firmware binaries +======================================= After the SOF environment is set up, clone the *sof* repo. @@ -312,14 +312,35 @@ After the SOF environment is set up, clone the *sof* repo. cd "$SOF_WORKSPACE" git clone https://github.com/thesofproject/sof -One-step rebuild from scratch ------------------------------ -To rebuild |SOF| in just one step, use -:git-sof-mainline:`scripts/xtensa-build-all.sh` after setting up the -environment. +Copy the commented ``installer/sample-config.mk`` to +``installer/config.mk``, then select a list of platforms and provide an +optional target hostname in the latter file. Then run: + +.. code-block:: bash + + make -C installer/ -Build the firmware for all platforms. +This builds multiple platforms in parallel and deploys firmware and +topologies to ``/lib/firmware/intel/`` on the local or remote +destination that you configured. It builds with the default platform +configurations the first time and then switches to incremental builds +which preserves any ``make menuconfig`` or other configuration changes +you made. These two ways to build are described below, so read on if you +need finer control on the build system and configuration. Otherwise you +can skip the next two sections. + +The installer also builds and deploys some user-space binaries from the +``sof/tools/`` subdirectory. + + +Re-configure and rebuild from scratch +------------------------------------- + +To rebuild |SOF| from scratch, the installer Makefile above relies on +the :git-sof-mainline:`scripts/xtensa-build-all.sh` script. If you need +finer control or to troubleshoot some build issue you can also use it +directly. To build the firmware for all platforms: .. code-block:: bash @@ -366,7 +387,8 @@ Incremental builds ------------------ This is a more detailed build guide for the *sof* repo. Unlike -``xtensa-build-all.sh``, this doesn't rebuild everything every time. +``xtensa-build-all.sh``, this doesn't rebuild everything every time. The +installer Makefile above relies on this for incremental builds. Snippets below assume that your current directory is the root of the ``sof`` clone (``"$SOF_WORKSPACE"/sof/``). @@ -420,7 +442,8 @@ Firmware build results ---------------------- The firmware binary files are located in build_/src/arch/xtensa/. -Copy them to your target machine's /lib/firmware/intel/sof folder. +The installer copies them to your target machine's ``/lib/firmware/intel/sof`` +folder. .. code-block:: bash @@ -430,6 +453,9 @@ Copy them to your target machine's /lib/firmware/intel/sof folder. Step 4 Build topology and tools =============================== +You can probably skip this section if you use the firmware installer in +the previous section. + One-step rebuild from scratch ----------------------------- @@ -466,11 +492,12 @@ If your ``cmake --version`` is 3.13 or higher, you may prefer the new -B option: Topology and tools build results -------------------------------- -The topology files are located in the *tools/build_tools/topology* folder. -Copy them to the target machine's /lib/firmware/intel/sof-tplg folder. +The topology files are located in the *tools/build_tools/topology* +folder. The installer Makefile copies them to the target machine's +``/lib/firmware/intel/sof-tplg/`` folder. -The *sof-logger* tool is in the *tools/build_tools/logger* folder. Copy it to -the target machine's /usr/bin directory. +The *sof-logger* tool is in the *tools/build_tools/logger* folder. The +installer Makefile copies them to the target directory of your choice. .. _Build Linux kernel: From 580bd58143503f500b743994b0aa3a962d151f20 Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Mon, 31 May 2021 15:04:11 +0300 Subject: [PATCH 098/290] debugability: logger: Add note for etrace and trace debugfs files Add a note section with brief information about the etrace and trace debugfs files. Signed-off-by: Peter Ujfalusi --- developer_guides/debugability/logger/index.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/developer_guides/debugability/logger/index.rst b/developer_guides/debugability/logger/index.rst index aadd2608..692fd104 100644 --- a/developer_guides/debugability/logger/index.rst +++ b/developer_guides/debugability/logger/index.rst @@ -128,6 +128,14 @@ Examples sof-logger -l ldc_file -d +.. note:: + debugfs files used by ``sof-logger`` + + - ``etrace``: direct access to the shared TRACE window of the SOF firmware + - ``trace``: using DMA to stream debug trace information from SOF firmware (on + distribution kernels ``sof_debug=1`` module option for ``snd_sof`` might be + needed if the /sys/kernel/debug/sof/trace file is not present) + Trace filtering *************** From 8ccec2e9fa8905cc2e476642b4d887562b0e2895 Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Mon, 31 May 2021 15:06:00 +0300 Subject: [PATCH 099/290] intel_debug: Add link to dynamic debug documentation of the Linux kernel To avoid confusion, add link to the kernel documentation about the dynamic debug feature used by the Linux kernel. Signed-off-by: Peter Ujfalusi --- getting_started/intel_debug/suggestions.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/getting_started/intel_debug/suggestions.rst b/getting_started/intel_debug/suggestions.rst index 7e74a1c2..1b163674 100644 --- a/getting_started/intel_debug/suggestions.rst +++ b/getting_started/intel_debug/suggestions.rst @@ -117,6 +117,9 @@ file: Note that this list is only an example. +Dynamic debug is a Linux kernel feature. For detailed information, see the +official `kernel documentation `__. + Install sof-logger ****************** From 9d727405baafe0ff27394687cd9ab80c842ecccc Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Mon, 31 May 2021 15:07:52 +0300 Subject: [PATCH 100/290] intel_debug: Add instruction to enable the trace debugfs Distribution kernels ship with trace not enabled by default. Add instruction on how to enable the file in order to provide traces. Signed-off-by: Peter Ujfalusi --- getting_started/intel_debug/suggestions.rst | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/getting_started/intel_debug/suggestions.rst b/getting_started/intel_debug/suggestions.rst index 1b163674..9b9c9b3c 100644 --- a/getting_started/intel_debug/suggestions.rst +++ b/getting_started/intel_debug/suggestions.rst @@ -131,4 +131,12 @@ following command to extract DSP traces: .. code-block:: bash - sof-logger -t sof-tgl.ldc \ No newline at end of file + sof-logger -t -l sof-tgl.ldc + +Trace support might need to be enabled on distribution kernels in case the +``/sys/kernel/debug/sof/trace`` file is not present by adding sof_debug=1 option +to snd_sof module: + +.. code-block:: + + options snd_sof sof_debug=1 From 265e89305f5b80e96a5ffd34dc36f0960c87894e Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Fri, 18 Jun 2021 09:14:28 +0300 Subject: [PATCH 101/290] build-guide: Add instructions about ubuntu's build-essential metapackage Developers must have the build-essential installed. It is highly unlikely that a developer does not have it already, but for the sake of completeness add a note about it. Signed-off-by: Peter Ujfalusi --- getting_started/build-guide/build-from-scratch.rst | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/getting_started/build-guide/build-from-scratch.rst b/getting_started/build-guide/build-from-scratch.rst index 8823fe6a..948e8b56 100644 --- a/getting_started/build-guide/build-from-scratch.rst +++ b/getting_started/build-guide/build-from-scratch.rst @@ -41,8 +41,14 @@ Step 0 Set up the workspace directory Step 1 Set up build environment =============================== -Install packaged dependencies ------------------------------ +Install packaged dependencies (Ubuntu) +-------------------------------------- + +Make sure that ``build-essential`` is installed: + +.. code-block:: bash + + sudo apt-get install build-essential * For Ubuntu 18.10: From 2cec4136c529f7dc8b675a2bfa15dc70fc9141b7 Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Fri, 18 Jun 2021 08:57:58 +0300 Subject: [PATCH 102/290] build-guide: Correct ct-ng path for building all toolchains There is no mention in the documentation about "ct-install", the ct-ng is installed in previous steps to $(pwd). Fixes: a31ee37bae5f2 ("Toolchains and getting started guide: remove duplication, other fixes") Signed-off-by: Peter Ujfalusi --- getting_started/build-guide/build-from-scratch.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/getting_started/build-guide/build-from-scratch.rst b/getting_started/build-guide/build-from-scratch.rst index 948e8b56..9a9020d7 100644 --- a/getting_started/build-guide/build-from-scratch.rst +++ b/getting_started/build-guide/build-from-scratch.rst @@ -238,7 +238,7 @@ to build all toolchains without interruption: .. code-block:: bash time for i in config*gcc10.2-gdb9; do - cp "$i" .config && ../ct-install/bin/ct-ng build || break ; + cp "$i" .config && ./ct-ng build || break ; done From 15013ab054e2f629f41abf1834e3417a0095bdc8 Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Wed, 23 Jun 2021 12:37:23 +0300 Subject: [PATCH 103/290] build-guide: Add instruction on the possibility of missing packages We can not document every dependencies for all distributions, we already lagging behind with some newer Ubuntu variants. Add a generic note about this fact in the documentation for the users to be aware of. Signed-off-by: Peter Ujfalusi --- .../build-guide/build-from-scratch.rst | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/getting_started/build-guide/build-from-scratch.rst b/getting_started/build-guide/build-from-scratch.rst index 9a9020d7..7dafd444 100644 --- a/getting_started/build-guide/build-from-scratch.rst +++ b/getting_started/build-guide/build-from-scratch.rst @@ -41,14 +41,23 @@ Step 0 Set up the workspace directory Step 1 Set up build environment =============================== -Install packaged dependencies (Ubuntu) --------------------------------------- +Install packaged dependencies +----------------------------- +.. note:: + + This guide uses Ubuntu as an example but any modern distribution can be used + for SOF development. + +Due to the ever changing default packages in distributions there might be missing +tools, packages. The SOF documentation can not have explicit instructions for all +such cases. When encountered with missing dependencies, please consult with your +distribution's documentation on how to install them. -Make sure that ``build-essential`` is installed: +Make sure that ``build-essential`` and ``git`` is installed: .. code-block:: bash - sudo apt-get install build-essential + sudo apt-get install build-essential git * For Ubuntu 18.10: From aba21156f6af576b375e6ce8610ac5696ca068df Mon Sep 17 00:00:00 2001 From: Deb Date: Wed, 23 Jun 2021 13:32:46 -0400 Subject: [PATCH 104/290] Grammatical edits to installing packaged dependencies Signed-off-by: Deb --- getting_started/build-guide/build-from-scratch.rst | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) mode change 100644 => 100755 getting_started/build-guide/build-from-scratch.rst diff --git a/getting_started/build-guide/build-from-scratch.rst b/getting_started/build-guide/build-from-scratch.rst old mode 100644 new mode 100755 index 7dafd444..8e869c9d --- a/getting_started/build-guide/build-from-scratch.rst +++ b/getting_started/build-guide/build-from-scratch.rst @@ -45,15 +45,15 @@ Install packaged dependencies ----------------------------- .. note:: - This guide uses Ubuntu as an example but any modern distribution can be used - for SOF development. + This guide uses Ubuntu as an example but any modern distribution can be + used for SOF development. -Due to the ever changing default packages in distributions there might be missing -tools, packages. The SOF documentation can not have explicit instructions for all -such cases. When encountered with missing dependencies, please consult with your +Due to continuous default package updates in distributions, SOF +documentation may not include explicit instructions for possible missing +tools and packages. When you encounter missing dependencies, refer to your distribution's documentation on how to install them. -Make sure that ``build-essential`` and ``git`` is installed: +Make sure that ``build-essential`` and ``git`` are installed: .. code-block:: bash From 26fbbba29ea42d6d1789fe9191a4ea2ebf4c4e34 Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Thu, 24 Jun 2021 16:34:31 +0300 Subject: [PATCH 105/290] build-guide: Updates based on a clean Ubuntu 20.04 installation I have taken the time to install Ubuntu 20.04.2 to VBox. Based on that I would suggest the following clarifications and fixes to the build guide. Signed-off-by: Peter Ujfalusi --- .../build-guide/build-from-scratch.rst | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/getting_started/build-guide/build-from-scratch.rst b/getting_started/build-guide/build-from-scratch.rst index 8e869c9d..52f94e10 100755 --- a/getting_started/build-guide/build-from-scratch.rst +++ b/getting_started/build-guide/build-from-scratch.rst @@ -16,7 +16,7 @@ Build SOF ********* The following steps describe how to install the SOF development -environment on Ubuntu 16.04, 18.04, and 18.10. They should work on +environment on Ubuntu 16.04, 18.04, 20.04, and 18.10. They should work on 19.04, 19.10 and other Linux distributions with minor or no modifications. @@ -30,13 +30,16 @@ modifications. because some default configuration files refer to other clones using relative locations like ``../sof/``. + Make sure that ``$SOF_WORKSPACE`` have adequate disk space when building the + toolchain. About 15GB is going to be needed per toolchain. + Step 0 Set up the workspace directory ===================================== .. code-block:: bash SOF_WORKSPACE=~/work/sof - mkdir "$SOF_WORKSPACE" + mkdir -p "$SOF_WORKSPACE" Step 1 Set up build environment =============================== @@ -59,6 +62,13 @@ Make sure that ``build-essential`` and ``git`` are installed: sudo apt-get install build-essential git +* For Ubuntu 20.04: + + .. code-block:: bash + + sudo apt install autoconf flex bison texinfo help2man gawk libtool-bin \ + libncurses5 libncurses5-dev libssl-dev libgtk-3-dev tree ninja + * For Ubuntu 18.10: .. code-block:: bash @@ -261,6 +271,12 @@ from ``$SOF_WORKSPACE`` to them: cd "$SOF_WORKSPACE" for i in crosstool-ng/builds/xtensa-*; do ln -s "$i"; done +Remove the temporarily build files (~7GB per toolchain) + +.. code-block:: bash + + rm -rf .build + .. note:: |HSW| and |BDW| share the same toolchain: xtensa-hsw-elf @@ -326,6 +342,7 @@ After the SOF environment is set up, clone the *sof* repo. cd "$SOF_WORKSPACE" git clone https://github.com/thesofproject/sof + cd sof Copy the commented ``installer/sample-config.mk`` to From c4f0b1a067d4ea9311480c1946bf56073cc046bd Mon Sep 17 00:00:00 2001 From: Deb Date: Mon, 28 Jun 2021 08:10:38 -0400 Subject: [PATCH 106/290] Grammatical edits to build from scratch; small conf.py edit Signed-off-by: Deb --- conf.py | 2 +- .../build-guide/build-from-scratch.rst | 49 ++++++++++--------- 2 files changed, 26 insertions(+), 25 deletions(-) mode change 100644 => 100755 conf.py diff --git a/conf.py b/conf.py old mode 100644 new mode 100755 index b41577f5..baa67501 --- a/conf.py +++ b/conf.py @@ -63,7 +63,7 @@ # General information about the project. project = u'SOF Project' -copyright = u'2021, SOF Project.' +copyright = u'2021, SOF Project' author = u'SOF Project developers' # The version info for the project you're documenting, acts as replacement for diff --git a/getting_started/build-guide/build-from-scratch.rst b/getting_started/build-guide/build-from-scratch.rst index 52f94e10..30dd538c 100755 --- a/getting_started/build-guide/build-from-scratch.rst +++ b/getting_started/build-guide/build-from-scratch.rst @@ -8,7 +8,7 @@ Build SOF from scratch :depth: 3 You may boot and test |SOF| on a target machine or VM. Current target -Intel platforms include: |BYT|, |CHT|, |HSW|, |BDW|, |APL|, |CNL|, |ICL|, |JSL| and |TGL|. +Intel platforms include: |BYT|, |CHT|, |HSW|, |BDW|, |APL|, |CNL|, |ICL|, |JSL|, and |TGL|. Support also exists for NXP i.MX8/i.MX8X/i.MX8M platforms. @@ -16,22 +16,22 @@ Build SOF ********* The following steps describe how to install the SOF development -environment on Ubuntu 16.04, 18.04, 20.04, and 18.10. They should work on +environment on Ubuntu 16.04, 18.04, 18.10, and 20.04. They should work on 19.04, 19.10 and other Linux distributions with minor or no modifications. .. note:: - ``$SOF_WORKSPACE`` environment variable should point to the directory you - wish to store all sof work in. + Point the ``$SOF_WORKSPACE`` environment variable to the directory in + which you store all sof work. - The code examples assume ``$SOF_WORKSPACE`` as the top-level working - directory. Clone all git repositories at the same directory level + The code examples assume ``$SOF_WORKSPACE`` is the top-level working + directory. Clone all git repositories at the same directory level because some default configuration files refer to other clones using relative locations like ``../sof/``. - Make sure that ``$SOF_WORKSPACE`` have adequate disk space when building the - toolchain. About 15GB is going to be needed per toolchain. + Make sure that ``$SOF_WORKSPACE`` has adequate disk space when building + the toolchain. About 15GB is needed per toolchain. Step 0 Set up the workspace directory ===================================== @@ -67,7 +67,7 @@ Make sure that ``build-essential`` and ``git`` are installed: .. code-block:: bash sudo apt install autoconf flex bison texinfo help2man gawk libtool-bin \ - libncurses5 libncurses5-dev libssl-dev libgtk-3-dev tree ninja + libncurses5 libncurses5-dev libssl-dev libgtk-3-dev tree ninja * For Ubuntu 18.10: @@ -109,7 +109,7 @@ If you use Ubuntu 18.04+ you can install CMake with apt: sudo apt-get install cmake For Ubuntu 16.04, CMake from apt is outdated and you must install CMake from -sources. Refer to this short guide: https://cmake.org/install/ +sources. Refer to this short guide: https://cmake.org/install/. Build alsa-lib and alsa-utils ----------------------------- @@ -215,7 +215,7 @@ Toolchains The config files provided refer to ``../xtensa-overlay/`` and point at different ``./builds/xtensa-*-elf`` subdirectories. Copy the ones you want to ``.config`` and build the cross-compiler(s) for your target -platform(s). ``./ct-ng build`` requires an network connection to +platform(s). Note that ``./ct-ng build`` requires an network connection to download gcc components. .. code-block:: bash @@ -271,7 +271,7 @@ from ``$SOF_WORKSPACE`` to them: cd "$SOF_WORKSPACE" for i in crosstool-ng/builds/xtensa-*; do ln -s "$i"; done -Remove the temporarily build files (~7GB per toolchain) +Remove the temporary build files (~7GB per toolchain): .. code-block:: bash @@ -302,9 +302,9 @@ switch to the `xtensa` branch. git checkout -b xtensa origin/xtensa Temporarily add toolchains to your PATH variable. This is *not* required -when using high-level scripts described below, only this time here or -when invoking CMake manually. In other words you don't need to adjust -your PATH permanently; no risk to interfere with non-SOF tasks. +when using high-level scripts described below; it's only required here or +when invoking CMake manually. In other words, you don't need to adjust your +PATH permanently because no risk of interfere with non-SOF tasks exists. .. code-block:: bash @@ -327,16 +327,16 @@ This should take a few minutes. .. note:: - ``--prefix=`` expects an absolute path. Define XTENSA_ROOT according to your - environment. + ``--prefix=`` expects an absolute path. Define XTENSA_ROOT according to + your environment. -The required headers are now in ``"$SOF_WORKSPACE"/xtensa-root``, and cross-compilation -toolchains for xtensa DSPs are set up. +The required headers are now in ``"$SOF_WORKSPACE"/xtensa-root``, and +cross-compilation toolchains for xtensa DSPs are set up. Step 3 Build and sign firmware binaries ======================================= -After the SOF environment is set up, clone the *sof* repo. +After the SOF environment is set up, clone the *sof* repo: .. code-block:: bash @@ -404,10 +404,11 @@ builds with -r and speed up the build with -j [n] ./scripts/xtensa-build-all.sh -d -r -j 4 apl .. note:: - xtensa-build-all.sh script uses ``rimage`` to build the final firmware image. - ``rimage`` uses by default a public key included in sof repo for signing. - However, if you need to use some other external key for signing you can - specify the path to your key as environment variable before invoking the build: + The ``xtensa-build-all.sh`` script uses ``rimage`` to build the final + firmware image. ``rimage`` uses by default a public key included in the + sof repo for signing. However, if you need to use some other external key + for signing you can specify the path to your key as environment variable + before invoking the build: .. code-block:: bash From cc3418f6520249c7a7e3537ae0c341e717b0a945 Mon Sep 17 00:00:00 2001 From: Daniel Baluta Date: Mon, 5 Jul 2021 18:22:47 +0300 Subject: [PATCH 107/290] getting-started: Add SOF user guide for i.MX platforms This is intended for newcomers, integrators or developers just starting with i.MX platforms. Signed-off-by: Daniel Baluta --- getting_started/index.rst | 11 ++ getting_started/nxp/sof_imx_user_guide.rst | 165 +++++++++++++++++++++ 2 files changed, 176 insertions(+) create mode 100644 getting_started/nxp/sof_imx_user_guide.rst diff --git a/getting_started/index.rst b/getting_started/index.rst index 39552eea..506cce23 100644 --- a/getting_started/index.rst +++ b/getting_started/index.rst @@ -46,3 +46,14 @@ users when audio components are not working properly or are broken. intel_debug/introduction intel_debug/suggestions + +SOF on NXP platforms +******************** + +This section provides users guides for integrators and users working with i.MX platforms. + +.. toctree:: + :maxdepth: 1 + + nxp/sof_imx_user_guide + diff --git a/getting_started/nxp/sof_imx_user_guide.rst b/getting_started/nxp/sof_imx_user_guide.rst new file mode 100644 index 00000000..d1b7384c --- /dev/null +++ b/getting_started/nxp/sof_imx_user_guide.rst @@ -0,0 +1,165 @@ +.. _sof_imx_user_guide: + +SOF user guide on NXP i.MX8 platforms +##################################### + +.. contents:: + :local: + :depth: 3 + +This user guide aims to help newcomers, integrators and developers to run SOF on NXP i.MX platforms. + +Supported NXP platforms +*********************** + ++-----------+------------+----------------+------------------+------------------+ +| platform | short name | dsp | audio interfaces | supported codecs | ++===========+============+================+==================+==================+ +| i.mx8qm | i.mx8 | hifi4\@666mhz | esai, sai | wm8960, cs42888 | ++-----------+------------+----------------+------------------+------------------+ +| i.mx8qxp | i.mx8x | hifi4\@640mhz | esai, sai | wm8960, cs428888 | ++-----------+------------+----------------+------------------+------------------+ +| i.mx8mp | i.mx8m | hifi4\@800mhz | sai | wm8960 | ++-----------+------------+----------------+------------------+------------------+ + +See :ref:`platforms` for more details. + + +Toolchain +********* + +Two toolchains families are currently supported: GCC and Cadence XCC. + +1. **GCC**, open source, publicly available, toolchains built using crosstool-NG + + * available as prebuilt binaries from `crosstool-NG release `_ + * build from sources as documented in :ref:`build-toolchains-from-source` in the Getting Started Guide. + +2. **Cadence XCC** proprietary toolchain, available under terms and conditions + + * contact NXP tech support + + + +Quick run with SOF from i.MX8 Board Support Package +*************************************************** + +Binaries needed to run SOF on i.MX NXP platforms are provided in Board Support Package (BSP) software. Use the latest +`i.MX8 BSP Release `_ binaries. + +Kernel image and modules +------------------------ + +**Image-imx8_all.bin** is the name of the Linux kernel image. arm64 uses the same image for all platforms. + +SOF Linux driver functionality is implemented accross several kernel modules: + + * **snd-sof.ko**, SOF core functionality + * **snd-sof-of.ko**, SOF OF related functionality (SOF device probing, device tree parsing) + * **snd-sof-imx8.ko** (i.MX8QXP, i.MX8QM specific functionality, I/O mapping, power domains, clocks, etc) + * **snd-sof-imx8m.ko** (i.MX8MP specific functionality) + * **imx-common.ko** (i.MX common helpers) + * **snd-sof-xtensa-dsp.ko**, Xtensa specific functionality (register dumps, DSP stack traces) + +Linux kernel SOF modules are installed in rootfs image at: */lib/modules//kernel/sound/soc/sof/*. + +Device tree files +----------------- + +DSP is seen by the Linux kernel as an I/O mapped device. Audio interfaces are controlled by the DSP via SOF firmware. Codecs are controlled by the ARM core via Linux kernel. + ++-----------+-----------------------------+----------------------------+ +| platform | dtb | comments | ++===========+=============================+============================+ +| i.mx8qm | imx8qm-mek-sof-cs42888.dtb | ESAI + cs42888 (baseboard) | ++-----------+-----------------------------+----------------------------+ +| i.mx8qm | imx8qm-mek-sof-wm8960.dtb | SAI + wm6890 (cpuboard) | ++-----------+-----------------------------+----------------------------+ +| i.mx8qxp | imx8qxp-mek-sof-cs42888.dtb | ESAI + cs42888 (baseboard) | ++-----------+-----------------------------+----------------------------+ +| i.mx8qxp | imx8qxp-mek-sof-wm8960.dtb | SAI + wm8960 (cpuboard) | ++-----------+-----------------------------+----------------------------+ +| i.mx8mp | imx8mp-evk-sof-wm8960.dtb | SAI + wm8960 | ++-----------+-----------------------------+----------------------------+ + +Firmware images +--------------- + +Firmware images are installed in rootfs image at: */lib/firmware/imx/sof/*. + ++-----------+-------------------------------------------+ +| platform | firmware path | ++===========+===========================================+ +| i.mx8qm | /lib/firmware/imx/sof/sof-imx8.ri | ++-----------+-------------------------------------------+ +| i.mx8qxp | /lib/firmware/imx/sof/sof-imx8x.ri | ++-----------+-------------------------------------------+ +| i.mx8mp | /lib/firmware/imx/sof/sof-imx8m.ri | ++-----------+-------------------------------------------+ + +Topology files +-------------- + +Topology files files describe one or more audio pipelines and are installed in rootfs image at: */lib/firmware/imx/sof-tplg/*. + ++----------------------------------+-----------------+--------------------------------------+ +| topology name | platform | Usecase | ++===============+==================+=================+======================================+ +| sof-imx8-cs42888.tplg | imx8qm/imx8qxp | PCM playback/record w/ cs42888 codec | ++----------------------------------+-----------------+--------------------------------------+ +| sof-imx8-wm8960.tplg | imx8qm/imx8qxp | PCM playback/record w/ wm8960 codec | ++----------------------------------+-----------------+--------------------------------------+ +| sof-imx8mp-wm8960.tplg | imx8mp | PCM playback/record w/ wm8960 codec | ++----------------------------------+-----------------+--------------------------------------+ +| sof-imx8-cs42888.tplg | imx8qm/imx8qxp | PCM playback/record w/ SRC (wm8960) | ++----------------------------------+-----------------+--------------------------------------+ +| sof-imx8-wm8960.tplg | imx8qm/imx8qxp | PCM playback/record w/ SRC (cs42888) | ++----------------------------------+-----------------+--------------------------------------+ +| sof-imx8mp-wm8960.tplg | imx8mp | PCM playback/record w/ SRC (wm8960) | ++----------------------------------+-----------------+--------------------------------------+ +| sof-imx8-wm8960-mixer.tplg | imx8qm/imx8qxp | PCM playback/record w/ mixer | ++----------------------------------+-----------------+--------------------------------------+ +| sof-imx8-cs42888-mixer.tplg | imx8qm/imx8qxp | PCM playback/record w/ mixer | ++----------------------------------+-----------------+--------------------------------------+ +| sof-imx8mp-wm8960-mixer.tplg | imx8mp | PCM playback/record w/ mixer | ++----------------------------------+-----------------+--------------------------------------+ +| sof-imx8-compr-mp3-wm8960.tplg | imx8qxp/imx8qmp | Compress playback (mp3) | ++----------------------------------+-----------------+--------------------------------------+ +| sof-imx8mp-compr-mp3-wm8960.tplg | imx8mp | Compress playback (mp3) | ++----------------------------------+-----------------+--------------------------------------+ +| sof-imx8-compr-aac-wm8960.tplg | imx8qxp/imx8qmp | Compress playback (aac) | ++----------------------------------+-----------------+--------------------------------------+ +| sof-imx8mp-compr-aac-wm8960.tplg | imx8mp | Compress playback (aac) | ++----------------------------------+-----------------+--------------------------------------+ + +Build SOF binaries from sources +******************************* + +Use :ref:`build-with-docker` for a guide on how to build SOF binaries with docker. Otherwise, you can build it on your Debian like machine as folows. + +Kernel image and modules +------------------------ + +.. code-block:: bash + + # install arm64 toolchain + $ sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu + + # set defconfig + $ ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- make defconfig + + # compile the kernel and modules + $ ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- make -j8 + + # install the modules + $ INSTALL_MOD_PATH=/path/to/rootfs/ make modules_install + +SOF firmware +------------ + +See :ref:`build-from-scratch` + +Tools +----- + + From e7bf4896f3f77aa7c4a73fd1d23af716683944b0 Mon Sep 17 00:00:00 2001 From: Daniel Baluta Date: Tue, 6 Jul 2021 18:04:01 +0300 Subject: [PATCH 108/290] getting-started: Add SOF tools guide This adds a pointer to setup tools in build from scratch guide and add the commands to cross compile sof-logger for arm64 platforms. Signed-off-by: Daniel Baluta --- getting_started/nxp/sof_imx_user_guide.rst | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/getting_started/nxp/sof_imx_user_guide.rst b/getting_started/nxp/sof_imx_user_guide.rst index d1b7384c..a3bff5e3 100644 --- a/getting_started/nxp/sof_imx_user_guide.rst +++ b/getting_started/nxp/sof_imx_user_guide.rst @@ -157,9 +157,18 @@ Kernel image and modules SOF firmware ------------ -See :ref:`build-from-scratch` +See Step 3 :ref:`build-from-scratch` Tools ----- +See Step 4 in :ref:`build-from-scratch`. +sof-logger needs to be cross-compiled to run on arm64. + +.. code-block:: bash + + $ cd "$SOF_WORKSPACE"/sof/tools/ + $ mkdir build_tools && cd build_tools + $ cmake .. -DCMAKE_TOOLCHAIN_FILE=../scripts/cross-arch64.cmake + $ make sof-logger From a80d74372e0dbf501c7e4066e70b2323cc548227 Mon Sep 17 00:00:00 2001 From: Daniel Baluta Date: Tue, 6 Jul 2021 18:09:38 +0300 Subject: [PATCH 109/290] getting-starged; Add pointers about NXP Linux internal tree Signed-off-by: Daniel Baluta --- getting_started/nxp/sof_imx_user_guide.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/getting_started/nxp/sof_imx_user_guide.rst b/getting_started/nxp/sof_imx_user_guide.rst index a3bff5e3..55d81814 100644 --- a/getting_started/nxp/sof_imx_user_guide.rst +++ b/getting_started/nxp/sof_imx_user_guide.rst @@ -140,6 +140,14 @@ Use :ref:`build-with-docker` for a guide on how to build SOF binaries with docke Kernel image and modules ------------------------ +Use NXP internal Linux kernel tree to get full support for i.MX8 boards. + +.. code-block:: bash + + $ git clone https://source.codeaurora.org/external/imx/linux-imx + # checkout latest stable branch + $ git checkout lf-5.10.y + .. code-block:: bash # install arm64 toolchain From 727240b13aabc679b135a3da53405aae3351c2be Mon Sep 17 00:00:00 2001 From: Daniel Baluta Date: Tue, 6 Jul 2021 18:55:38 +0300 Subject: [PATCH 110/290] getting-starged: Add PCM audio playback/record scenario This explains what dtb and topology files to use in order to run a simple PCM audio/playback scenario on i.MX8QM. Signed-off-by: Daniel Baluta --- getting_started/nxp/sof_imx_user_guide.rst | 35 ++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/getting_started/nxp/sof_imx_user_guide.rst b/getting_started/nxp/sof_imx_user_guide.rst index 55d81814..4ec1a609 100644 --- a/getting_started/nxp/sof_imx_user_guide.rst +++ b/getting_started/nxp/sof_imx_user_guide.rst @@ -63,6 +63,8 @@ SOF Linux driver functionality is implemented accross several kernel modules: Linux kernel SOF modules are installed in rootfs image at: */lib/modules//kernel/sound/soc/sof/*. +.. _nxp_device_tree_files: + Device tree files ----------------- @@ -82,6 +84,8 @@ DSP is seen by the Linux kernel as an I/O mapped device. Audio interfaces are co | i.mx8mp | imx8mp-evk-sof-wm8960.dtb | SAI + wm8960 | +-----------+-----------------------------+----------------------------+ +.. _nxp_firmware_images: + Firmware images --------------- @@ -97,6 +101,8 @@ Firmware images are installed in rootfs image at: */lib/firmware/imx/sof/*. | i.mx8mp | /lib/firmware/imx/sof/sof-imx8m.ri | +-----------+-------------------------------------------+ +.. _nxp_topology_files: + Topology files -------------- @@ -180,3 +186,32 @@ sof-logger needs to be cross-compiled to run on arm64. $ mkdir build_tools && cd build_tools $ cmake .. -DCMAKE_TOOLCHAIN_FILE=../scripts/cross-arch64.cmake $ make sof-logger + +Audio scenarios +*************** + +We will demonstrate all the audio scenarios on i.MX8QM. Consult the list of :ref:`nxp_device_tree_files`, :ref:`nxp_firmware_images`, +:ref:`nxp_topology_files` in order to select proper binaries for your board and audio scenario. + +Audio playback and record +------------------------- + +Booting i.MX8QM with imx8qm-mek-sof-wm8960.dtb will enable PCM audio playback/record with wm8960 codec. This uses +the default topology found at /lib/firmware/imx/sof-tplg/sof-imx8-wm8960.tplg. + +.. code-block:: bash + + root@imx8qxpc0mek:~# aplay -l + **** List of PLAYBACK Hardware Devices **** + card 1: sofwm8960audio [sof-wm8960-audio], device 0: Port0 (*) [] + Subdevices: 1/1 + Subdevice #0: subdevice #0 + + # start playback on SOF device + root@imx8qxpc0mek:~# aplay -Dhw:1,0 sample.wav + Playing WAVE 'sample.wav' : Signed 32 bit Little Endian, Rate 48000 Hz, Stereo + + # start capture on SOF device + root@imx8qxpc0mek:~# arecord -Dhw:1,0 -f S32_LE -c 2 -r 48000 capture.wav + Recording WAVE 'capture.wav' : Signed 32 bit Little Endian, Rate 48000 Hz, Stereo + From 8c3d8ab56324a9ebb1997ee42f0cf55b024e60b0 Mon Sep 17 00:00:00 2001 From: Daniel Baluta Date: Tue, 6 Jul 2021 19:08:42 +0300 Subject: [PATCH 111/290] getting-started: Add audio mixing scenario This documents how to use audio mixing feature. It introduces the necessary topology file and aplay commands used for mixing. Signed-off-by: Daniel Baluta --- getting_started/nxp/sof_imx_user_guide.rst | 29 ++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/getting_started/nxp/sof_imx_user_guide.rst b/getting_started/nxp/sof_imx_user_guide.rst index 4ec1a609..34503d28 100644 --- a/getting_started/nxp/sof_imx_user_guide.rst +++ b/getting_started/nxp/sof_imx_user_guide.rst @@ -215,3 +215,32 @@ the default topology found at /lib/firmware/imx/sof-tplg/sof-imx8-wm8960.tplg. root@imx8qxpc0mek:~# arecord -Dhw:1,0 -f S32_LE -c 2 -r 48000 capture.wav Recording WAVE 'capture.wav' : Signed 32 bit Little Endian, Rate 48000 Hz, Stereo +Audio mixing +------------ + +We will demonstate how to use SOF in order to mix two PCM streams on i.MX8QM and render the output to wm8960 codec. +As usual, we will boot the i.MX8QM board using imx8qm-mek-sof-wm8960.dtb. + +Now, we need to use sof-imx8-wm8960-mixer.tplg topology file. + +.. code-block:: bash + + $ cp /lib/firmware/imx/sof-tplg/sof-imx8-wm8960-mixer.tplg /lib/firmware/imx/sof-tplg/sof-imx8-wm8960.tplg + +After, booting we will see now that SOF sound card will have two subdevices: + +.. code-block:: bash + + root@imx8qxpc0mek:~# aplay -l + **** List of PLAYBACK Hardware Devices **** + card 1: sofwm8960audio [sof-wm8960-audio], device 0: PCM (*) [] + Subdevices: 1/1 + Subdevice #0: subdevice #0 + card 1: sofwm8960audio [sof-wm8960-audio], device 1: PCM Deep Buffer (*) [] + Subdevices: 1/1 + Subdevice #0: subdevice #0 + + # PCM files sent to SOF card1/device0, card1/device1 will be mixed together by SOF firmware and then rendered on wm8960 codec + root@imx8qxpc0mek:~# aplay -Dhw:1,0 sample0.wav & aplay -Dhw:1,1 sample1.wav + Playing WAVE 'sample0.wav' : Signed 32 bit Little Endian, Rate 48000 Hz, Stereo + Playing WAVE 'sample1.wav' : Signed 32 bit Little Endian, Rate 48000 Hz, Stereo From d86055650b88882cd9497cd05e52b446858a6256 Mon Sep 17 00:00:00 2001 From: Daniel Baluta Date: Wed, 7 Jul 2021 13:59:00 +0300 Subject: [PATCH 112/290] getting-started: Add SRC and Audio compress for i.MX user guide This describes how to use SRC and Audio compress features with i.MX8. Signed-off-by: Daniel Baluta --- getting_started/nxp/sof_imx_user_guide.rst | 99 ++++++++++++++++++++++ 1 file changed, 99 insertions(+) diff --git a/getting_started/nxp/sof_imx_user_guide.rst b/getting_started/nxp/sof_imx_user_guide.rst index 34503d28..1fe91c11 100644 --- a/getting_started/nxp/sof_imx_user_guide.rst +++ b/getting_started/nxp/sof_imx_user_guide.rst @@ -244,3 +244,102 @@ After, booting we will see now that SOF sound card will have two subdevices: root@imx8qxpc0mek:~# aplay -Dhw:1,0 sample0.wav & aplay -Dhw:1,1 sample1.wav Playing WAVE 'sample0.wav' : Signed 32 bit Little Endian, Rate 48000 Hz, Stereo Playing WAVE 'sample1.wav' : Signed 32 bit Little Endian, Rate 48000 Hz, Stereo + +Sample rate converter +--------------------- + +Sample rate converter is supported via **SRC** open coded component in *src/audio/src*. + +Based on the toolchain used SOF on i.MX supports converting: + ++---------------+--------------------+----------------------------------------------------+--------------------+ +| toolchain | direction | input rate (kHz) | output rate (kHz) | ++===============+====================+====================================================+====================+ +| GCC | playback/capture | 8 16 32 44.1 48 96 | 48 | ++---------------+--------------------+----------------------------------------------------+--------------------+ +| XCC | playback | 8 11.025 16 22.05 32 44.1 48 64 88.2 96 176.4 192 | 48 | ++---------------+--------------------+----------------------------------------------------+--------------------+ +| XCC | capture | 8 11.025 16 22.050 32 44.1 48 | 48 | ++---------------+--------------------+----------------------------------------------------+--------------------+ + +As usual we will boot the i.MX8QM board using imx8qm-mek-sof-wm8960.dtb. We need to use sof-imx8-src-wm8960.tplg topology file. + +.. code-block:: bash + + $ cp /lib/firmware/imx/sof-tplg/sof-imx8-src-wm8960-mixer.tplg /lib/firmware/imx/sof-tplg/sof-imx8-wm8960.tplg + +Here are several runs with aplay and various rates and formats. + +.. code-block:: bash + + root@imx8qmmek:~# aplay -Dhw:1,0 -f S16_LE -c 2 -r 8000 -t raw /mnt/test/samples_16b/audio8k16b2c.wav + Playing raw data '/mnt/test/samples_16b/audio8k16b2c.wav' : Signed 16 bit Little Endian, Rate 8000 Hz, Stereo + + root@imx8qmmek:~# aplay -Dhw:1,0 -f S16_LE -c 2 -r 16000 -t raw /mnt/test/samples_16b/audio16k16b2c.wav + Playing raw data '/mnt/test/samples_16b/audio16k16b2c.wav' : Signed 16 bit Little Endian, Rate 16000 Hz, Stereo + + root@imx8qmmek:~# aplay -Dhw:1,0 -f S24_LE -c 2 -r 32000 -t raw /mnt/test/samples/audio32k24b2c.wav + Playing raw data '/mnt/test/samples/audio32k24b2c.wav' : Signed 24 bit Little Endian, Rate 32000 Hz, Stereo + + root@imx8qmmek:~# aplay -Dhw:1,0 -f S24_LE -c 2 -r 44100 -t raw /mnt/test/samples/audio44k24b2c.wav + Playing raw data '/mnt/test/samples/audio44k24b2c.wav' : Signed 24 bit Little Endian, Rate 44100 Hz, Stereo + + root@imx8qmmek:~# aplay -Dhw:1,0 -f S32_LE -c 2 -r 48000 -t raw /mnt/test/samples_32b/audio48k32b2c.wav + Playing raw data '/mnt/test/samples_32b/audio48k32b2c.wav' : Signed 32 bit Little Endian, Rate 48000 Hz, Stereo + + root@imx8qmmek:~# aplay -Dhw:1,0 -f S32_LE -c 2 -r 96000 -t raw /mnt/test/samples_32b/audio96k32b2c.wav + Playing raw data '/mnt/test/samples_32b/audio96k32b2c.wav' : Signed 32 bit Little Endian, Rate 96000 Hz, Stereo + +Compress audio +-------------- + +In order to use DSP to decode/encode compress audio we make use of `ALSA Compress Offload API `_ + +Supported codecs on i.MX8QM: + ++---------------+--------------------+----------------+-------------------------------------------------+ +| codec | topology | Test command | ++===============+=====================================+=================================================+ +| PCM | sof-imx8-processing-pcm-wm8960.m4 | cplay -c 1 -d 0 -f 2 -b 7680 -I PCM sample.wav | ++---------------+-------------------------------------+-------------------------------------------------+ +| MP3 | sof-imx8-processing-mp3-wm8960.m4 | cplay -c 1 -d 0 -f 2 -b 7680 -I MP3 sample.mp3 | ++---------------+-------------------------------------+-------------------------------------------------+ +| AAC | sof-imx8-processing-aac-wm8960.m4 | cplay -c 1 -d 0 -f 2 -b 7680 -I MP3 sample.aac | ++---------------+-------------------------------------+-------------------------------------------------+ + +See :ref:`nxp_topology_files` for the list of topology files to be used on other NXP i.MX boards. + +To enable compress audio in SOF firmware you need to enable Codec Adapter component and select +appropriate decoding library algorithms. On i.MX8 we use Cadence proprietary libraries. + +.. code-block:: bash + + CONFIG_COMP_CODEC_ADAPTER=y + CONFIG_CADENCE_CODEC=y + + # Enable AAC Cadence decoder + CONFIG_CADENCE_CODEC_AAC_DEC=y + CONFIG_CADENCE_CODEC_AAC_DEC_LIB="/path/to/aac/library" + + # Enable MP3 Cadence decoder + CONFIG_CADENCE_CODEC_MP3_DEC=y + CONFIG_CADENCE_CODEC_MP3_DEC_LIB="/path/to/mp3/library" + +Contact NXP Tech support for information on how to obtain Cadence proprietary algorithms. + +As usual we will boot the i.MX8QM board using imx8qm-mek-sof-wm8960.dtb. Let's see an example on how to test +MP3 audio decodder. We need to use sof-imx8-processing-mp3-wm8960.m4 topology file. + +.. code-block:: bash + + $ cp /lib/firmware/imx/sof-tplg/sof-imx8-processing-mp3-wm8960.m4 /lib/firmware/imx/sof-tplg/sof-imx8-wm8960.tplg + +.. code-block:: bash + + $ cplay -c -d -f -b -I sample.file + # identify card and device number + $ ls /dev/snd* + comprC1D0 ==> this means => [card 1, device 0] + # fragments is always 2, buffer size is always a multiple of 768, recommended value is 7680 + $ cplay -c 1 -d 0 -f 2 -b 7680 -I MP3 samples.mp3 + From f0afe069a0e1ebd3912703178140f875a84d6a76 Mon Sep 17 00:00:00 2001 From: Deb Date: Thu, 15 Jul 2021 10:32:18 -0400 Subject: [PATCH 113/290] Grammatical and style edits to NXP IMX page. Signed-off-by: Deb --- getting_started/index.rst | 2 +- getting_started/nxp/sof_imx_user_guide.rst | 100 +++++++++++---------- 2 files changed, 53 insertions(+), 49 deletions(-) mode change 100644 => 100755 getting_started/index.rst mode change 100644 => 100755 getting_started/nxp/sof_imx_user_guide.rst diff --git a/getting_started/index.rst b/getting_started/index.rst old mode 100644 new mode 100755 index 506cce23..a9511ef1 --- a/getting_started/index.rst +++ b/getting_started/index.rst @@ -50,7 +50,7 @@ users when audio components are not working properly or are broken. SOF on NXP platforms ******************** -This section provides users guides for integrators and users working with i.MX platforms. +This section provides guides for integrators and for users working with i.MX platforms. .. toctree:: :maxdepth: 1 diff --git a/getting_started/nxp/sof_imx_user_guide.rst b/getting_started/nxp/sof_imx_user_guide.rst old mode 100644 new mode 100755 index 1fe91c11..c7e2f6c7 --- a/getting_started/nxp/sof_imx_user_guide.rst +++ b/getting_started/nxp/sof_imx_user_guide.rst @@ -1,19 +1,19 @@ .. _sof_imx_user_guide: -SOF user guide on NXP i.MX8 platforms +SOF User Guide on NXP i.MX8 platforms ##################################### .. contents:: :local: :depth: 3 -This user guide aims to help newcomers, integrators and developers to run SOF on NXP i.MX platforms. +This guide describes how to run SOF on NXP i.MX8 platforms. Supported NXP platforms *********************** +-----------+------------+----------------+------------------+------------------+ -| platform | short name | dsp | audio interfaces | supported codecs | +| Platform | Short Name | DSP | Audio Interfaces | Supported Codecs | +===========+============+================+==================+==================+ | i.mx8qm | i.mx8 | hifi4\@666mhz | esai, sai | wm8960, cs42888 | +-----------+------------+----------------+------------------+------------------+ @@ -28,50 +28,50 @@ See :ref:`platforms` for more details. Toolchain ********* -Two toolchains families are currently supported: GCC and Cadence XCC. +NXP i.MX8 currently supports two toolchain families: GCC and Cadence XCC. -1. **GCC**, open source, publicly available, toolchains built using crosstool-NG +1. **GCC** is an open source, publicly available, toolchain built using crosstool-NG: - * available as prebuilt binaries from `crosstool-NG release `_ - * build from sources as documented in :ref:`build-toolchains-from-source` in the Getting Started Guide. + * Available as prebuilt binaries from `crosstool-NG release `_. + * Can be built from sources as documented in :ref:`build-toolchains-from-source` under **Getting Started Guides**. -2. **Cadence XCC** proprietary toolchain, available under terms and conditions +2. **Cadence XCC** is a proprietary toolchain, available under certain terms and conditions: - * contact NXP tech support + * Contact NXP tech support. Quick run with SOF from i.MX8 Board Support Package *************************************************** -Binaries needed to run SOF on i.MX NXP platforms are provided in Board Support Package (BSP) software. Use the latest +Binaries needed to run SOF on i.MX8 NXP platforms are provided in the Board Support Package (BSP) software. Use the latest `i.MX8 BSP Release `_ binaries. Kernel image and modules ------------------------ -**Image-imx8_all.bin** is the name of the Linux kernel image. arm64 uses the same image for all platforms. +``Image-imx8_all.bin`` is the name of the Linux kernel image. arm64 uses the same image for all platforms. -SOF Linux driver functionality is implemented accross several kernel modules: +SOF Linux driver functionality is implemented across several kernel modules: - * **snd-sof.ko**, SOF core functionality - * **snd-sof-of.ko**, SOF OF related functionality (SOF device probing, device tree parsing) - * **snd-sof-imx8.ko** (i.MX8QXP, i.MX8QM specific functionality, I/O mapping, power domains, clocks, etc) - * **snd-sof-imx8m.ko** (i.MX8MP specific functionality) - * **imx-common.ko** (i.MX common helpers) - * **snd-sof-xtensa-dsp.ko**, Xtensa specific functionality (register dumps, DSP stack traces) + * **snd-sof.ko**: SOF core functionality + * **snd-sof-of.ko**: SOF OF-related functionality (SOF device probing, device tree parsing) + * **snd-sof-imx8.ko**: i.MX8QXP, i.MX8QM-specific functionality (I/O mapping, power domains, clocks, etc) + * **snd-sof-imx8m.ko**: i.MX8MP-specific functionality + * **imx-common.ko**: i.MX common helpers + * **snd-sof-xtensa-dsp.ko**: Xtensa-specific functionality (register dumps, DSP stack traces) -Linux kernel SOF modules are installed in rootfs image at: */lib/modules//kernel/sound/soc/sof/*. +Linux kernel SOF modules are installed in the ``rootfs`` image at: ``/lib/modules//kernel/sound/soc/sof/``. .. _nxp_device_tree_files: Device tree files ----------------- -DSP is seen by the Linux kernel as an I/O mapped device. Audio interfaces are controlled by the DSP via SOF firmware. Codecs are controlled by the ARM core via Linux kernel. +DSP is seen by the Linux kernel as an I/O mapped device. Audio interfaces are controlled by the DSP via SOF firmware. Codecs are controlled by the ARM core via the Linux kernel. +-----------+-----------------------------+----------------------------+ -| platform | dtb | comments | +| Platform | DTB | Comments | +===========+=============================+============================+ | i.mx8qm | imx8qm-mek-sof-cs42888.dtb | ESAI + cs42888 (baseboard) | +-----------+-----------------------------+----------------------------+ @@ -89,10 +89,10 @@ DSP is seen by the Linux kernel as an I/O mapped device. Audio interfaces are co Firmware images --------------- -Firmware images are installed in rootfs image at: */lib/firmware/imx/sof/*. +Firmware images are installed in the ``rootfs`` image at: ``/lib/firmware/imx/sof/``. +-----------+-------------------------------------------+ -| platform | firmware path | +| Platform | Firmware Path | +===========+===========================================+ | i.mx8qm | /lib/firmware/imx/sof/sof-imx8.ri | +-----------+-------------------------------------------+ @@ -106,10 +106,11 @@ Firmware images are installed in rootfs image at: */lib/firmware/imx/sof/*. Topology files -------------- -Topology files files describe one or more audio pipelines and are installed in rootfs image at: */lib/firmware/imx/sof-tplg/*. +Topology files describe one or more audio pipelines and are installed in the +``rootfs`` image at: ``/lib/firmware/imx/sof-tplg/``. +----------------------------------+-----------------+--------------------------------------+ -| topology name | platform | Usecase | +| Topology Name | Platform | Usecase | +===============+==================+=================+======================================+ | sof-imx8-cs42888.tplg | imx8qm/imx8qxp | PCM playback/record w/ cs42888 codec | +----------------------------------+-----------------+--------------------------------------+ @@ -141,12 +142,13 @@ Topology files files describe one or more audio pipelines and are installed in r Build SOF binaries from sources ******************************* -Use :ref:`build-with-docker` for a guide on how to build SOF binaries with docker. Otherwise, you can build it on your Debian like machine as folows. +Use :ref:`build-with-docker` to build SOF binaries with Docker. Otherwise, +build it on your Debian-like machine as follows. Kernel image and modules ------------------------ -Use NXP internal Linux kernel tree to get full support for i.MX8 boards. +Use the NXP internal Linux kernel tree to get full support for i.MX8 boards: .. code-block:: bash @@ -171,14 +173,14 @@ Use NXP internal Linux kernel tree to get full support for i.MX8 boards. SOF firmware ------------ -See Step 3 :ref:`build-from-scratch` +See Step 3 :ref:`build-from-scratch`. Tools ----- See Step 4 in :ref:`build-from-scratch`. -sof-logger needs to be cross-compiled to run on arm64. +The sof-logger must be cross-compiled in order to run on arm64: .. code-block:: bash @@ -190,14 +192,14 @@ sof-logger needs to be cross-compiled to run on arm64. Audio scenarios *************** -We will demonstrate all the audio scenarios on i.MX8QM. Consult the list of :ref:`nxp_device_tree_files`, :ref:`nxp_firmware_images`, -:ref:`nxp_topology_files` in order to select proper binaries for your board and audio scenario. +This section demonstrates all audio scenarios on i.MX8QM. Consult the list of :ref:`nxp_device_tree_files`, :ref:`nxp_firmware_images`, and +:ref:`nxp_topology_files` in order to select the proper binaries for your board and audio scenario. Audio playback and record ------------------------- -Booting i.MX8QM with imx8qm-mek-sof-wm8960.dtb will enable PCM audio playback/record with wm8960 codec. This uses -the default topology found at /lib/firmware/imx/sof-tplg/sof-imx8-wm8960.tplg. +Booting i.MX8QM with ``imx8qm-mek-sof-wm8960.dtb`` enables PCM audio playback/record with the wm8960 codec. This uses +the default topology found at ``/lib/firmware/imx/sof-tplg/sof-imx8-wm8960.tplg``. .. code-block:: bash @@ -218,16 +220,16 @@ the default topology found at /lib/firmware/imx/sof-tplg/sof-imx8-wm8960.tplg. Audio mixing ------------ -We will demonstate how to use SOF in order to mix two PCM streams on i.MX8QM and render the output to wm8960 codec. -As usual, we will boot the i.MX8QM board using imx8qm-mek-sof-wm8960.dtb. +The following demonstates how to use SOF in order to mix two PCM streams on +i.MX8QM and render the output to the wm8960 codec. -Now, we need to use sof-imx8-wm8960-mixer.tplg topology file. +Boot the i.MX8QM board using ``imx8qm-mek-sof-wm8960.dtb``. Use the ``sof-imx8-wm8960-mixer.tplg`` topology file: .. code-block:: bash $ cp /lib/firmware/imx/sof-tplg/sof-imx8-wm8960-mixer.tplg /lib/firmware/imx/sof-tplg/sof-imx8-wm8960.tplg -After, booting we will see now that SOF sound card will have two subdevices: +After booting, the SOF sound card contains two subdevices: .. code-block:: bash @@ -248,12 +250,12 @@ After, booting we will see now that SOF sound card will have two subdevices: Sample rate converter --------------------- -Sample rate converter is supported via **SRC** open coded component in *src/audio/src*. +Sample rate converter is supported via the **SRC** open-coded component in ``src/audio/src``. -Based on the toolchain used SOF on i.MX supports converting: +Based on the specific toolchain used, SOF on i.MX supports converting the following: +---------------+--------------------+----------------------------------------------------+--------------------+ -| toolchain | direction | input rate (kHz) | output rate (kHz) | +| Toolchain | Direction | Input Rate (kHz) | Output Rate (kHz) | +===============+====================+====================================================+====================+ | GCC | playback/capture | 8 16 32 44.1 48 96 | 48 | +---------------+--------------------+----------------------------------------------------+--------------------+ @@ -262,13 +264,14 @@ Based on the toolchain used SOF on i.MX supports converting: | XCC | capture | 8 11.025 16 22.050 32 44.1 48 | 48 | +---------------+--------------------+----------------------------------------------------+--------------------+ -As usual we will boot the i.MX8QM board using imx8qm-mek-sof-wm8960.dtb. We need to use sof-imx8-src-wm8960.tplg topology file. +Boot the i.MX8QM board using ``imx8qm-mek-sof-wm8960.dtb``. Use the +``sof-imx8-src-wm8960.tplg`` topology file: .. code-block:: bash $ cp /lib/firmware/imx/sof-tplg/sof-imx8-src-wm8960-mixer.tplg /lib/firmware/imx/sof-tplg/sof-imx8-wm8960.tplg -Here are several runs with aplay and various rates and formats. +Below are several runs with aplay on various rates and formats: .. code-block:: bash @@ -293,7 +296,7 @@ Here are several runs with aplay and various rates and formats. Compress audio -------------- -In order to use DSP to decode/encode compress audio we make use of `ALSA Compress Offload API `_ +In order to use DSP to decode/encode compress audio, NXP uses `ALSA Compress Offload APIs `_. Supported codecs on i.MX8QM: @@ -307,10 +310,11 @@ Supported codecs on i.MX8QM: | AAC | sof-imx8-processing-aac-wm8960.m4 | cplay -c 1 -d 0 -f 2 -b 7680 -I MP3 sample.aac | +---------------+-------------------------------------+-------------------------------------------------+ -See :ref:`nxp_topology_files` for the list of topology files to be used on other NXP i.MX boards. +See :ref:`nxp_topology_files` for the list of topology files to use on other NXP i.MX boards. -To enable compress audio in SOF firmware you need to enable Codec Adapter component and select -appropriate decoding library algorithms. On i.MX8 we use Cadence proprietary libraries. +To enable compress audio in SOF firmware, you must enable the Codec Adapter +component and select the appropriate decoding library algorithms. For i.MX8, +we use the Cadence proprietary libraries: .. code-block:: bash @@ -327,8 +331,8 @@ appropriate decoding library algorithms. On i.MX8 we use Cadence proprietary lib Contact NXP Tech support for information on how to obtain Cadence proprietary algorithms. -As usual we will boot the i.MX8QM board using imx8qm-mek-sof-wm8960.dtb. Let's see an example on how to test -MP3 audio decodder. We need to use sof-imx8-processing-mp3-wm8960.m4 topology file. +Boot the i.MX8QM board using ``imx8qm-mek-sof-wm8960.dtb``. The following +example tests the MP3 audio decoder by using the ``sof-imx8-processing-mp3-wm8960.m4`` topology file: .. code-block:: bash From 141195eb8015affb681fa622d283e135638468a9 Mon Sep 17 00:00:00 2001 From: Marc Herbert Date: Fri, 23 Jul 2021 09:06:22 +0000 Subject: [PATCH 114/290] Fix unit tests documentation Explain how to "steal" parameters from scripts/xtensa-build-all.sh Explain how to compile natively. Link the two sections with each other. `make platform_defconfig` was obsolete, replace with -DINIT_CONFIG Signed-off-by: Marc Herbert --- developer_guides/firmware/cmake.rst | 2 ++ developer_guides/unit_tests.rst | 52 ++++++++++++++++++++--------- 2 files changed, 38 insertions(+), 16 deletions(-) diff --git a/developer_guides/firmware/cmake.rst b/developer_guides/firmware/cmake.rst index c943cad1..3edbbad3 100644 --- a/developer_guides/firmware/cmake.rst +++ b/developer_guides/firmware/cmake.rst @@ -107,6 +107,8 @@ Unit Tests Optional arguments. Only for unit tests. +Read :ref:`unit_tests` first. + BUILD_UNIT_TESTS Default: OFF, if ON then builds unit tests. diff --git a/developer_guides/unit_tests.rst b/developer_guides/unit_tests.rst index ccb22201..86e6581c 100644 --- a/developer_guides/unit_tests.rst +++ b/developer_guides/unit_tests.rst @@ -14,35 +14,55 @@ For a successful compilation, it needs a toolchain thats supports C stdlib. Configuring for unit tests ************************** -In order to build and run unit tests, just pass additional flag to -CMake **-DBUILD_UNIT_TESTS=ON**. +Unit tests are built from the same, top-level CMakeLists.txt as the +firmware but with different CMake flags: **-DBUILD_UNIT_TESTS=ON** and a +couple others. + +Building unit tests can be more complex than building the firmware +because for the firmware the script ``./xtensa-build-all.sh`` hides most +the CMake configuration. For unit tests you must find a working +combination of environment variables and CMake flags. Fortunately +``./xtensa-build-all.sh`` logs some of its magic that you can "steal" +and re-use to build unit tests. Like this: + +- Export ``XTENSA_TOOLS_ROOT`` as you normally do when building the + firmware. +- Build the firmware using ``./xtensa-build-all.sh`` and take note of the + following variables in the build log: ``PATH``, ``XTENSA_SYSTEM`` and + the ``-DROOT_DIR`` parameter. +- ``export`` the ``PATH`` and ``XTENSA_SYSTEM`` values found above. +- Run cmake with ``-DBUILD_UNIT_TESTS=ON``, the ``-DROOT_DIR`` parameter above, + ``-DINIT_CONFIG`` and a new build directory +- Build and run the tests with ``make test`` or ``ninja test``. -Unit tests need a valid config for a used toolchain, so before building them you can use a default config such as: +Example: Running tests for APL +============================== .. code-block:: bash - make _defconfig + mkdir build_ut && cd build_ut + cmake -DBUILD_UNIT_TESTS=ON -DTOOLCHAIN=xt -DINIT_CONFIG=apollolake_defconfig \ + -DROOT_DIR=/xcc/install/builds/RG-2017.8-linux/X4H3I16w2D48w3a_2017_8/xtensa-elf .. + make -j4 && ctest -j8 -Then build and run all unit tests by entering: +.. note:: -.. code-block:: bash + Use -DTOOLCHAIN=xt option, -DTOOLCHAIN=xtensa--elf is not supported - make -j4 && ctest -j8 +Additional unit tests options can be found in :ref:`cmake`. +Compiling unit tests without a cross-compilation toolchain +========================================================== -Example: Running tests for APL -============================== +You can also compile the unit tests with your native compiler. You won't +be able to _run_ the tests but this can be convenient to test +compilation issues quickly: .. code-block:: bash - mkdir build_ut && cd build_ut - cmake -DTOOLCHAIN=xt -DROOT_DIR=$CONFIG_PATH/xtensa-elf -DBUILD_UNIT_TESTS=ON .. - make apollolake_defconfig - make -j4 && ctest -j8 + cmake -B build_ut -DBUILD_UNIT_TESTS_HOST=yes -DTOOLCHAIN=gcc \ + -DBUILD_UNIT_TESTS=ON -DINIT_CONFIG=something_defconfig -.. note:: - - Use -DTOOLCHAIN=xt option, -DTOOLCHAIN=xtensa--elf is not supported Wrapping objects for unit tests ******************************* From 7c3964f1213f5a2db743996dcf65c92a8587627e Mon Sep 17 00:00:00 2001 From: Marc Herbert Date: Mon, 26 Jul 2021 22:52:38 +0000 Subject: [PATCH 115/290] Unit tests: running them on the host _is_ possible. ... and now even CI does it since https://github.com/thesofproject/sof/pull/4543 Also mention run-cmocks.sh Signed-off-by: Marc Herbert --- developer_guides/unit_tests.rst | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/developer_guides/unit_tests.rst b/developer_guides/unit_tests.rst index 86e6581c..3b1008dd 100644 --- a/developer_guides/unit_tests.rst +++ b/developer_guides/unit_tests.rst @@ -54,15 +54,17 @@ Additional unit tests options can be found in :ref:`cmake`. Compiling unit tests without a cross-compilation toolchain ========================================================== -You can also compile the unit tests with your native compiler. You won't -be able to _run_ the tests but this can be convenient to test -compilation issues quickly: +You can also compile and run unit tests with your native compiler: .. code-block:: bash - cmake -B build_ut -DBUILD_UNIT_TESTS_HOST=yes -DTOOLCHAIN=gcc \ + rm -rf build_ut/ + cmake -B build_ut/ -DBUILD_UNIT_TESTS_HOST=yes \ -DBUILD_UNIT_TESTS=ON -DINIT_CONFIG=something_defconfig + make -C build_ut/ -j8 && make -C build_ut/ test +The ``scripts/run-cmocks.sh`` script does all that and can also run unit +tests with valgrind. Wrapping objects for unit tests ******************************* From 4b0b3ac4196aff6ed4ac7de44d7dbebe8021675e Mon Sep 17 00:00:00 2001 From: Deb Date: Thu, 26 Aug 2021 13:08:17 -0400 Subject: [PATCH 116/290] Updated release number and version 1.8 June 2021 Signed-off-by: Deb --- release.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release.rst b/release.rst index 6318e41e..3ffa3223 100755 --- a/release.rst +++ b/release.rst @@ -26,7 +26,7 @@ kernel, and documentation. Download the source code as a zip or tar.gz file: Source and Binary Releases -------------------------- -The latest SOF release is v1.7 (April 2021). +The latest SOF release is v1.8 (June 2021). View new feature information and release downloads for the latest and previous releases on GitHub. Firmware and SDK tool source code and binary From de0d2976f7fe9e86ab51a9f2d1e9382f5306407c Mon Sep 17 00:00:00 2001 From: Marc Herbert Date: Thu, 9 Sep 2021 20:45:30 +0000 Subject: [PATCH 117/290] zephyr: document the new build-sof-staging directory MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is also future-proof with respect the sof-logger which is already built but does NOT work yet. Real output right now: $ tree build-sof-staging/ build-sof-staging/ ├── sof │   ├── community │   │   ├── sof-apl.ri │   │   ├── sof-imx8.ri │   │   └── sof-tgl-h.ri │   ├── sof-apl.ldc │   ├── sof-imx8.ldc │   └── sof-tgl-h.ldc └── tools └── sof-logger Signed-off-by: Marc Herbert --- .../build-guide/build-with-zephyr.rst | 39 ++++++++++++++----- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/getting_started/build-guide/build-with-zephyr.rst b/getting_started/build-guide/build-with-zephyr.rst index 58ef9859..f91155d1 100755 --- a/getting_started/build-guide/build-with-zephyr.rst +++ b/getting_started/build-guide/build-with-zephyr.rst @@ -60,19 +60,42 @@ Check out and build Run *** -After the above instructions are completed, a firmware image is located at -``build-apl/zephyr/zephyr.ri``. +For convenience, the ``xtensa-build-zephyr.sh`` script copies all +firmware files into a single, "staging" directory: -#. Copy the firmware image (``build-apl/zephyr/zephyr.ri``) to the usual - location on your target system. For example, if it is built natively, - enter the following: + .. code-block:: bash + + $ tree build-sof-staging/ + + build-sof-staging/ + ├── sof + │   ├── community + │   │   ├── sof-apl.ri + │   │   ├── sof-imx8.ri + │   │   └── sof-tgl-h.ri + + +#. Copy the firmware image(s) to the usual location on all your target + systems. Example: .. code-block:: bash - sudo cp build-apl/zephyr/zephyr.ri /lib/firmware/intel/sof/community/sof-cnl.ri + sudo rsync -a build-sof-staging/sof/ testsystemN.local:/lib/firmware/intel/sof/ + + ``rsync`` also works locally and unlike ``cp -R`` it is always + idempotent. You may want to use the ``rsync -a --delete`` option to + make absolutely sure you're not running some older version but only + after backing up your original ``sof/`` directory first. The + ``--delete`` option is dangerous, use it only in very well tested + scripts. + + Also make sure nothing in ``/lib/firmware/updates`` takes precedence, + see + https://www.kernel.org/doc/html/v5.5/driver-api/firmware/fw_search_path.html #. Reboot the system. Note that the location and name of your SOF - firmware image may vary by system. Search your kernel logs for a line + firmware image may vary by system. Search your kernel logs with + ``journalctl -k -g sof``, looking for a line such as the following to identify which file under ``/lib/firmware/`` your hardware is using: ``sof-audio-pci 0000:00:0e.0: request_firmware intel/sof/community/sof-apl.ri successful`` @@ -92,5 +115,3 @@ For firmware log extraction, use You might also need to build and update your system audio topology file. For details see :ref:`build-from-scratch`. - - From dd8ce95232dcb4c51d92a5adc1e101080b40839d Mon Sep 17 00:00:00 2001 From: Marc Herbert Date: Thu, 9 Sep 2021 20:47:19 +0000 Subject: [PATCH 118/290] zephyr: xtensa-build-zephyr.sh without argument does not print usage ... anymore after https://github.com/thesofproject/sof/pull/4740 Signed-off-by: Marc Herbert --- getting_started/build-guide/build-with-zephyr.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/getting_started/build-guide/build-with-zephyr.rst b/getting_started/build-guide/build-with-zephyr.rst index f91155d1..c21459dd 100755 --- a/getting_started/build-guide/build-with-zephyr.rst +++ b/getting_started/build-guide/build-with-zephyr.rst @@ -52,8 +52,8 @@ Check out and build .. code-block:: bash cd $ZEPHYR_WORKSPACE - ./modules/audio/sof/scripts/xtensa-build-zephyr.sh # shows usage - ./modules/audio/sof/scripts/xtensa-build-zephyr.sh $your_platform + ./modules/audio/sof/scripts/xtensa-build-zephyr.sh -h # shows usage + ./modules/audio/sof/scripts/xtensa-build-zephyr.sh $your_platforms ls build-*/zephyr/zephyr.* => build-*/zephyr/zephyr.ri ... From 79ad199c70e87a1b0e06d8b0de778a79e66df8f5 Mon Sep 17 00:00:00 2001 From: Marc Herbert Date: Thu, 9 Sep 2021 21:15:33 +0000 Subject: [PATCH 119/290] zephyr: show how to switch to the latest SOF code Git and west cheat sheet. Signed-off-by: Marc Herbert --- .../build-guide/build-with-zephyr.rst | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/getting_started/build-guide/build-with-zephyr.rst b/getting_started/build-guide/build-with-zephyr.rst index c21459dd..303282ce 100755 --- a/getting_started/build-guide/build-with-zephyr.rst +++ b/getting_started/build-guide/build-with-zephyr.rst @@ -57,6 +57,22 @@ Check out and build ls build-*/zephyr/zephyr.* => build-*/zephyr/zephyr.ri ... +#. Fetch and switch to the latest SOF code + + By policy, zephyr modules are carefully versioned with west and not + automatically synchronized with the latest code. To switch to the + latest: + + .. code-block:: bash + + cd modules/audio/sof/ + git remote add sof https://github.com/thesofproject/sof + git fetch sof + git switch --track sof/main + + You can also delete the ``sof`` clone downloaded by ``west`` and + replace it with an older clone; west will automatically adjust. + Run *** From ae67d9488f0425df19fc9187d0ff3764ee9678a7 Mon Sep 17 00:00:00 2001 From: bhiregoudar <87515748+bhiregoudar@users.noreply.github.com> Date: Thu, 16 Sep 2021 16:30:55 +0530 Subject: [PATCH 120/290] Add AMD platform specific information to the table. Add AMD Renoir platform specific information to the table. Included clock, memory and audio controller instances to the table --- platforms/index.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/platforms/index.rst b/platforms/index.rst index 5c5a4b2c..9a5edafb 100644 --- a/platforms/index.rst +++ b/platforms/index.rst @@ -25,6 +25,7 @@ Platform and board specific support is continually added to the SOF project as d "Intel Tigerlake", "Xtensa HiFi3", "4 @ 120 - 400MHz", "64KB LP SRAM / 2944KB HP SRAM", "6 x SSP (I2S, PCM), HDA, DMIC, Soundwire" "NXP i.MX8/i.MX8X", "Xtensa HiFi4", "1 @ 666MHz", "64 KB TCM / 448 KB OCRAM / 8MB SDRAM", "1 x ESAI, 1 x SAI" "NXP i.MX8M", "Xtensa HiFi4", "1 @ 800MHz", "64 KB TCM / 256 KB OCRAM / 8MB SDRAM", "1 x SAI, MICFIL" + "AMD Renoir", "Xtensa HiFi3", "1 @ 600MHz", "20 KB LP SRAM / 1152 KB IRAM/DRAM", "1 x SP (I2S, PCM), 1 x BT (I2S, PCM), DMIC" When support for a new platform is being added, certain interfaces required by SOF infrastructure must be implemented. Refer to Platform API documentation From 076f85d564a74a34df85c335fab1bbc2c29128f4 Mon Sep 17 00:00:00 2001 From: Anton Bobkov Date: Fri, 17 Sep 2021 10:25:07 +0300 Subject: [PATCH 121/290] Adjust size in memory management dot files to render properly --- developer_guides/firmware/images/memory-zones.dot | 2 +- developer_guides/firmware/images/runtime-zone.dot | 2 +- developer_guides/firmware/images/system-zone.dot | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/developer_guides/firmware/images/memory-zones.dot b/developer_guides/firmware/images/memory-zones.dot index 868c1f8e..e4541abf 100644 --- a/developer_guides/firmware/images/memory-zones.dot +++ b/developer_guides/firmware/images/memory-zones.dot @@ -2,7 +2,7 @@ digraph memory_zones { compound = true; node [shape = record]; rankdir = LR; - size=3; + size=5; clients [label = "applications |kernel diff --git a/developer_guides/firmware/images/runtime-zone.dot b/developer_guides/firmware/images/runtime-zone.dot index ffa0e506..e2824216 100644 --- a/developer_guides/firmware/images/runtime-zone.dot +++ b/developer_guides/firmware/images/runtime-zone.dot @@ -2,7 +2,7 @@ digraph runtime_zone { compound = true; node [shape = record]; rankdir = LR; - size=2.5; + size=4; subgraph cluster_rt_0 { label = "RUNTIME HEAP #0"; diff --git a/developer_guides/firmware/images/system-zone.dot b/developer_guides/firmware/images/system-zone.dot index d18a7c8b..06768cb9 100644 --- a/developer_guides/firmware/images/system-zone.dot +++ b/developer_guides/firmware/images/system-zone.dot @@ -2,7 +2,7 @@ digraph system_zone { compound = true; node [shape = record]; rankdir = LR; - size=4; + size=7; subgraph cluster_sys_0 { label = "SYS HEAP #0"; From ac836f78476e54aa8a9b32842921151b41360874 Mon Sep 17 00:00:00 2001 From: Anton Bobkov Date: Tue, 21 Sep 2021 12:30:06 +0300 Subject: [PATCH 122/290] Nitpicks Signed-off-by: Anton Bobkov --- developer_guides/firmware/mem-mgmt.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/developer_guides/firmware/mem-mgmt.rst b/developer_guides/firmware/mem-mgmt.rst index 447257d6..e96b955a 100644 --- a/developer_guides/firmware/mem-mgmt.rst +++ b/developer_guides/firmware/mem-mgmt.rst @@ -27,7 +27,7 @@ System Zone *********** The system zone receives a series of allocations during the system initialization phase. Since no memory is freed until the system (core) goes -down, the allocation mechanism may be simple, ensuring that a sufficient +down, the allocation mechanism might be simple, ensuring that a sufficient offset to the beginning of free space left is maintained. .. graphviz:: images/system-zone.dot @@ -35,13 +35,13 @@ offset to the beginning of free space left is maintained. All system-level components (schedulers, work queues, etc.) allocate their memory blocks from the system heap. Separation between the system heap and -runtime heap(s) may be further hardened in case an access control for user +runtime heap(s) might be further hardened in case an access control for user mode vs. kernel mode is supported by the architecture/platform. Extensions for SMP Architectures ================================ -Each CPU (core) may own a dedicated system heap. The memory assigned for +Each CPU (core) might own a dedicated system heap. The memory assigned for system heaps is distributed asymmetrically on CAVS platforms: a large heap for the primary core (#0) and smaller ones for other cores (#1+). From 17afef4f8e942fd7d04d02fee7b559a5af157d54 Mon Sep 17 00:00:00 2001 From: Allen-kh Cheng Date: Tue, 5 Oct 2021 13:48:01 +0800 Subject: [PATCH 123/290] Add mt8195 mediatek platform information to the table. Add mt8195 mediatek platform information to the table. Included clock, memory and audio controller instances to the table Signed-off-by: YC Hung Signed-off-by: Allen-KH Cheng --- platforms/index.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/platforms/index.rst b/platforms/index.rst index 9a5edafb..067c4433 100644 --- a/platforms/index.rst +++ b/platforms/index.rst @@ -26,6 +26,7 @@ Platform and board specific support is continually added to the SOF project as d "NXP i.MX8/i.MX8X", "Xtensa HiFi4", "1 @ 666MHz", "64 KB TCM / 448 KB OCRAM / 8MB SDRAM", "1 x ESAI, 1 x SAI" "NXP i.MX8M", "Xtensa HiFi4", "1 @ 800MHz", "64 KB TCM / 256 KB OCRAM / 8MB SDRAM", "1 x SAI, MICFIL" "AMD Renoir", "Xtensa HiFi3", "1 @ 600MHz", "20 KB LP SRAM / 1152 KB IRAM/DRAM", "1 x SP (I2S, PCM), 1 x BT (I2S, PCM), DMIC" + "Mediatek mt8195", "Xtensa HiFi4", "1 @ 220 - 720MHz", "256 KB SRAM / 16 MB DRAM", "2 x TDM Out, 1 x TDM In, DMIC" When support for a new platform is being added, certain interfaces required by SOF infrastructure must be implemented. Refer to Platform API documentation From 9999a68027d59fdc36ef0d6829261f633f449b35 Mon Sep 17 00:00:00 2001 From: Daniel Baluta Date: Tue, 7 Sep 2021 11:10:23 +0300 Subject: [PATCH 124/290] platforms: Fix DSP frequency for i.MX8X HIFI4 DSP on i.MX8X is clocked at 640Mhz. Fix documentation to reflect this. Signed-off-by: Daniel Baluta --- platforms/index.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platforms/index.rst b/platforms/index.rst index 067c4433..2894e3f8 100644 --- a/platforms/index.rst +++ b/platforms/index.rst @@ -23,7 +23,8 @@ Platform and board specific support is continually added to the SOF project as d "Intel Icelake", "Xtensa HiFi3", "4 @ 120 - 400MHz", "64KB LP SRAM / 3008KB HP SRAM", "6 x SSP (I2S, PCM), HDA, DMIC, Soundwire" "Intel Jasperlake", "Xtensa HiFi3", "2 @ 120 - 400MHz", "64KB LP SRAM / 1024KB HP SRAM", "3 x SSP (I2S, PCM), HDA, DMIC, Soundwire" "Intel Tigerlake", "Xtensa HiFi3", "4 @ 120 - 400MHz", "64KB LP SRAM / 2944KB HP SRAM", "6 x SSP (I2S, PCM), HDA, DMIC, Soundwire" - "NXP i.MX8/i.MX8X", "Xtensa HiFi4", "1 @ 666MHz", "64 KB TCM / 448 KB OCRAM / 8MB SDRAM", "1 x ESAI, 1 x SAI" + "NXP i.MX8", "Xtensa HiFi4", "1 @ 666MHz", "64 KB TCM / 448 KB OCRAM / 8MB SDRAM", "1 x ESAI, 1 x SAI" + "NXP i.MX8X", "Xtensa HiFi4", "1 @ 640MHz", "64 KB TCM / 448 KB OCRAM / 8MB SDRAM", "1 x ESAI, 1 x SAI" "NXP i.MX8M", "Xtensa HiFi4", "1 @ 800MHz", "64 KB TCM / 256 KB OCRAM / 8MB SDRAM", "1 x SAI, MICFIL" "AMD Renoir", "Xtensa HiFi3", "1 @ 600MHz", "20 KB LP SRAM / 1152 KB IRAM/DRAM", "1 x SP (I2S, PCM), 1 x BT (I2S, PCM), DMIC" "Mediatek mt8195", "Xtensa HiFi4", "1 @ 220 - 720MHz", "256 KB SRAM / 16 MB DRAM", "2 x TDM Out, 1 x TDM In, DMIC" From d3218a5ffb604aad06f6236c28367b51d3811f3b Mon Sep 17 00:00:00 2001 From: Daniel Baluta Date: Tue, 7 Sep 2021 11:58:54 +0300 Subject: [PATCH 125/290] platforms: Add i.MX8ULP to the platforms list Signed-off-by: Daniel Baluta --- platforms/index.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/platforms/index.rst b/platforms/index.rst index 2894e3f8..7f2c51f0 100644 --- a/platforms/index.rst +++ b/platforms/index.rst @@ -26,6 +26,7 @@ Platform and board specific support is continually added to the SOF project as d "NXP i.MX8", "Xtensa HiFi4", "1 @ 666MHz", "64 KB TCM / 448 KB OCRAM / 8MB SDRAM", "1 x ESAI, 1 x SAI" "NXP i.MX8X", "Xtensa HiFi4", "1 @ 640MHz", "64 KB TCM / 448 KB OCRAM / 8MB SDRAM", "1 x ESAI, 1 x SAI" "NXP i.MX8M", "Xtensa HiFi4", "1 @ 800MHz", "64 KB TCM / 256 KB OCRAM / 8MB SDRAM", "1 x SAI, MICFIL" + "NXP i.MX8ULP", "Xtensa HiFi4", "1 @ 520MHz", "64 KB TCM / 256 KB OCRAM / 8MB SDRAM", "1 x SAI" "AMD Renoir", "Xtensa HiFi3", "1 @ 600MHz", "20 KB LP SRAM / 1152 KB IRAM/DRAM", "1 x SP (I2S, PCM), 1 x BT (I2S, PCM), DMIC" "Mediatek mt8195", "Xtensa HiFi4", "1 @ 220 - 720MHz", "256 KB SRAM / 16 MB DRAM", "2 x TDM Out, 1 x TDM In, DMIC" From 284068d2d50890b80850600d0f9dc305e3cff883 Mon Sep 17 00:00:00 2001 From: Deb Date: Tue, 5 Oct 2021 12:40:15 -0400 Subject: [PATCH 126/290] Update to v1.9 release and add @anton-intel to codeowner page Signed-off-by: Deb --- CODEOWNERS | 4 ++-- release.rst | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) mode change 100644 => 100755 CODEOWNERS diff --git a/CODEOWNERS b/CODEOWNERS old mode 100644 new mode 100755 index 613b7d64..c84f859f --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1,5 +1,5 @@ #This file identifies people who are automatically notified when Pull Requests are made for /sof-docs. #At this time, the following people are notified and are expected to review the PRs: -#Liam Girdwood (technical review) and Deb Taylor (grammatical/style review). +#Liam Girdwood (technical review), Anton Bobkov (technical/grammatical/style review), and Deb Taylor (grammatical/style review). -* @lgirdwood @deb-intel @intelkevinputnam +* @lgirdwood @anton-intel @deb-intel @intelkevinputnam diff --git a/release.rst b/release.rst index 3ffa3223..0ff6939e 100755 --- a/release.rst +++ b/release.rst @@ -26,7 +26,7 @@ kernel, and documentation. Download the source code as a zip or tar.gz file: Source and Binary Releases -------------------------- -The latest SOF release is v1.8 (June 2021). +The latest SOF release is v1.9 (October 2021). View new feature information and release downloads for the latest and previous releases on GitHub. Firmware and SDK tool source code and binary From 711e7641bf7d42bb3079a2a9c9c28d0a4e7b4db3 Mon Sep 17 00:00:00 2001 From: Anton Bobkov Date: Tue, 5 Oct 2021 17:05:24 +0300 Subject: [PATCH 127/290] Add cmake and ninja-build to the installation instructions --- contribute/process/docbuild.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contribute/process/docbuild.rst b/contribute/process/docbuild.rst index c7ccf989..43f4998b 100644 --- a/contribute/process/docbuild.rst +++ b/contribute/process/docbuild.rst @@ -131,14 +131,14 @@ Depending on your Linux version, install the following tools: .. code-block:: bash sudo apt-get install doxygen python3-pip python3-wheel make \ - default-jre graphviz + default-jre graphviz cmake ninja-build * For Fedora use: .. code-block:: bash sudo dnf install doxygen python3-pip python3-wheel make \ - java graphviz + java graphviz cmake ninja-build For either Linux environment, install the remaining python-based tools: From b6e7821c97164a365d72ec037cd34ca5bfcd8ab4 Mon Sep 17 00:00:00 2001 From: Anton Bobkov Date: Tue, 5 Oct 2021 18:14:36 +0300 Subject: [PATCH 128/290] Add Intel Alderlake to Supported Platforms --- platforms/index.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/platforms/index.rst b/platforms/index.rst index 7f2c51f0..d968bf9d 100644 --- a/platforms/index.rst +++ b/platforms/index.rst @@ -23,6 +23,7 @@ Platform and board specific support is continually added to the SOF project as d "Intel Icelake", "Xtensa HiFi3", "4 @ 120 - 400MHz", "64KB LP SRAM / 3008KB HP SRAM", "6 x SSP (I2S, PCM), HDA, DMIC, Soundwire" "Intel Jasperlake", "Xtensa HiFi3", "2 @ 120 - 400MHz", "64KB LP SRAM / 1024KB HP SRAM", "3 x SSP (I2S, PCM), HDA, DMIC, Soundwire" "Intel Tigerlake", "Xtensa HiFi3", "4 @ 120 - 400MHz", "64KB LP SRAM / 2944KB HP SRAM", "6 x SSP (I2S, PCM), HDA, DMIC, Soundwire" + "Intel Alderlake", "Xtensa HiFi3", "4 @ 120 - 400MHz", "64KB LP SRAM / 2944KB HP SRAM", "6 x SSP (I2S, PCM), HDA, DMIC, Soundwire" "NXP i.MX8", "Xtensa HiFi4", "1 @ 666MHz", "64 KB TCM / 448 KB OCRAM / 8MB SDRAM", "1 x ESAI, 1 x SAI" "NXP i.MX8X", "Xtensa HiFi4", "1 @ 640MHz", "64 KB TCM / 448 KB OCRAM / 8MB SDRAM", "1 x ESAI, 1 x SAI" "NXP i.MX8M", "Xtensa HiFi4", "1 @ 800MHz", "64 KB TCM / 256 KB OCRAM / 8MB SDRAM", "1 x SAI, MICFIL" From 8838ad093b8d6e97914024baa863ab884648ae84 Mon Sep 17 00:00:00 2001 From: Anton Bobkov Date: Tue, 5 Oct 2021 14:11:27 +0300 Subject: [PATCH 129/290] Edit the topic Build SOF from scratch --- .../build-guide/build-from-scratch.rst | 121 +++++++++++------- 1 file changed, 75 insertions(+), 46 deletions(-) diff --git a/getting_started/build-guide/build-from-scratch.rst b/getting_started/build-guide/build-from-scratch.rst index 30dd538c..db44d5a9 100755 --- a/getting_started/build-guide/build-from-scratch.rst +++ b/getting_started/build-guide/build-from-scratch.rst @@ -12,9 +12,6 @@ Intel platforms include: |BYT|, |CHT|, |HSW|, |BDW|, |APL|, |CNL|, |ICL|, |JSL|, Support also exists for NXP i.MX8/i.MX8X/i.MX8M platforms. -Build SOF -********* - The following steps describe how to install the SOF development environment on Ubuntu 16.04, 18.04, 18.10, and 20.04. They should work on 19.04, 19.10 and other Linux distributions with minor or no @@ -22,30 +19,34 @@ modifications. .. note:: - Point the ``$SOF_WORKSPACE`` environment variable to the directory in - which you store all sof work. + Building |SOF| from scratch might take several hours. We recommend + that you use Docker to build SOF. For more information, see + :ref:`build-with-docker`. - The code examples assume ``$SOF_WORKSPACE`` is the top-level working - directory. Clone all git repositories at the same directory level - because some default configuration files refer to other clones using - relative locations like ``../sof/``. +Step 1. Set up the workspace directory +************************************** - Make sure that ``$SOF_WORKSPACE`` has adequate disk space when building - the toolchain. About 15GB is needed per toolchain. +Point the ``$SOF_WORKSPACE`` environment variable to the directory in +which you store all sof work. -Step 0 Set up the workspace directory -===================================== +The code examples assume ``$SOF_WORKSPACE`` is the top-level working +directory. Clone all git repositories at the same directory level +because some default configuration files refer to other clones using +relative locations like ``../sof/``. + +Make sure that ``$SOF_WORKSPACE`` has adequate disk space when building +the toolchain. About 15GB is needed per toolchain. .. code-block:: bash SOF_WORKSPACE=~/work/sof mkdir -p "$SOF_WORKSPACE" -Step 1 Set up build environment -=============================== +Step 2. Set up build environment +******************************** -Install packaged dependencies ------------------------------ +Install package dependencies +============================ .. note:: This guide uses Ubuntu as an example but any modern distribution can be @@ -67,7 +68,8 @@ Make sure that ``build-essential`` and ``git`` are installed: .. code-block:: bash sudo apt install autoconf flex bison texinfo help2man gawk libtool-bin \ - libncurses5 libncurses5-dev libssl-dev libgtk-3-dev tree ninja + libncurses5 libncurses5-dev libssl-dev libgtk-3-dev tree \ + ninja-build gettext libasound2-dev * For Ubuntu 18.10: @@ -100,7 +102,7 @@ in order for the Advanced Linux Sound Architecture (ALSA) to build. sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 70 --slave /usr/bin/g++ g++ /usr/bin/g++-7 Install CMake -------------- +============= If you use Ubuntu 18.04+ you can install CMake with apt: @@ -112,7 +114,7 @@ For Ubuntu 16.04, CMake from apt is outdated and you must install CMake from sources. Refer to this short guide: https://cmake.org/install/. Build alsa-lib and alsa-utils ------------------------------ +============================= This project requires some new features in :git-alsa:`alsa-lib` and :git-alsa:`alsa-utils`, so build the newest ALSA from source code. @@ -129,7 +131,10 @@ This project requires some new features in :git-alsa:`alsa-lib` and cd "$SOF_WORKSPACE" git clone git://git.alsa-project.org/alsa-lib cd alsa-lib + # To install alsa-lib systemwide ./gitcompile + # To install alsa-lib locally + ./gitcompile --prefix=$HOME/local sudo make install (Optional) To enable alsabat's frequency analysis, install the FFT library @@ -146,7 +151,12 @@ Clone, build, and install alsa-utils. cd "$SOF_WORKSPACE" git clone git://git.alsa-project.org/alsa-utils cd alsa-utils + # To install alsa-utils systemwide ./gitcompile + # To install alsa-utils locally + ./gitcompile --prefix=$HOME/local \ + --with-alsa-inc-prefix=$HOME/local/include \ + --with-alsa-prefix=$HOME/local/lib sudo make install If you run into alsa-lib linking errors, try to re-build it with the libdir @@ -174,8 +184,8 @@ Create or append to the ``LD_LIBRARY_PATH`` environment variable. .. _build-toolchains-from-source: -Step 2 Build toolchains from source -=================================== +Step 3. Build toolchains from source +************************************ Build the xtensa cross-compilation toolchains with crosstool-ng for Intel |BYT|, |CHT|, |HSW|, |BDW|, |APL|, |CNL|, |ICL|, |JSL|, |TGL| @@ -186,7 +196,7 @@ the Docker image. For more details go to https://crosstool-ng.github.io/ crosstool-ng ------------- +============ Clone both repos and check out the ``sof-gcc10.2`` and ``sof-gcc10x`` branch. @@ -210,7 +220,7 @@ Build crosstool-ng and install it in its own source directory. make install Toolchains ----------- +========== The config files provided refer to ``../xtensa-overlay/`` and point at different ``./builds/xtensa-*-elf`` subdirectories. Copy the ones you @@ -220,6 +230,8 @@ download gcc components. .. code-block:: bash + unset LD_LIBRARY_PATH + # Baytrail/Cherrytrail cp config-byt-gcc10.2-gdb9 .config ./ct-ng build @@ -256,6 +268,7 @@ to build all toolchains without interruption: .. code-block:: bash + unset LD_LIBRARY_PATH; time for i in config*gcc10.2-gdb9; do cp "$i" .config && ./ct-ng build || break ; done @@ -275,7 +288,7 @@ Remove the temporary build files (~7GB per toolchain): .. code-block:: bash - rm -rf .build + rm -rf $SOF_WORKSPACE/crosstool-ng/.build .. note:: @@ -289,7 +302,7 @@ Remove the temporary build files (~7GB per toolchain): Additional headers ------------------- +================== To get some required headers, clone the following newlib repository and switch to the `xtensa` branch. @@ -333,8 +346,8 @@ This should take a few minutes. The required headers are now in ``"$SOF_WORKSPACE"/xtensa-root``, and cross-compilation toolchains for xtensa DSPs are set up. -Step 3 Build and sign firmware binaries -======================================= +Step 4. Build and sign firmware binaries +**************************************** After the SOF environment is set up, clone the *sof* repo: @@ -347,7 +360,7 @@ After the SOF environment is set up, clone the *sof* repo: Copy the commented ``installer/sample-config.mk`` to ``installer/config.mk``, then select a list of platforms and provide an -optional target hostname in the latter file. Then run: +optional target hostname in the latter file. Then run the installer: .. code-block:: bash @@ -365,9 +378,21 @@ can skip the next two sections. The installer also builds and deploys some user-space binaries from the ``sof/tools/`` subdirectory. +.. note:: + + If interrupted, the installer process might leave corrupted files + in the ``installer-builds`` subdirectory. In this case, all + subsequent attempts to run the installer end with an error. To + resolve this issue, delete the ``installer-builds`` directory and + run the installer again. + + .. code-block:: bash + + rm -rf $SOF_WORKSPACE/sof/installer-builds + make -C installer/ Re-configure and rebuild from scratch -------------------------------------- +===================================== To rebuild |SOF| from scratch, the installer Makefile above relies on the :git-sof-mainline:`scripts/xtensa-build-all.sh` script. If you need @@ -417,7 +442,7 @@ builds with -r and speed up the build with -j [n] The same export mechanism should work also when building with Docker. Incremental builds ------------------- +================== This is a more detailed build guide for the *sof* repo. Unlike ``xtensa-build-all.sh``, this doesn't rebuild everything every time. The @@ -472,7 +497,7 @@ matching each platform in the same script or above. Firmware build results ----------------------- +====================== The firmware binary files are located in build_/src/arch/xtensa/. The installer copies them to your target machine's ``/lib/firmware/intel/sof`` @@ -483,14 +508,14 @@ folder. sof-apl.ri sof-bdw.ri sof-byt.ri sof-cht.ri sof-cnl.ri sof-hsw.ri -Step 4 Build topology and tools -=============================== +Step 5. Build topology and tools +******************************** You can probably skip this section if you use the firmware installer in the previous section. One-step rebuild from scratch ------------------------------ +============================= Without any argument :git-sof-mainline:`scripts/build-tools.sh` builds the default CMake target "ALL" of :git-sof-mainline:`tools/`. @@ -499,13 +524,15 @@ the default CMake target "ALL" of :git-sof-mainline:`tools/`. cd "$SOF_WORKSPACE"/sof/ ./scripts/build-tools.sh + +To see the list of options, run :git-sof-mainline:`scripts/build-tools.sh` with the ``-h`` option. + +.. code-block:: bash + ./scripts/build-tools.sh -h - usage: ./scripts/build-tools.sh [-t|-f] - [-t] Build test topologies - [-f] Build fuzzer" Incremental build ------------------ +================= .. code-block:: bash @@ -523,7 +550,7 @@ If your ``cmake --version`` is 3.13 or higher, you may prefer the new -B option: rm -rf build_tools/ # no need to change directory ever Topology and tools build results --------------------------------- +================================ The topology files are located in the *tools/build_tools/topology* folder. The installer Makefile copies them to the target machine's @@ -534,8 +561,8 @@ installer Makefile copies them to the target directory of your choice. .. _Build Linux kernel: -Build Linux kernel -****************** +Step 6. Build Linux kernel +************************** |SOF| uses the Linux kernel dev branch, and it must work with other dev branch firmware and topology. This short section shows how to build @@ -558,9 +585,11 @@ the kconfig repo, and the :ref:`sof_driver_arch`. make defconfig git clone https://github.com/thesofproject/kconfig scripts/kconfig/merge_config.sh .config ./kconfig/base-defconfig ./kconfig/sof-defconfig ./kconfig/mach-driver-defconfig ./kconfig/hdaudio-codecs-defconfig - (optional) make menuconfig - Select the SOF driver support and disable SST drivers. + Optionally, you can also run ``make menuconfig``, navigate to + Device Drivers > Sound card support > Advanced Linux Sound + Architecture, and select the **Prefer SOF driver over SST on BY/CHT + platforms** option. #. Make the kernel deb package to install on the target machine. @@ -568,8 +597,8 @@ the kconfig repo, and the :ref:`sof_driver_arch`. make deb-pkg -j 4 -#. Copy the three resulting *.deb* files to the target machine and install - them. +#. Copy the three resulting *.deb* files from $SOF_WORKSPACE to the + target machine and install them. .. code-block:: bash From 8f9eef02dd031426e6ae2c74271690fe683b0b62 Mon Sep 17 00:00:00 2001 From: Anton Bobkov Date: Tue, 12 Oct 2021 14:24:10 +0300 Subject: [PATCH 130/290] Responding to comments --- .../build-guide/build-from-scratch.rst | 31 ++++++++++--------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/getting_started/build-guide/build-from-scratch.rst b/getting_started/build-guide/build-from-scratch.rst index db44d5a9..5b59cafe 100755 --- a/getting_started/build-guide/build-from-scratch.rst +++ b/getting_started/build-guide/build-from-scratch.rst @@ -1,7 +1,7 @@ .. _build-from-scratch: -Build SOF from scratch -###################### +Build toolchains and SOF from sources +##################################### .. contents:: :local: @@ -19,9 +19,9 @@ modifications. .. note:: - Building |SOF| from scratch might take several hours. We recommend - that you use Docker to build SOF. For more information, see - :ref:`build-with-docker`. + Building the toolchains from source might take several hours. We + recommend that you use Docker to build SOF. For more information, + see :ref:`build-with-docker`. Step 1. Set up the workspace directory ************************************** @@ -34,8 +34,9 @@ directory. Clone all git repositories at the same directory level because some default configuration files refer to other clones using relative locations like ``../sof/``. -Make sure that ``$SOF_WORKSPACE`` has adequate disk space when building -the toolchain. About 15GB is needed per toolchain. +Make sure that ``$SOF_WORKSPACE`` has adequate disk space when +building the toolchain. About 15GB is needed per toolchain. You can +reclaim some of the disk space after building the toolchain. .. code-block:: bash @@ -113,8 +114,8 @@ If you use Ubuntu 18.04+ you can install CMake with apt: For Ubuntu 16.04, CMake from apt is outdated and you must install CMake from sources. Refer to this short guide: https://cmake.org/install/. -Build alsa-lib and alsa-utils -============================= +Build alsa-lib and alsa-utils from source +========================================= This project requires some new features in :git-alsa:`alsa-lib` and :git-alsa:`alsa-utils`, so build the newest ALSA from source code. @@ -380,11 +381,13 @@ The installer also builds and deploys some user-space binaries from the .. note:: - If interrupted, the installer process might leave corrupted files - in the ``installer-builds`` subdirectory. In this case, all - subsequent attempts to run the installer end with an error. To - resolve this issue, delete the ``installer-builds`` directory and - run the installer again. + The installer is much faster than the lower level ``./scripts/``, + on which it relies, because it does not delete the build + directories every time it runs. However, some "big" configuration + changes, such as switching to a different toolchain or some rare + build failures, can leave the ``installer-builds/build_*`` + directories in an inappropriate state. In such a case, just delete + these directories and run the installer again. .. code-block:: bash From 0f8a032dba1c8247ee45196a98443982cb38acfe Mon Sep 17 00:00:00 2001 From: Anton Bobkov Date: Mon, 25 Oct 2021 20:13:21 +0300 Subject: [PATCH 131/290] Add a global site tag from Linux Foundation for Google Analytics --- conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf.py b/conf.py index baa67501..574a1455 100755 --- a/conf.py +++ b/conf.py @@ -119,7 +119,7 @@ html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] html_theme_options = { 'canonical_url': '', - 'analytics_id': '', + 'analytics_id': 'GTM-M4BL5NF', 'logo_only': False, 'display_version': True, 'prev_next_buttons_location': 'None', From 9426615376d6c33e577181d0830d570b6dca8a55 Mon Sep 17 00:00:00 2001 From: Marc Herbert Date: Fri, 29 Oct 2021 22:58:50 +0000 Subject: [PATCH 132/290] ktest: add Fedora / grubby instructions Tested with Fedora version 33 Signed-off-by: Marc Herbert --- .../setup/setup_ktest_environment.rst | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/getting_started/setup/setup_ktest_environment.rst b/getting_started/setup/setup_ktest_environment.rst index 8a85d8c2..41ed55b1 100644 --- a/getting_started/setup/setup_ktest_environment.rst +++ b/getting_started/setup/setup_ktest_environment.rst @@ -125,6 +125,15 @@ mess up what the numbers below point to! => saved_entry=4 +Fedora and derived distributions have a more elaborate system to manage +"installed" kernels. Instead of extracting ``menuentry`` lines from +``/boot/grub/grub.cfg`` with the ``awk`` command above, to list all +installed kernels use: ``grubby --info=ALL``. + +After copying it to ``/boot``/, "install" a new kernel with: +``grubby --add-kernel /boot/vmlinuz-softest --title=softest``. Check +``grubby``'s documentation for more details. + 6. Install openssh-server ------------------------- @@ -312,10 +321,21 @@ Save the following in sof-dev.conf. #REBOOT_SCRIPT = ssh $SSH_USER@$MACHINE "sed -i 's|^default.*$|default test|' /boot/loader/loader.conf" TEST_START + # TEST_TYPE can be: build, install, boot, ... TEST_TYPE = boot BUILD_TYPE = useconfig:${THIS_DIR}/sof-dev-defconfig BUILD_NOCLEAN = 1 + +For Fedora and derived distributions, make the following changes: + +.. code-block:: perl + + GRUB_MENU = "title" of the kernel entry as displayed by: 'grubby --info=ALL' + GRUB_REBOOT = grub2-reboot + REBOOT_TYPE = grub2bls + POST_INSTALL = ssh -o 'ProxyCommand none' $SSH_USER@$MACHINE sudo dracut --hostonly --force --kver ${LOCALVERSION} + 7. Build and test ----------------- From 65d9f9a8c7c46d163c92d17a8648f81ec341c17f Mon Sep 17 00:00:00 2001 From: Anton Bobkov Date: Wed, 29 Sep 2021 17:19:49 +0300 Subject: [PATCH 133/290] Edit the topic so it looks like a task. Minor corrections to commands and links. --- .../build-guide/build-from-scratch.rst | 3 + .../build-guide/build-with-docker.rst | 199 +++++++++--------- 2 files changed, 98 insertions(+), 104 deletions(-) diff --git a/getting_started/build-guide/build-from-scratch.rst b/getting_started/build-guide/build-from-scratch.rst index 5b59cafe..286d4f4f 100755 --- a/getting_started/build-guide/build-from-scratch.rst +++ b/getting_started/build-guide/build-from-scratch.rst @@ -347,6 +347,8 @@ This should take a few minutes. The required headers are now in ``"$SOF_WORKSPACE"/xtensa-root``, and cross-compilation toolchains for xtensa DSPs are set up. +.. _build-and-sign-firmware-binaries-from-scratch: + Step 4. Build and sign firmware binaries **************************************** @@ -510,6 +512,7 @@ folder. sof-apl.ri sof-bdw.ri sof-byt.ri sof-cht.ri sof-cnl.ri sof-hsw.ri +.. _build-topology-and-tools-from-scratch: Step 5. Build topology and tools ******************************** diff --git a/getting_started/build-guide/build-with-docker.rst b/getting_started/build-guide/build-with-docker.rst index 3dc49fdd..0eaa701c 100644 --- a/getting_started/build-guide/build-with-docker.rst +++ b/getting_started/build-guide/build-with-docker.rst @@ -10,123 +10,113 @@ Build SOF with Docker This guide will show you how to use a Docker image containing the |SOF| build environment. -.. note:: - - The example uses ``$SOF_WORKSPACE`` as the working directory. - Set up the workspace directory ****************************** - .. code-block:: bash +1. Point the ``$SOF_WORKSPACE`` environment variable to the directory + in which you store all SOF work. - SOF_WORKSPACE=~/work/sof - mkdir "$SOF_WORKSPACE" + .. code-block:: bash -Clone the *sof* repo. + SOF_WORKSPACE=~/work/sof + mkdir -p "$SOF_WORKSPACE" -.. code-block:: bash +#. Clone the SOF repository. + + .. code-block:: bash - cd "$SOF_WORKSPACE" - git clone --recurse-submodules https://github.com/thesofproject/sof.git + cd "$SOF_WORKSPACE" + git clone --recurse-submodules https://github.com/thesofproject/sof.git Set up Docker ************* -Docker is a popular container management framework. To install on Ubuntu, -visit `Get Docker CE for Ubuntu `__. +Docker is a popular container management framework. To install Docker and get the Docker image with the SOF build environment: -Installation instructions for other Linux distributions: `About Docker CE `__. +1. Install Docker. -Set Proxy -========= + For information on how to install Docker on Ubuntu, visit `Install + Docker Engine on Ubuntu + `__. -Docker must be configured if used behind a proxy. -Visit `HTTP/HTTPS proxy `__ for the guide. + For information on how to install Docker on other Linux + distributions, visit `Install Docker Engine + `__. -Set user group -============== +#. Optionally, configure Docker to run under a proxy. -To use Docker without ``sudo`` follow these post-install steps. -`Post-installation steps for Linux `__ + For more information about configuring Docker to use a proxy, visit + `HTTP/HTTPS proxy + `__. -Get Docker image -================ +#. To use Docker without ``sudo``, add your user to the `docker` group. -To easily build SOF binaries, we need a Docker image containing all -of the cross-compiler and build environment dependencies. We can either -build a Docker image from a DockerFile or pull an image binary from -Docker Hub. + For more information, visit + `Post-installation steps for Linux `__. -.. note:: - - Building the container from DockerFile will take more than 2 hours, - so we recommend using the pre-built image. +#. Get a Docker image with the SOF build environment. -Pull Docker image ------------------ + To easily build SOF binaries, we need a Docker image containing all + of the cross-compiler and build environment dependencies. We can + either build a Docker image from a DockerFile or pull an image + binary from Docker Hub. -Pull the docker image from Docker Hub. + .. note:: -.. code-block:: bash - - docker pull thesofproject/sof - -.. note:: - - Since there is not yet an offical |SOF| presence on Dockerhub, the - image is hosted in a personal Docker Hub repo until the - official image can go live. + Building the container from DockerFile will take more than 2 hours, + so we recommend using the pre-built image. -Retag the image with `sof` for scripts. + - Pull the Docker image from Docker Hub and retag the image with `sof` for scripts: -.. code-block:: bash + .. code-block:: bash - docker tag thesofproject/sof sof + docker pull thesofproject/sof + docker tag thesofproject/sof sof + .. note:: -Build Docker image ------------------- + Since there is not yet an offical |SOF| presence on + Dockerhub, the image is hosted in a personal Docker Hub repo + until the official image can go live. -Run the Docker build from the `sof` repo. + - Build a Docker image: -.. code-block:: bash + Run the Docker build from the SOF repository. - cd "${SOF_WORKSPACE}"/sof/scripts/docker_build/sof_qemu - ./docker-build.sh - cd "${SOF_WORKSPACE}"/sof/scripts/docker_build/sof_builder - ./docker-build.sh + .. code-block:: bash -After building the Docker image you will see: + cd "${SOF_WORKSPACE}"/sof/scripts/docker_build/sof_qemu + ./docker-build.sh + cd "${SOF_WORKSPACE}"/sof/scripts/docker_build/sof_builder + ./docker-build.sh -.. code-block:: bash + Verify that the docker image is built successfully. - docker images - #REPOSITORY TAG IMAGE ID CREATED SIZE - #sof latest c8b0e8913fcb 2 days ago 1.46 GB + .. code-block:: bash -Build with Docker -***************** + docker images + + #REPOSITORY TAG IMAGE ID CREATED SIZE + #sof latest c8b0e8913fcb 2 days ago 1.46 GB -Build firmware binaries -======================= +Build firmware binaries with Docker +*********************************** Build with scripts ------------------- +================== -Build the SOF binaries: +To build the SOF binaries for all platforms: .. code-block:: bash cd "${SOF_WORKSPACE}"/sof/ - ./scripts/docker-run.sh ./scripts/xtensa-build-all.sh - -.. note:: + ./scripts/docker-run.sh ./scripts/xtensa-build-all.sh -a - ./scripts/docker-run.sh will mount the *sof* and directories - into Docker container and build them inside the container. The build - result can be accessed outside the container after the build. +``./scripts/docker-run.sh`` mounts the *sof* and directories into the +Docker container and builds them inside the container. You can access +the build result outside the container after the build. -Build one or more platform binaries. +To build the SOF binaries for one or more platforms: .. code-block:: bash @@ -137,22 +127,25 @@ Build one or more platform binaries. ./scripts/docker-run.sh ./scripts/xtensa-build-all.sh byt apl Build inside container ----------------------- +====================== -Enter the container bash. +1. Enter the container bash: -.. code-block:: bash + .. code-block:: bash - cd "${SOF_WORKSPACE}"/sof/ - ./scripts/docker-run.sh bash + cd "${SOF_WORKSPACE}"/sof/ + ./scripts/docker-run.sh bash -From inside the container, follow the manual configuration and build steps. +#. From inside the container, follow the manual configuration and build + steps. For more information, see + :ref:`build-and-sign-firmware-binaries-from-scratch`. Firmware build results ----------------------- +====================== -The firmware binary files are located in src/arch/xtensa/. Copy them to -your target machine's /lib/firmware/intel/sof folder. +The firmware binary files are located in the +``build_/src/arch/xtensa/`` directory. Copy them to the +``/lib/firmware/intel/sof`` directory on the target machine. .. code-block:: bash @@ -160,13 +153,13 @@ your target machine's /lib/firmware/intel/sof folder. .. _docker-topology-tools: -Build topology and tools -======================== +Build topology and tools with Docker +************************************ Build with scripts ------------------- +================== -Build the *sof* tools and topology files. +Build the SOF tools and topology files. .. code-block:: bash @@ -174,28 +167,26 @@ Build the *sof* tools and topology files. ./scripts/docker-run.sh ./scripts/build-tools.sh Build inside container ----------------------- - -Enter the container bash. +====================== -.. code-block:: bash - - cd "${SOF_WORKSPACE}"/sof/ - ./scripts/docker-run.sh bash - -From inside the container: - -.. code-block:: bash +1. Enter the container bash: - cd tools + .. code-block:: bash + + cd "${SOF_WORKSPACE}"/sof/ + ./scripts/docker-run.sh bash -and follow the manual configuration and build steps. +2. From inside the container, change to the ``tools`` directory and + follow the manual configuration and build steps. For more + information, see :ref:`build-topology-and-tools-from-scratch`. Topology and tools build results --------------------------------- +================================ -The topology files are all in the topology folder ("${SOF_WORKSPACE}"/sof/tools/build_tools/topology). Copy them to the target -machine's /lib/firmware/intel/sof-tplg folder. +The topology files are located in the +``"$SOF_WORKSPACE"/sof/tools/build_tools/topology`` folder. Copy the +files to the ``/lib/firmware/intel/sof-tplg`` directory on the target +machine. -The *sof-logger* tool is in the *tools/logger* folder. Copy it to the target machine's -/usr/bin directory. +The *sof-logger* tool is located in the ``tools/logger`` directory. Copy +it to the ``/usr/bin`` directory on the target machine. From 17ca3fefdca955e50f61578e6368764be41bf357 Mon Sep 17 00:00:00 2001 From: Kai Vehmanen Date: Wed, 10 Nov 2021 12:00:36 +0200 Subject: [PATCH 134/290] debugability: logger: add note on DMA trace limitations If sof-logger is started (or restarted) while DSP is running, the initial traces may be incomplete. Document the limitation and give a brief explanation of the current ringbuffer design and how it affects the start-up behaviour. BugLink: https://github.com/thesofproject/sof-test/issues/297 BugLink: https://github.com/thesofproject/linux/issues/3275 Signed-off-by: Kai Vehmanen --- developer_guides/debugability/logger/index.rst | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/developer_guides/debugability/logger/index.rst b/developer_guides/debugability/logger/index.rst index 692fd104..fd53b7dd 100644 --- a/developer_guides/debugability/logger/index.rst +++ b/developer_guides/debugability/logger/index.rst @@ -136,6 +136,20 @@ Examples distribution kernels ``sof_debug=1`` module option for ``snd_sof`` might be needed if the /sys/kernel/debug/sof/trace file is not present) +.. note:: + If sof-logger is started (or restarted) while firmware is active, the initial + trace messages might be incomplete. This can happen as current (as of SOF version + 1.9) trace is implemented with a ringbuffer between firmware and the kernel driver. + When sof-logger is started, kernel will always start to read the ringbuffer from + 0 position, independently of firmware state. If firmware write pointer just wrapped + around when sof-logger is started, sof-logger will only show the traces after + the wrap. Firmware write position is also reset whenever firmware is booted, + including runtime suspend and resume. To capture traces over runtime suspend + events, the kernel trace interface will signal end of file at runtime suspend. + When sof-logger notices the end of file marker, it will reopen the trace + file and start reading from position 0 and thus be in sync with the firmware + when it is resumed. + Trace filtering *************** From 07525f8cc82c19c96a5aaba19dd420e9acb30d55 Mon Sep 17 00:00:00 2001 From: Marc Herbert Date: Wed, 3 Nov 2021 01:53:31 +0000 Subject: [PATCH 135/290] intel platforms: add list of Chromebook dev. environments Add list of options to develop on Chromebooks and links - especially Zephyr's detailed Crouton guide. Signed-off-by: Marc Herbert --- getting_started/intel_debug/introduction.rst | 63 +++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) diff --git a/getting_started/intel_debug/introduction.rst b/getting_started/intel_debug/introduction.rst index 6c8559c2..f59516ad 100644 --- a/getting_started/intel_debug/introduction.rst +++ b/getting_started/intel_debug/introduction.rst @@ -137,4 +137,65 @@ drivers and should work when changing the ``dsp_driver`` parameter. The selection of firmware, topology, and UCM files is based on platform capabilities, codec names, and DMI options. While the SOF team and the community try to cover all possible cases, errors will happen when the -wrong file is selected at any of the three layers. \ No newline at end of file +wrong file is selected at any of the three layers. + +4. Chromebooks and SOF +---------------------- + +As stated above, starting from 2019/2020 Intel Chromeboooks have been +configured with the *community* key which means they can run +audio firmware signed by anyone. The entire filesystem is locked by +default instead but there are a couple options to disable security for +development purposes. In all cases the very first step is to switch the +Chromebook to (non-secure) `Developer Mode +`_. +Developer Mode is in fact the only strictly required step if you only +want to install and run your own SOF firmware and are not interested in +changing anything else in ChromeOS. + +If you need the flexibility to make more changes, Chromebooks can run +Linux in several, non-mutually exclusive ways. All the options listed +below will let you run any SOF firmware at will. One of the biggest +differences between them is how to install and run your own Linux +kernel. + +- **ChromeOS** has direct hardware access but ChromeOS development + cannot happen on ChromeOS itself, it requires a separate workstation + similar to how most embedded development typically does. Setting up + the ``cros_sdk`` is documented in the `ChromeOS developer guide + `_. + The ``cros_sdk`` is a complete environment that lets you modify + anything in ChromeOS and even build an entire system image. The + ``cros_sdk`` requires significant disk space and there is some + learning effort if you're not already familiar with Gentoo's build + system "Portage"; especially for the Linux kernel. + +- `Crostini + `_ + is a secure Linux Virtual Machine that does not have direct access to + the hardware and cannot be used for SOF (it does not require Developer + Mode). Listed here for completeness. It may be possible to use + Crostini as your pseudo-separate ``cros_sdk`` workstation but a + different, more powerful system that you never have to reboot is an + obviously much better ``cros_sdk`` option. + +- **Crouton** is a non-secure chroot that does allow direct hardware + access and can be used for SOF. It lets you install a choice of + popular Linux distributions which you can use to develop on the device + itself: make regular backups! The Zephyr project has `very detailed + specific instructions + `_ + on how to use Crouton for SOF. Most of these instructions are not + Zephyr-specific. With Crouton you can configure and compile a Linux + kernel as usual, however the kernel *installation* process is similar + to the ``cros_sdk`` process with a couple of small twists. + +- Finally, it is possible to **dual-boot** or completely replace + ChromeOS by a regular Linux distribution on *some* Chromebooks and + forget it is a Chromebook entirely. This comes at a price however: it + is the least secure option and the more likely to make your device + permanently unusable ("brick"). That level of risk is highly dependent + on your particular Chromebook model. If that does not scare you then + https://chrx.org/ is a good starting point; pay special attention to + the "note on security". This is the only option that lets you manage + kernel installations as a typical Linux distribution does. From 79572cd3be4a60175a288d0be7d4d02143bb924f Mon Sep 17 00:00:00 2001 From: anton-intel Date: Tue, 16 Nov 2021 18:35:55 +0300 Subject: [PATCH 136/290] Minor grammar and style changes (#383) --- getting_started/intel_debug/introduction.rst | 63 ++++++++++---------- 1 file changed, 32 insertions(+), 31 deletions(-) diff --git a/getting_started/intel_debug/introduction.rst b/getting_started/intel_debug/introduction.rst index f59516ad..9c0e8c4f 100644 --- a/getting_started/intel_debug/introduction.rst +++ b/getting_started/intel_debug/introduction.rst @@ -142,60 +142,61 @@ wrong file is selected at any of the three layers. 4. Chromebooks and SOF ---------------------- -As stated above, starting from 2019/2020 Intel Chromeboooks have been -configured with the *community* key which means they can run +As stated above, starting from 2019/2020, Intel Chromeboooks have been +configured with the *community* key. It means that Chromebooks can run audio firmware signed by anyone. The entire filesystem is locked by -default instead but there are a couple options to disable security for -development purposes. In all cases the very first step is to switch the +default instead, but there are several options to disable security for +development purposes. In all cases the first step is to switch the Chromebook to (non-secure) `Developer Mode `_. -Developer Mode is in fact the only strictly required step if you only +Developer Mode is the only required step if you only want to install and run your own SOF firmware and are not interested in -changing anything else in ChromeOS. +changing anything else in Chrome OS. If you need the flexibility to make more changes, Chromebooks can run -Linux in several, non-mutually exclusive ways. All the options listed -below will let you run any SOF firmware at will. One of the biggest +Linux in several non-mutually exclusive ways. All the options listed +below let you run any SOF firmware. One of the biggest differences between them is how to install and run your own Linux kernel. -- **ChromeOS** has direct hardware access but ChromeOS development - cannot happen on ChromeOS itself, it requires a separate workstation - similar to how most embedded development typically does. Setting up - the ``cros_sdk`` is documented in the `ChromeOS developer guide +- **Chrome OS** has direct hardware access, but Chrome OS development + cannot happen on Chrome OS itself. It requires a separate workstation + similar to how most embedded development typically does. For + information about setting up the ``cros_sdk``, see the `Chromium OS + Developer Guide `_. The ``cros_sdk`` is a complete environment that lets you modify - anything in ChromeOS and even build an entire system image. The - ``cros_sdk`` requires significant disk space and there is some - learning effort if you're not already familiar with Gentoo's build - system "Portage"; especially for the Linux kernel. + anything in Chrome OS and even build an entire system image. The + ``cros_sdk`` requires significant disk space and some learning + effort if you are not already familiar with Portage, a package + management system in Gentoo, and Linux kernel build process. - `Crostini `_ - is a secure Linux Virtual Machine that does not have direct access to - the hardware and cannot be used for SOF (it does not require Developer - Mode). Listed here for completeness. It may be possible to use - Crostini as your pseudo-separate ``cros_sdk`` workstation but a - different, more powerful system that you never have to reboot is an - obviously much better ``cros_sdk`` option. + is a secure Linux Virtual Machine that does not have direct access + to the hardware and cannot be used for SOF. It does not require + Developer Mode. Crostini is listed here for completeness. You might + use Crostini as your pseudo-separate ``cros_sdk`` workstation, but a + different, more powerful system that you never have to reboot is a + much better ``cros_sdk`` option. - **Crouton** is a non-secure chroot that does allow direct hardware access and can be used for SOF. It lets you install a choice of - popular Linux distributions which you can use to develop on the device - itself: make regular backups! The Zephyr project has `very detailed + popular Linux distributions, which you can use for development on the device + itself. Make regular backups! The Zephyr project has `very detailed specific instructions `_ on how to use Crouton for SOF. Most of these instructions are not - Zephyr-specific. With Crouton you can configure and compile a Linux - kernel as usual, however the kernel *installation* process is similar + Zephyr-specific. With Crouton, you can configure and compile a Linux + kernel as usual. However, the kernel *installation* process is similar to the ``cros_sdk`` process with a couple of small twists. - Finally, it is possible to **dual-boot** or completely replace - ChromeOS by a regular Linux distribution on *some* Chromebooks and - forget it is a Chromebook entirely. This comes at a price however: it + Chrome OS with a regular Linux distribution on *some* Chromebooks and + forget it is a Chromebook entirely. However, this comes at a price: it is the least secure option and the more likely to make your device permanently unusable ("brick"). That level of risk is highly dependent - on your particular Chromebook model. If that does not scare you then - https://chrx.org/ is a good starting point; pay special attention to - the "note on security". This is the only option that lets you manage + on your particular Chromebook model. If that does not scare you, then + https://chrx.org/ is a good starting point. Pay special attention to + the note on security. This is the only option that lets you manage kernel installations as a typical Linux distribution does. From 21d402762f30dd818e2a413fae7902c582651680 Mon Sep 17 00:00:00 2001 From: Greg Date: Fri, 19 Nov 2021 11:04:15 -0800 Subject: [PATCH 137/290] Update CODEOWNERS --- CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CODEOWNERS b/CODEOWNERS index c84f859f..86c19cad 100755 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -2,4 +2,4 @@ #At this time, the following people are notified and are expected to review the PRs: #Liam Girdwood (technical review), Anton Bobkov (technical/grammatical/style review), and Deb Taylor (grammatical/style review). -* @lgirdwood @anton-intel @deb-intel @intelkevinputnam +* @lgirdwood @anton-intel @deb-intel @intelkevinputnam @greg-intel From 35576c54fbac1dcb56a75b4eb588f9d767e81820 Mon Sep 17 00:00:00 2001 From: anton-intel Date: Wed, 24 Nov 2021 19:34:44 +0300 Subject: [PATCH 138/290] Correction: intel_debug introductions (#387) --- getting_started/intel_debug/introduction.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/getting_started/intel_debug/introduction.rst b/getting_started/intel_debug/introduction.rst index 9c0e8c4f..7260602b 100644 --- a/getting_started/intel_debug/introduction.rst +++ b/getting_started/intel_debug/introduction.rst @@ -168,8 +168,8 @@ kernel. The ``cros_sdk`` is a complete environment that lets you modify anything in Chrome OS and even build an entire system image. The ``cros_sdk`` requires significant disk space and some learning - effort if you are not already familiar with Portage, a package - management system in Gentoo, and Linux kernel build process. + effort if you are not already familiar with Portage, a build system + in Gentoo, and especially with building the Linux kernel in Portage. - `Crostini `_ From d0c6afd06fc1827bc56afe5339f8ad523e61cf77 Mon Sep 17 00:00:00 2001 From: Anton Bobkov Date: Tue, 23 Nov 2021 16:44:44 +0300 Subject: [PATCH 139/290] Make the user choice between the Docker build options clearer --- .../build-guide/build-with-docker.rst | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/getting_started/build-guide/build-with-docker.rst b/getting_started/build-guide/build-with-docker.rst index 0eaa701c..62831f71 100644 --- a/getting_started/build-guide/build-with-docker.rst +++ b/getting_started/build-guide/build-with-docker.rst @@ -57,16 +57,10 @@ Docker is a popular container management framework. To install Docker and get th #. Get a Docker image with the SOF build environment. To easily build SOF binaries, we need a Docker image containing all - of the cross-compiler and build environment dependencies. We can - either build a Docker image from a DockerFile or pull an image - binary from Docker Hub. + of the cross-compiler and build environment dependencies. Get the + Docker image by using one of the following options: - .. note:: - - Building the container from DockerFile will take more than 2 hours, - so we recommend using the pre-built image. - - - Pull the Docker image from Docker Hub and retag the image with `sof` for scripts: + - Option 1. Pull the Docker image from Docker Hub and retag the image with `sof` for scripts: .. code-block:: bash @@ -79,8 +73,13 @@ Docker is a popular container management framework. To install Docker and get th Dockerhub, the image is hosted in a personal Docker Hub repo until the official image can go live. - - Build a Docker image: + - Option 2. Build a Docker image: + + .. note:: + Building the container from DockerFile takes more than two hours, + so we recommend using the pre-built image (Option 1). + Run the Docker build from the SOF repository. .. code-block:: bash From 270f216a387ea9789d9db9b7a37478a7a60bc83a Mon Sep 17 00:00:00 2001 From: Ranjani Sridharan Date: Tue, 9 Nov 2021 21:36:32 -0800 Subject: [PATCH 140/290] Add documentation for Topology 2.0 Add usage documentation for topology 2.0. Signed-off-by: Ranjani Sridharan --- developer_guides/index.rst | 1 + developer_guides/topology2/topology2.rst | 1315 ++++++++++++++++++++++ 2 files changed, 1316 insertions(+) create mode 100644 developer_guides/topology2/topology2.rst diff --git a/developer_guides/index.rst b/developer_guides/index.rst index cd30b5cf..3ef80cdd 100644 --- a/developer_guides/index.rst +++ b/developer_guides/index.rst @@ -14,6 +14,7 @@ terminology before reading further. unit_tests xtrun/index topology/topology + topology2/topology2 uuid/index.rst debugability/index tuning/sof-ctl diff --git a/developer_guides/topology2/topology2.rst b/developer_guides/topology2/topology2.rst new file mode 100644 index 00000000..26958c6f --- /dev/null +++ b/developer_guides/topology2/topology2.rst @@ -0,0 +1,1315 @@ +.. _topology2: + +Topology 2.0 +############ + +This is a high-level keyword extension on top of the existing ALSA conf topology format designed +to: + +* Simplify the ALSA conf topology definitions by providing high level "classes" so topology + designers need to write less config for commonly defined objects. + +* Allow simple reuse of objects. Define once and reuse (like M4) with the ability to alter objects + configuration attributes from defaults. + +* Allow data type and value verification. This is not done today and frequently crops up in FW bug + reports. + +.. contents:: + +1. Ingredients +************** + +A typical 2.0 configuration file consists of the following: + +* Classes +* Objects +* Arguments +* Conditional includes + +1.1 Classes +----------- + +Topology today has some common definitions that are often reused throughout with slightly altered +configurations such as widgets (components), pipelines, dais, pcm and controls. Topology 2.0 +introduces the concept of reusable "class" like definitions that can be used to create commonly +used topology objects. Classes are defined with a new keyword “Class”. + +A class definition always starts with the "Class" keyword followed by 2 nodes. The first node contains +the class group and the second node contains the class name. For example: + +.. code-block:: bash + + Class.Base.data {} + +Note that '.' is the node separator in the alsaconf syntax. In the above line, "Base" is the class +group and "data" is the class name. Currently, the alsatplg compiler supports the following class groups: +widget, pipeline, DAI, control and base. Most of the commonly used topology objects can be classified into +one of these groups. If there's need for a new class group, the alsatplg compiler should be updated to add +support for it. + +1.1.1 Class Ingredients +''''''''''''''''''''''' + +A minimalistic class definition should consist of the following: + +* One or more attributes declared with the keyword "DefineAttribute". Attributes are parameters that + are used to describe the object. For ex: + + .. code-block:: bash + + DefineAttribute."name" { + type "string" + } + +"name" is an attribute of type string. + + +* Basic attribute qualifiers with the constructor array and unique attribute name. Attribute qualifiers + should be declared within the "attributes {}" node in the class definition. + + .. code-block:: bash + + # attribute qualifiers + attributes { + # + # This tells the compiler how to construct the object's name. For example, if the + # name attribute is set to "EQIIR-Coefficients", the object name will be + # constructed as "class_name.EQIIR-Coefficients" + # + !constructor [ + "name" + ] + # + # objects of the same class instantiated within the same alsaconf node have unique + # name attribute + # + unique "name" + } + +1.1.2 A Simple Class +'''''''''''''''''''' + +An example of a simple class definition with 2 attributes and qualifiers is as follows: + +.. code-block:: bash + + Class.Base."data" { + + # name for the data object + DefineAttribute."name" { + type "string" + } + + # bytes data + DefineAttribute."bytes" { + type "string" + } + + # attribute qualifiers + attributes { + # + # This tells the compiler how to construct the object's name. For example, if the + # name attribute is set to "EQIIR-Coefficients", the object name will be + # constructed as "data.EQIIR-Coefficients" + # + !constructor [ + "name" + ] + # + # data objects instantiated within the same alsaconf node should have unique + # name attribute + # + unique "name" + } + } + +The "data" class definition belonging to the "base" class group, contains 2 attributes namely, +name and bytes, both of type "string". By default, all attributes are give the type "integer" unless +specified otherwise like above. Currently, topology 2.0 supports only "integer" and "string" types for +attributes. + +The attribute qualifiers are used to describe how to instantiate an object from the class definition +and validate the attribute values. + +In the above definition, the "constructor" array tells the compiler how to build the object's name. +A data object instantiated with the name "EQIIR-Coefficients" will be given the name, +"data.EQIIR-Coefficients" i.e. the class name followed by '.' followed by the constructor attribute +values separated by '.'. + +The "unique" qualifier indicates that two data objects instantiated within the same alsaconf node should +have unique values for their "name" attribute. If two data objects are instantiated within the same alsaconf +node with the same "name" attribute, there be no errors but the two object instances with be merged +with the second instance overriding the attribute values in the first one. Therefore, it is the topology +writer's responbility to ensure that two instances within the same parent node have different unique attribute +values. + +Let's consider another class definition example for the "pga" widget belonging to the class group "Widget". + +.. code-block:: bash + + Class.Widget."pga" { + # + # Pipeline ID for the pga widget object + # + DefineAttribute."index" {} + + # + # pga object instance + # + DefineAttribute."instance" {} + + # attribute qualifiers + attributes { + # + # The PGA widget name is constructed using the index and instance + # attributes. For ex: "pga.1.1" or "pga.10.2" etc. + # + !constructor [ + "index" + "instance" + ] + + # + # pga widget objects instantiated within the same alsaconf node should have unique + # instance attribute + # + unique "instance" + } + } + +Note that the pga object names are constructed with the class name "pga" followed by 2 attribute values, index +and instance, ex: pga.1.1. Also note that both the attributes wil be given the type "integer" by default because +the definitions do not specify the type. Also, note that in practice, the unique instance attribute should also be +part of the constructor. + +1.1.3 Attribute default values +'''''''''''''''''''''''''''''' + +Optionally, class definitions can be extended to give default values for their attributes. Let's add a +"uuid" attribute of type string to the pga class above and give it a default value. + +.. code-block:: bash + + Class.Widget."pga" { + # + # Pipeline ID for the pga widget object + # + DefineAttribute."index" {} + + # + # pga object instance + # + DefineAttribute."instance" {} + + DefineAttribute."uuid" { + type "string" + } + + # attribute qualifiers + attributes { + # + # The PGA widget name is constructed using the index and instance + # attributes. For ex: "pga.1.1" or "pga.10.2" etc. + # + !constructor [ + "index" + "instance" + ] + + # + # pga widget objects instantiated within the same alsaconf node should have unique + # instance attribute + # + unique "instance" + } + + # default attribute values + uuid "7e:67:7e:b7:f4:5f:88:41:af:14:fb:a8:bd:bf:86:82" + + } + +All pga objects will automatically be given the default uuid as specified above in the class definition. + +1.1.4 Advanced attribute qualifiers +''''''''''''''''''''''''''''''''''' + +Apart from the mandatory basic attribute qualifiers, attributes in the class definition can be qualified +using the following advanced keywords: + +* **Mandatory:** Attributes qualified as mandatory should be provided with a value in the object + instance, failing which the alsatplg compiler will emit and error. Objects with default values in the class + definition need not be qualified as mandatory. Also, note that attributes in the constructor array are + mandatory by default as they are required for building the object's name. + +* **Immutable:** Attribute values that are set in the class definition and cannot be modified in + the object instance. + +* **Deprecated:** Attributes that have been deprecated and should not be set in the object instance. + +* **Automatic:** Attributes whose values are computed by the alsatplg compiler. + +Let's add some extra attributes and advanced qualifers into the pga class definition: + +.. code-block:: bash + + Class.Widget."pga" { + # attribute definitions + DefineAttribute.instance { + type "integer" + } + DefineAttribute.index { + type "integer" + } + DefineAttribute."type" { + type "string" + } + DefineAttribute."uuid" { + type "string" + } + DefineAttribute."preload_count" {} + + # attribute qualifiers + attributes { + # + # The PGA widget name is constructed using the index and instance attributes. + # For ex: "pga.1.1" or "pga.10.2" etc. + # + !constructor [ + "index" + "instance" + ] + + # + # immutable attributes should be given default values and cannot be modified in the object instance + # + !immutable [ + "uuid" + "type" + ] + + # + # deprecated attributes should not be added in the object instance + # + !deprecated [ + "preload_count" + ] + + # + # pga widget objects instantiated within the same alsaconf node should have + # unique instance attribute + # + unique "instance" + } + + # default attribute values + type "pga" + uuid "7e:67:7e:b7:f4:5f:88:41:af:14:fb:a8:bd:bf:86:82" + } + +1.1.5 Automatic attributes +'''''''''''''''''''''''''' +In some cases, an attribute's value depends on other attribute values and need to be computed during +build time. Such attributes are qualified with the "automatic" keyword in the class definition. Please +refer to buffer_ for the complete class definition. + +.. code-block:: bash + + Class.Widget."buffer" { + # Other attributes skipped for simplicity. + + # + # Buffer size in bytes. Will be calculated based on the parameters of the pipeline to in which the + # buffer object belongs + # + DefineAttribute."size" { + # Token reference and type + token_ref "sof_tkn_buffer.word" + } + + attributes { + # + # size attribute value for buffer objects is computed in the compiler + # + !automatic [ + "size" + ] + } + } + +In the above, case the buffer's size attribute value will be computed based on the pipeline parameters to which the buffer +belongs. Currently, the alsatplg compiler only has support for computing the automatic attribute "size" for the buffer objects. +If needed, support for automatic attributes in new class definitions should be added in the alsatplg compiler. + +1.1.6 Attribute Constraints +''''''''''''''''''''''''''' +One of the key features of Topology 2.0 is validation of the values provided for objects. This is achieved +with the help of constraints added to the attribute definition. Constraints can be added to an attribute using +the "constraints" keyword as follows: + +.. code-block:: bash + + DefineAttribute."foo" { + constraints {} + } + +Currently, 3 types of constraints are supported: + +* min: min value for attribute, applicable only to integer type attributes +* max: max value for attribute, applicable only to integer type attributes + + For example, the pga class definition can be expanded with an attribute for "ramp_step_ms" with min and + max values as follows: + + .. code-block:: bash + + DefineAttribute."ramp_step_ms" { + constraints { + min 200 + max 500 + } + } + +* valid values: an array of acceptable human-readable values, applicable only to string type attributes. + + For example, the pga class can have an attribue for "ramp_step_type" with pre-defined values as follows: + + .. code-block:: bash + + DefineAttribute."ramp_step_type" { + type "string" + constraints { + !valid_values [ + "linear" + "log" + "linear_zc" + "log_zc" + ] + } + } + +When the pga is class is instantiated with a value that doesn't belong in the valid_values array for ramp_step_type, +the alsatplg compiler will emit an error along with the list of permitted values. + +1.1.7 Attributes with token references +'''''''''''''''''''''''''''''''''''''' +Typically, a lot of objects contain a private data section that is composed of sets of tuple arrays. Some of the attributes in +a class definition may need to be packed into the tuple array. Such attributes are identified with the "token_ref" node +which contains the name of the tuple array that the attribute should be built into. For example, both the ramp_step_ms and +ramp_step_type attributes in the pga class need to be added to the tuple array. So, they are contain the token_ref node +with the value "sof_tkn_volume.word" indicating that the attributes should be packed with the "sof_tkn_volume tuple" array +of type "word" as shown below. + +.. code-block:: bash + + # + # Volume ramp step in milliseconds + # + DefineAttribute."ramp_step_ms" { + # Token set reference name + token_ref "sof_tkn_volume.word" + constraints { + min 200 + max 500 + } + } + DefineAttribute."ramp_step_type" { + type "string" + # Token set reference name + token_ref "sof_tkn_volume.word" + constraints { + !valid_values [ + "linear" + "log" + "linear_zc" + "log_zc" + ] + } + } + +Sometimes, valid_values for attributes might need to be translated from the human readable values to integer tuple values so +that it can be parsed correctly by the kernel driver. In the example above, valid values for ramp_step_type are defined +as human readable string values such as linear, log etc. which are translated to tuple values 0, 1, etc respectively before +getting added to the tuple array. + +.. code-block:: bash + + DefineAttribute."ramp_step_type" { + type "string" + # Token set reference name + token_ref "sof_tkn_volume.word" + constraints { + !valid_values [ + "linear" + "log" + "linear_zc" + "log_zc" + ] + !tuple_values [ + 0 + 1 + 2 + 3 + ] + } + } + +1.1.8 A complete class definition +''''''''''''''''''''''''''''''''' + +Puting it all together, the complete defintiion for the pga widget class is as follows: + +.. code-block:: bash + + Class.Widget."pga" { + # attribute definitions + DefineAttribute.instance { + type integer + } + DefineAttribute.index { + type integer + } + DefineAttribute."type" { + type "string" + } + DefineAttribute."uuid" { + type "string" + # Token set reference name and type + token_ref "sof_tkn_comp.uuid" + } + DefineAttribute."preload_count" {} + + # + # Volume ramp step in milliseconds + # + DefineAttribute."ramp_step_ms" { + # Token set reference name + token_ref "sof_tkn_volume.word" + constraints { + min 200 + max 500 + } + } + DefineAttribute."ramp_step_type" { + type "string" + # Token set reference name + token_ref "sof_tkn_volume.word" + constraints { + !valid_values [ + "linear" + "log" + "linear_zc" + "log_zc" + ] + !tuple_values [ + 0 + 1 + 2 + 3 + ] + } + } + + # attribute qualifiers + attributes { + # + # The PGA widget name is constructed using the index and instance attributes. + # For ex: "pga.1.1" or "pga.10.2" etc. + # + !constructor [ + "index" + "instance" + ] + + # + # immutable attributes cannot be modified in the object instance + # + !immutable [ + "uuid" + "type" + ] + + # + # deprecated attributes should not be added in the object instance + # + !deprecated [ + "preload_count" + ] + + # + # pga widget objects instantiated within the same alsaconf node should have + # unique instance attribute + # + unique "instance" + } + + # default attribute values + type "pga" + uuid "7e:67:7e:b7:f4:5f:88:41:af:14:fb:a8:bd:bf:86:82" + ramp_step_ms 200 + } + +1.2 Objects +----------- +Objects are used to instantiate multiple instances of the same class to avoid duplicating +common attribute definitions. Objects are instantiated with the new keyword "Object" followed by +3 nodes in order as follows: + +.. code-block:: bash + + Object.Widget.pga."1" {} + +The nodes refer to the following: + +* Class group to which the object's class belongs i.e. "Widget" +* Class name i.e. "pga" +* Unique attribute value: This is the value for the attribute that is qualified as "unique" in the + class definition i.e. "instance" + +Using the pga class definition in section 1.1.8, a pga widget object can be instantiated as follows: + +.. code-block:: bash + + Object.Widget.pga."1" { + index 5 + } + +where 1 is the value for the unique attribute ("instance") in the pga class definition and the +"index" attribute is given the value 5. Since, there are no other mandatory attributes in the +class defintion, the above instance is fully valid. The key thing to notice in the instantiation +is that there is no need to duplicate commonly used attribute values in the object instantiation. +Objects automatically inherit the default values for attributes from their class definition. + +1.2.1 Modifying default attributes +'''''''''''''''''''''''''''''''''' +Attributes that have default values in the class definition can be overwritten by specifying the +new value in the object instance as follows: + +.. code-block:: bash + + Object.Widget.pga."1" { + index 5 + ramp_step_ms 300 + } + +The above object overrides the ramp_step_ms default value of 200ms set in the class definition with the +new value of 300ms. + +1.2.2 Objects within classes +'''''''''''''''''''''''''''' +Class definitions can optionally also include child objects that need to be instantiated for every +instance of the class object. For example, a pga widget typically always contains a volume mixer control. +The mixer control class definition is as follows: + +.. code-block:: bash + + Class.Control."mixer" { + # + # Pipeline ID for the mixer object + # + DefineAttribute."index" {} + + # + # Instance of mixer object in the same alsaconf node + # + DefineAttribute."instance" {} + + # + # Mixer name. A mixer object is included in the built topology only if it is given a + # name + # + DefineAttribute."name" { + type "string" + } + + # + # Max volume setting + # + DefineAttribute."max" {} + + DefineAttribute."invert" { + type "string" + constraints { + !valid_values [ + "true" + "false" + ] + } + } + + # use mute LED + DefineAttribute."mute_led_use" { + token_ref "sof_tkn_mute_led.word" + } + + # LED direction + DefineAttribute."mute_led_direction" { + token_ref "sof_tkn_mute_led.word" + } + + # + # access control for mixer + # + DefineAttribute."access" { + type "compound" + constraints { + !valid_values [ + "read_write" + "tlv_read_write" + "read" + "write" + "volatile" + "tlv_read" + "tlv_write" + "tlv_command" + "inactive" + "lock" + "owner" + "tlv_callback" + ] + } + } + + attributes { + # + # The Mixer object name is constructed using the index and instance arguments. + # For ex: "mixer.1.1" or "mixer.10.2" etc. + # + !constructor [ + "index" + "instance" + ] + !mandatory [ + "max" + ] + # + # mixer control objects instantiated within the same alsaconf node should have unique + # index attribute + # + unique "instance" + } + + # Default attribute values for mixer control + invert "false" + mute_led_use 0 + mute_led_direction 0 + } + +A mixer conrol object can be added to the pga widget class definition as below: + +.. code-block:: bash + + Class.Widget."pga" { + # Attributes, qualifiers and default values are skipped for simplicity. + # Please refer to the complete class definition in Section 1.1.8 above for details + + # volume control for pga widget + Object.Control.mixer."1" { + name "My Volume Control" + max 32 + } + } + } + +The mixer control "My Volume Control" will be programmatically added to all pga objects. + +1.2.3 Object attribute inheritance +'''''''''''''''''''''''''''''''''' +One thing to note in the above object instantiation is that the mixer object has 2 mandatory attributes, +index and instance but the index attribute value is missing in the instance. This is because the mixer control +object inherits the index attribute value from it's parent pga object when it gets instantiated. For ex, lets take +a pga object instance. + +.. code-block:: bash + + Object.Widget.pga.1 { + index 5 + } + +The index value "5" will be inherited by the mixer control object in the pga class definition. Inheritance is +implied only when a child object's class definition shares an attribute of the same name with its parent class +definition. In the case of mixer control class and pga widget class, the shared attribute is "index". + +1.2.4 Setting child object attributes +''''''''''''''''''''''''''''''''''''' +Let's consider the pga class definition with the mixer control object again: + +.. code-block:: bash + + Class.Widget."pga" { + # Attributes, qualifiers and default values are skipped for simplicity. + # Please refer to the complete class definition above for details + + # volume control for pga widget + Object.Control.mixer."1" { + name "My Volume Control" + max 32 + } + } + } + +Note that the mixer control object has it's name set in the pga widget class definition. But, ideally we want to +give the mixer control a new name whenever a new pga widget object is instantiated. This can be achieved as follows: + +.. code-block:: bash + + Object.Widget.pga."1" { + index 5 + + # volume control' + Object.Control.mixer."1" { + name "My Control Volume 5" + } + } + } + +Now, the mixer control object is assigned the name "My Control Volume 5". + + +1.2.5 Nested Objects +'''''''''''''''''''' +Objects can also be instantiated as child objects within other object instances. For example, a +switch control can be added to pga widget objects during instantiation as follows: + +.. code-block:: bash + + Object.Widget.pga."1" { + index 5 + + # volume control + Object.Control.mixer."1" { + name "My Control Volume 5" + } + } + + # mute control + Object.Control.mixer."2" { + name "Mute Switch Control" + max 1 + } + } + } + +Note how the "unique" attribute for the two mixer control objects differ to keep the mixer instances unique. + +1.2.6 Recursive object attribute inheritance +'''''''''''''''''''''''''''''''''''''''''''' +Objects can be nested within objects that are nested within other objects themselves. In this case, the attribute +values cam be inherited all the way from the top-level parent object. For example, consider the following class +definition for volume-playback pipeline: + +.. code-block:: bash + + Class.Pipeline."volume-playback" { + # Other attributes and qualifiers ommitted for simplicity + DefineAttribute."index" {} + + DefineAttribute."format" { + type "string" + } + + # pipeline objects + Object.Widget { + # Other objects ommitted for simplicity + + pga."1" {} + } + } + +Note that the pga widget object above has no index attribute value. An object of volume-playback +class is instantiated as: + +.. code-block:: bash + + Object.Pipeline.volume-playback.1 { + index 1 + format s24le + } + +This ensures that all child objects within the volume-playback object will inherit the +index attribute value from it. So the pga widget object will have the same index and by the same +rule, the mixer control object within the pga widget object will also have the same index attribute +value of "1". + +1.2.7 Setting child object attributes deep down in the parent object tree +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' +In section 1.2.4, we saw that we can set child attribute values from its parent object instance. +For example, the mixer control object's name can be set from the pga widget object instace. This +can be extended further and it is possible to set the mixer control name from the parent object of +the pga object. Consider the volume playback object instance in the previous section. We can set the +mixer control name for the pga object as follows: + +.. code-block:: bash + + Object.Pipeline.volume-playback.1 { + index 1 + format s24le + Object.Widget.pga.1 { + Object.Control.mixer.1 { + name "My Control Volume 1" + } + } + } + + +1.3. Arguments in top-level configuration files +----------------------------------------------- +Arguments are used to pass build-time parameters that can be used for building multiple binaries +from the same configuration file. Consider the following top-level topology configuration file +with 2 pipelines: + +.. code-block:: bash + + # arguments + @args [ DYNAMIC_PIPELINE ] + @args.DYNAMIC_PIPELINE { + type integer + default 0 + } + + Object.Pipeline { + volume-playback.1 { + dynamic_pipeline $DYNAMIC_PIPELINE + index 1 + Object.Widget.pipeline.1 { + stream_name 'dai.HDA.0.playback' + } + Object.Widget.host.playback { + stream_name 'Passthrough Playback 0' + } + Object.Widget.pga.1 { + Object.Control.mixer.1 { + name '1 My Playback Volume' + } + } + format s24le + } + volume-playback.3 { + dynamic_pipeline $DYNAMIC_PIPELINE + index 3 + Object.Widget.pipeline.1 { + stream_name 'dai.HDA.2.playback' + } + Object.Widget.host.playback { + stream_name 'Passthrough Playback 1' + } + Object.Widget.pga.1 { + Object.Control.mixer.1 { + name '3 My Playback Volume' + } + } + format s24le + } + } + +The value for the "dynamic_pipeline" attribute in the volume-playback objects in the above example +will be expanded from the provided value for the DYNAMIC_PIPELINE argument when building the +topology binary with the -DDYNAMIC_PIPELINE=1 or -DDYNAMIC_PIPELINE=0 option. + +Note that the alsatplg compiler only parses the arguments that are defined at the top-level node in the +machine topology file. + +1.4 Includes +------------ +When building a top-level configuration file, it should include all the class definitions for the objects +being instantiated, failing which the compiler will emit errors calling out missing class definitions. The +include paths for searching for dependencies can be specified as below. All paths are relative to the +directory specified by the environment variable "ALSA_CONFIG_DIR". + +.. code-block:: bash + + + + + +and the class definitions can be included as follows: + +.. code-block:: bash + + + + + + +3. Simple machine topology +************************** +A machine topology typically consists of the following: + +* Include paths pointing to the search directory for class definitions includes +* Conf file Includes containing class definitions +* Arguments +* Pipeline objects +* BE DAI links objects +* PCM objects +* Top-level pipeline connections + +Let's look at a simple machine topology configuration file that includes a volume-playback pipeline, +a HDA type DAI link, a playback PCM and the top-level connection. + +.. code-block:: bash + + # Include paths + + + + + + + + # Include class definitions + + + + + + + + + + + + + + # arguments + @args.DYNAMIC_PIPELINE { + type integer + default 0 + } + + # DAI definition + Object.Dai { + HDA.0 { + name 'Analog Playback and Capture' + id 4 + default_hw_conf_id 4 + Object.Base.hw_config.HDA0 {} + Object.Widget.dai.1 { + direction playback + index 1 + type dai_in + stream_name 'Analog Playback and Capture' + period_sink_count 0 + period_source_count 2 + format s32le + } + } + } + + + # Pipeline Definition + Object.Pipeline { + volume-playback.1 { + dynamic_pipeline $DYNAMIC_PIPELINE + index 1 + Object.Widget.pipeline.1 { + stream_name 'dai.HDA.0.playback' + } + Object.Widget.host.playback { + stream_name 'Passthrough Playback 0' + } + Object.Widget.pga.1 { + Object.Control.mixer.1 { + name '1 My Playback Volume' + } + } + format s24le + } + } + + # PCM Definitions + Object.PCM { + pcm.0 { + name 'HDA Analog' + Object.Base.fe_dai.'HDA Analog' {} + Object.PCM.pcm_caps.playback { + name 'Passthrough Playback 0' + formats 'S24_LE,S16_LE' + } + direction playback + id 0 + } + } + + # Top-level pipeline connection + # Buffer.1. -> dai.HDA.1.playback + Object.Base.route.1 { + source 'buffer.1.1' + sink 'dai.HDA.1.playback' + } + +Note that the above configuration file only includes the top-level route between the buffer widget +"buffer.1.1" in the volume-playback pipeline and the dai widget "dai.HDA.1.playback". The connections +between the widgets in the volume-playback pipeline are defined in the class definition. + +Let's peek into the volume-playback pipeline class definition to look at the route objects contained within +the class definition. Please refer to volume-playback_ for the complete class definition. + +.. code-block:: bash + + Class.Pipeline."volume-playback" { + # pipeline attributes skipped for simplicity + + attributes { + # pipeline name is constructed as "volume-playback.1" + !constructor [ + "index" + ] + !mandatory [ + "format" + ] + !immutable [ + "direction" + ] + # + # volume-playback objects instantiated within the same alsaconf node should have + # unique instance attribute + # + unique "instance" + } + + # Widget objects that constitute the volume-playback pipeline + Object.Widget { + pipeline."1" {} + + host."playback" { + type "aif_in" + } + + buffer."1" { + periods 2 + caps "host" + } + + pga."1" { + Object.Control.mixer.1 { + Object.Base.tlv."vtlv_m64s2" { + Object.Base.scale."m64s2" {} + } + } + } + + buffer."2" { + periods 2 + caps "dai" + } + } + + # Pipeline connections. + # The index attribute values for the source/sink widgets will be populated + # when the route objects are built + Object.Base { + route."1" { + source "host..playback" + sink "buffer..1" + } + + route."2" { + source "buffer..1" + sink "pga..1" + } + + route."3" { + source "pga..1" + sink "buffer..2" + } + } + + # Default attribute values + direction "playback" + time_domain "timer" + period 1000 + channels 2 + rate 48000 + priority 0 + core 0 + frames 0 + mips 5000 + } + +The pipeline class definition is fairly straight-forward to follow except for the route object instances. +Let's analyze it a bit further. The route class definition is defined as follows: + +.. code-block:: bash + + Class.Base."route" { + # sink widget name + DefineAttribute."sink" { + type "string" + } + + # source widget name for route + DefineAttribute."source" { + type "string" + } + + # control name for the route + DefineAttribute."control" { + type "string" + } + + # + # Pipeline ID of the pipeline the route object belongs to + # + DefineAttribute."index" {} + + # unique instance for route object in the same alsaconf node + DefineAttribute."instance" {} + + attributes { + !constructor [ + "instance" + ] + !mandatory [ + "source" + "sink" + ] + # + # route objects instantiated within the same alsaconf node should have unique + # index attribute + # + unique "instance" + } + } + +Note that a route object is expected to have instance, source and sink attributes. + +Let's look at the route objects in the volume-playback class again: + +.. code-block:: bash + + Object.Base { + route."1" { + source "host..playback" + sink "buffer..1" + } + + route."2" { + source "buffer..1" + sink "pga..1" + } + + route."3" { + source "pga..1" + sink "buffer..2" + } + } + +Notice that the source and sink attributes are defined for all of the routes. For ex: the second route object, +"Object.Base.route.2" has a sink attribute value of "pga..1". Referring back to the pga widget class definition +in Section 1.1.8, we know that a pga widget object's constructor has 2 attributes, namely, index and instance. +We know the instance of the pga widget in the volume-playback class is 1 by looking at the list of widgets. +But the index attribute value for the pga widget in the pipeline is unknown. It will only be set from a top-level +topology config file as in Section 3. Therefore, the index attribute is left empty in the class definition +and it will populated with the appropriate value by the alsatplg compiler when the route object is built. For the +machine topology above, the route object "Object.base.route.2" will be built with the right pipeline ID's as follows: + +.. code-block:: bash + + Object.base.route.2 { + source "buffer.1.1" + sink "pga.1.1" + } + +Currently, the alsatplg supports the feature of filling in attribute values only for the route object source +and sink attributes. If needed, this feature can be extended for other types of objects. + +4. Conditional includes +*********************** +Conditional includes allow building multiple topology binaries from the same input configuration file. +For example, let's consider the HDA generic machine topology. The number of DMIC's determines wether +the DMIC configuration file should be included or not. This can be achieved as follows: + +.. code-block:: bash + + @args.DMIC_COUNT { + type integer + default 0 + } + + # include DMIC config if needed + IncludeByKey.DMIC_INCLUDE { + "[1-4]" "include/platform/intel/dmic-generic.conf" + } + +The regular expression "[1-4]" indicates that the dmic-generic.conf file should be included if +the DMIC_COUNT argument value is between 1 and 4. Assuming the top-level file is called +"sof-hda-generic.conf", two separate topology binaries can be built as follows: + +**`alsatplg -p -c sof-hda-generic.conf -o sof-hda-generic.tplg`** for machines with no DMIC's + +**`alsatplg -D DMIC_COUNT=2 -p -c sof-hda-generic.conf -o sof-hda-generic-2ch.tplg`** for machines with 2 DMIC's. + +Conditional includes are not limited to top-level configuration files. They can be added to any node +in the configuration file to include the configuration at the specified node. For example, we conditionally +include the right filter coefficients for the byte controls in a EQIIR widget as follows: + +Define the argument for the coefficients in the top-level topology file as follows: + +.. code-block:: bash + + @args.EQIIR_BYTES { + type string + default "highpass_40hz_0db_48khz" + } + +And then the coefficients can be included as follows: + +.. code-block:: bash + + Object.Widget.eqiir.1 { + Object.Control.bytes.1 { + name "my eqiir byte control" + # EQIIR filter coefficients + IncludeByKey.EQIIR_BYTES { + "[highpass.40hz.0db.48khz]" "include/components/eqiir/highpass_40hz_0db_48khz.conf" + "[highpass.40hz.20db.48khz]" "include/components/eqiir/highpass_40hz_20db_48khz.conf" + } + } + } + +5. Building 2.0 configuration files +*********************************** +Topology 2.0 configuration files can be compiled to produce the topology binary files using the +alsatplg compiler as follows: + +alsatplg <-D args=values> -p -c input.conf -o output.tplg + +The -D switch is used to pass comma-separated argument values to the top-level configuration file. + +The -P switch can be used to convert a 2.0 configuration file to the 1.0 configuration file as +follows: + +alsatplg <-D args=values> -P input.conf -o output.conf + +6. Topology reminders +********************* + +1. "index" refers to the pipeline ID in pipeline, widget and control class groups + +2. "id" in the DAI class group objects refers to the link ID as defined in the machine driver in the kernel + +7. Alsaconf reminders +********************* + +1. "." refers to a node separator. "foo.bar value" is quivalent to + +.. code-block:: bash + + foo { + bar value + } + +2. Arrays are defined with [] as below + +.. code-block:: bash + + !constructor [ + "foo" + "bar" + ] + +It is recommended to use the "!" in the array definitions in the class definition. This is to ensure that if the class +configuration file is included more than once from different sources, the array items will not be duplicated. + +.. _volume-playback: https://github.com/thesofproject/sof/blob/main/tools/topology/topology2/include/pipelines/volume-playback.conf +.. _buffer: https://github.com/thesofproject/sof/blob/main/tools/topology/topology2/include/components/buffer.conf From 4a4312d9f4ae33791d5cf58693ad36d28712b9fd Mon Sep 17 00:00:00 2001 From: Anton Bobkov Date: Tue, 7 Dec 2021 16:23:03 +0300 Subject: [PATCH 141/290] Edit: Topology 2.0 - Grammar and style nitpicks - Delete numbers from section names - Add links to sections that were previously referred to by their numbers --- developer_guides/topology2/topology2.rst | 460 +++++++++++++---------- 1 file changed, 260 insertions(+), 200 deletions(-) diff --git a/developer_guides/topology2/topology2.rst b/developer_guides/topology2/topology2.rst index 26958c6f..f2d66f19 100644 --- a/developer_guides/topology2/topology2.rst +++ b/developer_guides/topology2/topology2.rst @@ -6,10 +6,10 @@ Topology 2.0 This is a high-level keyword extension on top of the existing ALSA conf topology format designed to: -* Simplify the ALSA conf topology definitions by providing high level "classes" so topology +* Simplify the ALSA conf topology definitions by providing high level "classes". Topology designers need to write less config for commonly defined objects. -* Allow simple reuse of objects. Define once and reuse (like M4) with the ability to alter objects +* Allow simple reuse of objects. Define once and reuse (like M4) with the ability to alter object configuration attributes from defaults. * Allow data type and value verification. This is not done today and frequently crops up in FW bug @@ -17,44 +17,44 @@ to: .. contents:: -1. Ingredients -************** +Ingredients +*********** -A typical 2.0 configuration file consists of the following: +A typical 2.0 configuration file consists of the following components: * Classes * Objects * Arguments * Conditional includes -1.1 Classes ------------ +Classes +------- -Topology today has some common definitions that are often reused throughout with slightly altered -configurations such as widgets (components), pipelines, dais, pcm and controls. Topology 2.0 -introduces the concept of reusable "class" like definitions that can be used to create commonly -used topology objects. Classes are defined with a new keyword “Class”. +Topology today has some common definitions that are often reused with slightly altered +configurations, such as widgets (components), pipelines, dais, pcm, and controls. Topology 2.0 +introduces the concept of reusable class-like definitions that you can use to create commonly +used topology objects. Classes are defined with a new keyword ``Class``. -A class definition always starts with the "Class" keyword followed by 2 nodes. The first node contains -the class group and the second node contains the class name. For example: +A class definition always starts with the ``Class`` keyword followed by two nodes. The first node contains +the class group, and the second node contains the class name. For example: .. code-block:: bash Class.Base.data {} -Note that '.' is the node separator in the alsaconf syntax. In the above line, "Base" is the class -group and "data" is the class name. Currently, the alsatplg compiler supports the following class groups: +Note that '.' is the node separator in the alsaconf syntax. In the above line, ``Base`` is the class +group and ``data`` is the class name. Currently, the alsatplg compiler supports the following class groups: widget, pipeline, DAI, control and base. Most of the commonly used topology objects can be classified into -one of these groups. If there's need for a new class group, the alsatplg compiler should be updated to add +one of these groups. If a new class group is required, the alsatplg compiler should be updated to add support for it. -1.1.1 Class Ingredients -''''''''''''''''''''''' +Class Ingredients +''''''''''''''''' A minimalistic class definition should consist of the following: -* One or more attributes declared with the keyword "DefineAttribute". Attributes are parameters that - are used to describe the object. For ex: +* One or more attributes declared with the keyword ``DefineAttribute``. Attributes are parameters that + are used to describe the object. For example: .. code-block:: bash @@ -62,11 +62,11 @@ A minimalistic class definition should consist of the following: type "string" } -"name" is an attribute of type string. + "name" is an attribute of type string. * Basic attribute qualifiers with the constructor array and unique attribute name. Attribute qualifiers - should be declared within the "attributes {}" node in the class definition. + should be declared within the ``attributes {}`` node in the class definition. .. code-block:: bash @@ -87,10 +87,10 @@ A minimalistic class definition should consist of the following: unique "name" } -1.1.2 A Simple Class -'''''''''''''''''''' +A Simple Class +'''''''''''''' -An example of a simple class definition with 2 attributes and qualifiers is as follows: +The following example demonstrates a simple class definition with two attributes and qualifiers: .. code-block:: bash @@ -124,27 +124,27 @@ An example of a simple class definition with 2 attributes and qualifiers is as f } } -The "data" class definition belonging to the "base" class group, contains 2 attributes namely, -name and bytes, both of type "string". By default, all attributes are give the type "integer" unless -specified otherwise like above. Currently, topology 2.0 supports only "integer" and "string" types for -attributes. +The ``data`` class definition belonging to the ``base`` class group contains two attributes, +name and bytes, both of type ``string``. By default, all attributes have the ``integer`` type, unless +specified otherwise, like in the example above. Currently, topology 2.0 supports only ``integer`` and +``string`` types for attributes. The attribute qualifiers are used to describe how to instantiate an object from the class definition and validate the attribute values. -In the above definition, the "constructor" array tells the compiler how to build the object's name. -A data object instantiated with the name "EQIIR-Coefficients" will be given the name, -"data.EQIIR-Coefficients" i.e. the class name followed by '.' followed by the constructor attribute +In the above definition, the ``constructor`` array tells the compiler how to build the object's name. +A data object instantiated with the name ``EQIIR-Coefficients`` will be given the name +``data.EQIIR-Coefficients``, that is the class name followed by '.' followed by the constructor attribute values separated by '.'. -The "unique" qualifier indicates that two data objects instantiated within the same alsaconf node should -have unique values for their "name" attribute. If two data objects are instantiated within the same alsaconf -node with the same "name" attribute, there be no errors but the two object instances with be merged -with the second instance overriding the attribute values in the first one. Therefore, it is the topology -writer's responbility to ensure that two instances within the same parent node have different unique attribute +The ``unique`` qualifier indicates that multiple data objects instantiated within the same alsaconf node should +have unique values for their ``name`` attribute. If two data objects are instantiated within the same alsaconf +node with the same ``name`` attribute, there will be no errors. But the two object instances will be merged, +And the attribute values in the second instance will override the attribute values in the first one. Therefore, it is the topology +writer's responbility to ensure that multiple instances within the same parent node have different unique attribute values. -Let's consider another class definition example for the "pga" widget belonging to the class group "Widget". +Let's consider another class definition example for the ``pga`` widget belonging to the class group ``Widget``: .. code-block:: bash @@ -178,16 +178,18 @@ Let's consider another class definition example for the "pga" widget belonging t } } -Note that the pga object names are constructed with the class name "pga" followed by 2 attribute values, index -and instance, ex: pga.1.1. Also note that both the attributes wil be given the type "integer" by default because -the definitions do not specify the type. Also, note that in practice, the unique instance attribute should also be -part of the constructor. +Note that the pga object names are constructed with the class name +``pga`` followed by two attribute values, index and instance. For +example, ``pga.1.1``. Both attributes will have the ``integer`` type +by default because the definitions do not specify the type. In +practice, the unique instance attribute should also be part of the +constructor. -1.1.3 Attribute default values -'''''''''''''''''''''''''''''' +Attribute default values +'''''''''''''''''''''''' Optionally, class definitions can be extended to give default values for their attributes. Let's add a -"uuid" attribute of type string to the pga class above and give it a default value. +``uuid`` attribute of type ``string`` to the ``pga`` class and give it a default value: .. code-block:: bash @@ -231,14 +233,14 @@ Optionally, class definitions can be extended to give default values for their a All pga objects will automatically be given the default uuid as specified above in the class definition. -1.1.4 Advanced attribute qualifiers -''''''''''''''''''''''''''''''''''' +Advanced attribute qualifiers +''''''''''''''''''''''''''''' -Apart from the mandatory basic attribute qualifiers, attributes in the class definition can be qualified +Apart from the mandatory basic attribute qualifiers, you can qualify attributes in the class definition using the following advanced keywords: * **Mandatory:** Attributes qualified as mandatory should be provided with a value in the object - instance, failing which the alsatplg compiler will emit and error. Objects with default values in the class + instance, failing which the alsatplg compiler will emit an error. Objects with default values in the class definition need not be qualified as mandatory. Also, note that attributes in the constructor array are mandatory by default as they are required for building the object's name. @@ -247,7 +249,7 @@ using the following advanced keywords: * **Deprecated:** Attributes that have been deprecated and should not be set in the object instance. -* **Automatic:** Attributes whose values are computed by the alsatplg compiler. +* **Automatic:** Attributes which values are computed by the alsatplg compiler. Let's add some extra attributes and advanced qualifers into the pga class definition: @@ -307,11 +309,13 @@ Let's add some extra attributes and advanced qualifers into the pga class defini uuid "7e:67:7e:b7:f4:5f:88:41:af:14:fb:a8:bd:bf:86:82" } -1.1.5 Automatic attributes -'''''''''''''''''''''''''' -In some cases, an attribute's value depends on other attribute values and need to be computed during -build time. Such attributes are qualified with the "automatic" keyword in the class definition. Please -refer to buffer_ for the complete class definition. +Automatic attributes +'''''''''''''''''''' + +In some cases, an attribute value depends on other attribute values +and need to be computed during build time. Such attributes are +qualified with the ``automatic`` keyword in the class definition. +Refer to buffer_ for the complete class definition. .. code-block:: bash @@ -337,15 +341,19 @@ refer to buffer_ for the complete class definition. } } -In the above, case the buffer's size attribute value will be computed based on the pipeline parameters to which the buffer -belongs. Currently, the alsatplg compiler only has support for computing the automatic attribute "size" for the buffer objects. -If needed, support for automatic attributes in new class definitions should be added in the alsatplg compiler. +In the example above, the ``size`` attribute value of ``buffer`` is +computed based on the pipeline parameters, to which the buffer +belongs. Currently, the alsatplg compiler only has support for +computing the automatic attribute ``size`` for the buffer objects. +Support for automatic attributes in new class definitions +should be added in the alsatplg compiler if necessary. + +Attribute Constraints +''''''''''''''''''''' -1.1.6 Attribute Constraints -''''''''''''''''''''''''''' One of the key features of Topology 2.0 is validation of the values provided for objects. This is achieved with the help of constraints added to the attribute definition. Constraints can be added to an attribute using -the "constraints" keyword as follows: +the ``constraints`` keyword: .. code-block:: bash @@ -353,12 +361,12 @@ the "constraints" keyword as follows: constraints {} } -Currently, 3 types of constraints are supported: +Currently, three types of constraints are supported: -* min: min value for attribute, applicable only to integer type attributes -* max: max value for attribute, applicable only to integer type attributes +* **min:** The minimum value for an attribute, applicable only to integer type attributes. +* **max:** The maximum value for an attribute, applicable only to integer type attributes. - For example, the pga class definition can be expanded with an attribute for "ramp_step_ms" with min and + For example, the pga class definition can be expanded with an attribute for ``ramp_step_ms`` with min and max values as follows: .. code-block:: bash @@ -370,9 +378,9 @@ Currently, 3 types of constraints are supported: } } -* valid values: an array of acceptable human-readable values, applicable only to string type attributes. +* **valid values:** an array of acceptable human-readable values, applicable only to string type attributes. - For example, the pga class can have an attribue for "ramp_step_type" with pre-defined values as follows: + For example, the pga class can have an attribue for ``ramp_step_type`` with pre-defined values as follows: .. code-block:: bash @@ -388,17 +396,23 @@ Currently, 3 types of constraints are supported: } } -When the pga is class is instantiated with a value that doesn't belong in the valid_values array for ramp_step_type, -the alsatplg compiler will emit an error along with the list of permitted values. +When the pga class is instantiated with a value that does not belong in +the ``valid_values`` array for ``ramp_step_type``, the alsatplg compiler emits +an error along with the list of valid values. -1.1.7 Attributes with token references -'''''''''''''''''''''''''''''''''''''' -Typically, a lot of objects contain a private data section that is composed of sets of tuple arrays. Some of the attributes in -a class definition may need to be packed into the tuple array. Such attributes are identified with the "token_ref" node -which contains the name of the tuple array that the attribute should be built into. For example, both the ramp_step_ms and -ramp_step_type attributes in the pga class need to be added to the tuple array. So, they are contain the token_ref node -with the value "sof_tkn_volume.word" indicating that the attributes should be packed with the "sof_tkn_volume tuple" array -of type "word" as shown below. +Attributes with token references +'''''''''''''''''''''''''''''''' + +Typically, a lot of objects contain a private data section that is +composed of sets of tuple arrays. Some of the attributes in a class +definition may need to be packed into the tuple array. Such attributes +are identified with the ``token_ref`` node which contains the name of +the tuple array that the attribute should be built into. For example, +both the ``ramp_step_ms`` and ``ramp_step_type`` attributes in the pga +class need to be added to the tuple array. So, they contain the +token_ref node with the value ``sof_tkn_volume.word`` indicating that +the attributes should be packed with the ``sof_tkn_volume tuple`` +array of type ``word``: .. code-block:: bash @@ -427,10 +441,12 @@ of type "word" as shown below. } } -Sometimes, valid_values for attributes might need to be translated from the human readable values to integer tuple values so -that it can be parsed correctly by the kernel driver. In the example above, valid values for ramp_step_type are defined -as human readable string values such as linear, log etc. which are translated to tuple values 0, 1, etc respectively before -getting added to the tuple array. +Sometimes, ``valid_values`` for attributes might need to be translated +from the human readable values to integer tuple values so that it can +be parsed correctly by the kernel driver. In the example above, valid +values for ``ramp_step_type`` are defined as human readable string +values, such as linear and log. These values are translated to tuple +values (0, 1, etc) before getting added to the tuple array. .. code-block:: bash @@ -454,10 +470,12 @@ getting added to the tuple array. } } -1.1.8 A complete class definition -''''''''''''''''''''''''''''''''' +.. _complete_class_definition: + +A complete class definition +''''''''''''''''''''''''''' -Puting it all together, the complete defintiion for the pga widget class is as follows: +Putting it all together, the following example demonstrates the complete definition for the pga widget class: .. code-block:: bash @@ -549,24 +567,27 @@ Puting it all together, the complete defintiion for the pga widget class is as f ramp_step_ms 200 } -1.2 Objects ------------ +Objects +------- + Objects are used to instantiate multiple instances of the same class to avoid duplicating -common attribute definitions. Objects are instantiated with the new keyword "Object" followed by -3 nodes in order as follows: +common attribute definitions. Objects are instantiated with the new keyword ``Object`` followed by +three nodes: .. code-block:: bash Object.Widget.pga."1" {} -The nodes refer to the following: +The nodes refer to the following elements: -* Class group to which the object's class belongs i.e. "Widget" -* Class name i.e. "pga" -* Unique attribute value: This is the value for the attribute that is qualified as "unique" in the - class definition i.e. "instance" +* Class group to which the object class belongs. In this case, the class belongs to ``Widget``. +* Class name. That is ``pga``. +* Unique attribute value. This is the value for the attribute that is qualified as ``unique`` in the + class definition. That is ``instance``. -Using the pga class definition in section 1.1.8, a pga widget object can be instantiated as follows: +Using the pga class definition as described in +:ref:`complete_class_definition`, you can instantiate a pga widget +object in the following way: .. code-block:: bash @@ -574,16 +595,21 @@ Using the pga class definition in section 1.1.8, a pga widget object can be inst index 5 } -where 1 is the value for the unique attribute ("instance") in the pga class definition and the -"index" attribute is given the value 5. Since, there are no other mandatory attributes in the -class defintion, the above instance is fully valid. The key thing to notice in the instantiation -is that there is no need to duplicate commonly used attribute values in the object instantiation. -Objects automatically inherit the default values for attributes from their class definition. +where ``1`` is the value for the unique attribute ``instance`` in the pga class definition and the +``index`` attribute is given the value of 5. As the class definition contains no other mandatory +attributes, the above instance is fully valid. + +.. important:: + + You do not need to duplicate commonly used attribute values in the + object instantiation. Objects automatically inherit the default + values for attributes from their class definition. + +Modifying default attributes +'''''''''''''''''''''''''''' -1.2.1 Modifying default attributes -'''''''''''''''''''''''''''''''''' Attributes that have default values in the class definition can be overwritten by specifying the -new value in the object instance as follows: +new value in the object instance: .. code-block:: bash @@ -592,11 +618,12 @@ new value in the object instance as follows: ramp_step_ms 300 } -The above object overrides the ramp_step_ms default value of 200ms set in the class definition with the -new value of 300ms. +The above object overrides the ``ramp_step_ms`` default value of 200 |_| ms set in the class definition with the +new value of 300 |_| ms. + +Objects within classes +'''''''''''''''''''''' -1.2.2 Objects within classes -'''''''''''''''''''''''''''' Class definitions can optionally also include child objects that need to be instantiated for every instance of the class object. For example, a pga widget typically always contains a volume mixer control. The mixer control class definition is as follows: @@ -695,13 +722,13 @@ The mixer control class definition is as follows: mute_led_direction 0 } -A mixer conrol object can be added to the pga widget class definition as below: +You can add a mixer control object to the pga widget class definition: .. code-block:: bash Class.Widget."pga" { # Attributes, qualifiers and default values are skipped for simplicity. - # Please refer to the complete class definition in Section 1.1.8 above for details + # Refer to the complete class definition in "Complete Class Definition" for details # volume control for pga widget Object.Control.mixer."1" { @@ -711,14 +738,15 @@ A mixer conrol object can be added to the pga widget class definition as below: } } -The mixer control "My Volume Control" will be programmatically added to all pga objects. +The mixer control ``My Volume Control`` will be programmatically added to all pga objects. + +Object attribute inheritance +'''''''''''''''''''''''''''' -1.2.3 Object attribute inheritance -'''''''''''''''''''''''''''''''''' -One thing to note in the above object instantiation is that the mixer object has 2 mandatory attributes, -index and instance but the index attribute value is missing in the instance. This is because the mixer control -object inherits the index attribute value from it's parent pga object when it gets instantiated. For ex, lets take -a pga object instance. +One thing to note in the above object instantiation is that the mixer object has two mandatory attributes, +index and instance. But the index attribute value is missing in the instance. This is because the mixer control +object inherits the index attribute value from its parent pga object when it gets instantiated. For example, +consider the following pga object instance: .. code-block:: bash @@ -726,12 +754,15 @@ a pga object instance. index 5 } -The index value "5" will be inherited by the mixer control object in the pga class definition. Inheritance is -implied only when a child object's class definition shares an attribute of the same name with its parent class -definition. In the case of mixer control class and pga widget class, the shared attribute is "index". +The mixer control object in the pga class definition inherits the index value of ``5``. Inheritance occurs +only when a child object's class definition shares an attribute of the same name with its parent class +definition. In the case of mixer control class and pga widget class, the shared attribute is ``index``. + +.. _setting_child_object_attributes: + +Setting child object attributes +''''''''''''''''''''''''''''''' -1.2.4 Setting child object attributes -''''''''''''''''''''''''''''''''''''' Let's consider the pga class definition with the mixer control object again: .. code-block:: bash @@ -748,8 +779,8 @@ Let's consider the pga class definition with the mixer control object again: } } -Note that the mixer control object has it's name set in the pga widget class definition. But, ideally we want to -give the mixer control a new name whenever a new pga widget object is instantiated. This can be achieved as follows: +Note that the mixer control object has its name set in the pga widget class definition. But, ideally, we want to +give the mixer control a new name whenever a new pga widget object is instantiated. You can do it like this: .. code-block:: bash @@ -763,13 +794,14 @@ give the mixer control a new name whenever a new pga widget object is instantiat } } -Now, the mixer control object is assigned the name "My Control Volume 5". +Now, the mixer control object is assigned the name ``My Control Volume 5``. -1.2.5 Nested Objects -'''''''''''''''''''' +Nested Objects +'''''''''''''' + Objects can also be instantiated as child objects within other object instances. For example, a -switch control can be added to pga widget objects during instantiation as follows: +switch control can be added to pga widget objects during instantiation: .. code-block:: bash @@ -790,12 +822,13 @@ switch control can be added to pga widget objects during instantiation as follow } } -Note how the "unique" attribute for the two mixer control objects differ to keep the mixer instances unique. +Note how the ``unique`` attribute for the two mixer control objects differs to keep the mixer instances unique. + +Recursive object attribute inheritance +'''''''''''''''''''''''''''''''''''''' -1.2.6 Recursive object attribute inheritance -'''''''''''''''''''''''''''''''''''''''''''' Objects can be nested within objects that are nested within other objects themselves. In this case, the attribute -values cam be inherited all the way from the top-level parent object. For example, consider the following class +values can be inherited all the way from the top-level parent object. For example, consider the following class definition for volume-playback pipeline: .. code-block:: bash @@ -827,14 +860,15 @@ class is instantiated as: } This ensures that all child objects within the volume-playback object will inherit the -index attribute value from it. So the pga widget object will have the same index and by the same +index attribute value from it. So the pga widget object will have the same index. And by the same rule, the mixer control object within the pga widget object will also have the same index attribute -value of "1". +value of 1. -1.2.7 Setting child object attributes deep down in the parent object tree -''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -In section 1.2.4, we saw that we can set child attribute values from its parent object instance. -For example, the mixer control object's name can be set from the pga widget object instace. This +Setting child object attributes deep down in the parent object tree +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +In :ref:`setting_child_object_attributes`, we saw that we can set child attribute values from its parent object instance. +For example, you can set the mixer control object's name from the pga widget object instance. This can be extended further and it is possible to set the mixer control name from the parent object of the pga object. Consider the volume playback object instance in the previous section. We can set the mixer control name for the pga object as follows: @@ -852,11 +886,12 @@ mixer control name for the pga object as follows: } -1.3. Arguments in top-level configuration files ------------------------------------------------ +Arguments in top-level configuration files +------------------------------------------ + Arguments are used to pass build-time parameters that can be used for building multiple binaries from the same configuration file. Consider the following top-level topology configuration file -with 2 pipelines: +with two pipelines: .. code-block:: bash @@ -902,19 +937,24 @@ with 2 pipelines: } } -The value for the "dynamic_pipeline" attribute in the volume-playback objects in the above example -will be expanded from the provided value for the DYNAMIC_PIPELINE argument when building the -topology binary with the -DDYNAMIC_PIPELINE=1 or -DDYNAMIC_PIPELINE=0 option. +In this example, the value for the ``dynamic_pipeline`` attribute in the volume-playback objects +is expanded from the provided value for the ``DYNAMIC_PIPELINE`` argument when building the +topology binary with the ``-DDYNAMIC_PIPELINE=1`` or ``-DDYNAMIC_PIPELINE=0`` option. + +.. note:: -Note that the alsatplg compiler only parses the arguments that are defined at the top-level node in the -machine topology file. + The alsatplg compiler only parses the arguments that are defined at + the top-level node in the machine topology file. -1.4 Includes ------------- -When building a top-level configuration file, it should include all the class definitions for the objects -being instantiated, failing which the compiler will emit errors calling out missing class definitions. The -include paths for searching for dependencies can be specified as below. All paths are relative to the -directory specified by the environment variable "ALSA_CONFIG_DIR". +Includes +-------- + +When building a top-level configuration file, it should include all +class definitions for the objects being instantiated, failing which +the compiler will emit errors calling out missing class definitions. +All paths are relative to the directory specified by the environment +variable ``ALSA_CONFIG_DIR``. You can specify the include paths for +dependencies as follows: .. code-block:: bash @@ -922,7 +962,7 @@ directory specified by the environment variable "ALSA_CONFIG_DIR". -and the class definitions can be included as follows: +Include the class definitions as follows: .. code-block:: bash @@ -931,8 +971,11 @@ and the class definitions can be included as follows: -3. Simple machine topology -************************** +.. _simple_machine_topology: + +Simple machine topology +*********************** + A machine topology typically consists of the following: * Include paths pointing to the search directory for class definitions includes @@ -943,8 +986,8 @@ A machine topology typically consists of the following: * PCM objects * Top-level pipeline connections -Let's look at a simple machine topology configuration file that includes a volume-playback pipeline, -a HDA type DAI link, a playback PCM and the top-level connection. +Let's consider a simple machine topology configuration file that includes a volume-playback pipeline, +a HDA type DAI link, a playback PCM, and the top-level connection: .. code-block:: bash @@ -1038,11 +1081,11 @@ a HDA type DAI link, a playback PCM and the top-level connection. } Note that the above configuration file only includes the top-level route between the buffer widget -"buffer.1.1" in the volume-playback pipeline and the dai widget "dai.HDA.1.playback". The connections +``buffer.1.1`` in the volume-playback pipeline and the dai widget ``dai.HDA.1.playback``. The connections between the widgets in the volume-playback pipeline are defined in the class definition. Let's peek into the volume-playback pipeline class definition to look at the route objects contained within -the class definition. Please refer to volume-playback_ for the complete class definition. +the class definition. Refer to volume-playback_ for the complete class definition. .. code-block:: bash @@ -1126,7 +1169,7 @@ the class definition. Please refer to volume-playback_ for the complete class de mips 5000 } -The pipeline class definition is fairly straight-forward to follow except for the route object instances. +The pipeline class definition is fairly easy to follow except for the route object instances. Let's analyze it a bit further. The route class definition is defined as follows: .. code-block:: bash @@ -1171,9 +1214,9 @@ Let's analyze it a bit further. The route class definition is defined as follows } } -Note that a route object is expected to have instance, source and sink attributes. +Note that a route object is expected to have instance, source, and sink attributes. -Let's look at the route objects in the volume-playback class again: +Let's consider the route objects in the volume-playback class again: .. code-block:: bash @@ -1194,14 +1237,14 @@ Let's look at the route objects in the volume-playback class again: } } -Notice that the source and sink attributes are defined for all of the routes. For ex: the second route object, -"Object.Base.route.2" has a sink attribute value of "pga..1". Referring back to the pga widget class definition -in Section 1.1.8, we know that a pga widget object's constructor has 2 attributes, namely, index and instance. +Notice that the source and sink attributes are defined for all of the routes. For example, the second route object +``Object.Base.route.2`` has a sink attribute value of ``pga..1``. Referring back to the pga widget class definition +in :ref:`complete_class_definition`, we know that a pga widget object's constructor has two attributes, ``index`` and ``instance``. We know the instance of the pga widget in the volume-playback class is 1 by looking at the list of widgets. But the index attribute value for the pga widget in the pipeline is unknown. It will only be set from a top-level -topology config file as in Section 3. Therefore, the index attribute is left empty in the class definition -and it will populated with the appropriate value by the alsatplg compiler when the route object is built. For the -machine topology above, the route object "Object.base.route.2" will be built with the right pipeline ID's as follows: +topology config file as in :ref:`simple_machine_topology`. Therefore, the index attribute is left empty in the class definition. +The alsatplg compiler will populate the index attribute with the appropriate value when the route object is built. For the +machine topology above, the route object ``Object.base.route.2`` will be built with the right pipeline IDs as follows: .. code-block:: bash @@ -1210,13 +1253,14 @@ machine topology above, the route object "Object.base.route.2" will be built wit sink "pga.1.1" } -Currently, the alsatplg supports the feature of filling in attribute values only for the route object source +Currently, alsatplg can fill in attribute values only for the route object source and sink attributes. If needed, this feature can be extended for other types of objects. -4. Conditional includes -*********************** +Conditional includes +******************** + Conditional includes allow building multiple topology binaries from the same input configuration file. -For example, let's consider the HDA generic machine topology. The number of DMIC's determines wether +For example, let's consider the HDA generic machine topology. The number of DMICs determines whether the DMIC configuration file should be included or not. This can be achieved as follows: .. code-block:: bash @@ -1231,19 +1275,23 @@ the DMIC configuration file should be included or not. This can be achieved as f "[1-4]" "include/platform/intel/dmic-generic.conf" } -The regular expression "[1-4]" indicates that the dmic-generic.conf file should be included if +The regular expression ``[1-4]`` indicates that the dmic-generic.conf file should be included if the DMIC_COUNT argument value is between 1 and 4. Assuming the top-level file is called -"sof-hda-generic.conf", two separate topology binaries can be built as follows: +``sof-hda-generic.conf``, you can build two separate topology binaries with the following commands: -**`alsatplg -p -c sof-hda-generic.conf -o sof-hda-generic.tplg`** for machines with no DMIC's +* For machines with no DMICs: -**`alsatplg -D DMIC_COUNT=2 -p -c sof-hda-generic.conf -o sof-hda-generic-2ch.tplg`** for machines with 2 DMIC's. + ``alsatplg -p -c sof-hda-generic.conf -o sof-hda-generic.tplg`` -Conditional includes are not limited to top-level configuration files. They can be added to any node -in the configuration file to include the configuration at the specified node. For example, we conditionally -include the right filter coefficients for the byte controls in a EQIIR widget as follows: +* For machines with two DMICs: -Define the argument for the coefficients in the top-level topology file as follows: + ``alsatplg -D DMIC_COUNT=2 -p -c sof-hda-generic.conf -o sof-hda-generic-2ch.tplg`` + +Conditional includes are not limited to top-level configuration files. You can add them to any node +in the configuration file to include the configuration at the specified node. For example, we can conditionally +include the right filter coefficients for the byte controls in the EQIIR widget. + +Define the argument for the coefficients in the top-level topology file: .. code-block:: bash @@ -1252,7 +1300,7 @@ Define the argument for the coefficients in the top-level topology file as follo default "highpass_40hz_0db_48khz" } -And then the coefficients can be included as follows: +And then include the coefficients: .. code-block:: bash @@ -1267,49 +1315,61 @@ And then the coefficients can be included as follows: } } -5. Building 2.0 configuration files -*********************************** -Topology 2.0 configuration files can be compiled to produce the topology binary files using the -alsatplg compiler as follows: +Building 2.0 configuration files +******************************** -alsatplg <-D args=values> -p -c input.conf -o output.tplg +You can use alsatplg to compile Topology 2.0 configuration files and produce the topology binary files: -The -D switch is used to pass comma-separated argument values to the top-level configuration file. +.. code-block:: bash -The -P switch can be used to convert a 2.0 configuration file to the 1.0 configuration file as -follows: + alsatplg <-D args=values> -p -c input.conf -o output.tplg -alsatplg <-D args=values> -P input.conf -o output.conf +The ``-D`` switch is used to pass comma-separated argument values to the top-level configuration file. -6. Topology reminders -********************* +You can use the ``-P`` switch to convert a 2.0 configuration file to the 1.0 configuration file: -1. "index" refers to the pipeline ID in pipeline, widget and control class groups +.. code-block:: bash -2. "id" in the DAI class group objects refers to the link ID as defined in the machine driver in the kernel + alsatplg <-D args=values> -P input.conf -o output.conf -7. Alsaconf reminders -********************* +Topology reminders +****************** -1. "." refers to a node separator. "foo.bar value" is quivalent to +Review the following topology considerations: -.. code-block:: bash +- "index" refers to the pipeline ID in pipeline, widget, and control class groups. + +- "id" in the DAI class group objects refers to the link ID as defined in the machine driver in the kernel. + +Alsaconf reminders +****************** + +Review the following alsaconf considerations: + +- "." refers to a node separator. "foo.bar value" is quivalent to the following: + + .. code-block:: bash foo { bar value } -2. Arrays are defined with [] as below +- Arrays are defined with []. For example: -.. code-block:: bash + .. code-block:: bash !constructor [ "foo" "bar" ] -It is recommended to use the "!" in the array definitions in the class definition. This is to ensure that if the class -configuration file is included more than once from different sources, the array items will not be duplicated. + We recommend to use the exclamation mark (!) in array definitions + within the class definition. Use it to ensure that the array items + are not duplicated if the class configuration file is included more + than once from different sources. .. _volume-playback: https://github.com/thesofproject/sof/blob/main/tools/topology/topology2/include/pipelines/volume-playback.conf .. _buffer: https://github.com/thesofproject/sof/blob/main/tools/topology/topology2/include/components/buffer.conf + +.. |_| unicode:: 0xA0 + :trim: From 19acef8d6b28b13abd154a8bebc04f5194f33802 Mon Sep 17 00:00:00 2001 From: Anton Bobkov Date: Tue, 7 Dec 2021 18:12:58 +0300 Subject: [PATCH 142/290] Edits from Deb --- developer_guides/topology2/topology2.rst | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/developer_guides/topology2/topology2.rst b/developer_guides/topology2/topology2.rst index f2d66f19..0d3538b1 100644 --- a/developer_guides/topology2/topology2.rst +++ b/developer_guides/topology2/topology2.rst @@ -6,8 +6,8 @@ Topology 2.0 This is a high-level keyword extension on top of the existing ALSA conf topology format designed to: -* Simplify the ALSA conf topology definitions by providing high level "classes". Topology - designers need to write less config for commonly defined objects. +* Simplify the ALSA conf topology definitions by providing high level "classes". In this way, topology + designers can write less configurations for commonly defined objects. * Allow simple reuse of objects. Define once and reuse (like M4) with the ability to alter object configuration attributes from defaults. @@ -139,10 +139,10 @@ values separated by '.'. The ``unique`` qualifier indicates that multiple data objects instantiated within the same alsaconf node should have unique values for their ``name`` attribute. If two data objects are instantiated within the same alsaconf -node with the same ``name`` attribute, there will be no errors. But the two object instances will be merged, -And the attribute values in the second instance will override the attribute values in the first one. Therefore, it is the topology -writer's responbility to ensure that multiple instances within the same parent node have different unique attribute -values. +node with the same ``name`` attribute, errors will not occur, but the two object instances will be merged. +Additionally, the attribute values in the second instance will override the attribute values in the first one. +Therefore, it is the topology writer's responsibility to ensure that multiple instances within the same parent +node have different unique attribute values. Let's consider another class definition example for the ``pga`` widget belonging to the class group ``Widget``: @@ -249,7 +249,7 @@ using the following advanced keywords: * **Deprecated:** Attributes that have been deprecated and should not be set in the object instance. -* **Automatic:** Attributes which values are computed by the alsatplg compiler. +* **Automatic:** Attributes whose values are computed by the alsatplg compiler. Let's add some extra attributes and advanced qualifers into the pga class definition: @@ -860,7 +860,7 @@ class is instantiated as: } This ensures that all child objects within the volume-playback object will inherit the -index attribute value from it. So the pga widget object will have the same index. And by the same +index attribute value from it. So the pga widget object will have the same index. By the same rule, the mixer control object within the pga widget object will also have the same index attribute value of 1. From fa06975747dc9ff04bf2644156e3d5d7a3da56e8 Mon Sep 17 00:00:00 2001 From: Anton Bobkov Date: Mon, 13 Dec 2021 17:32:13 +0300 Subject: [PATCH 143/290] Change the release version to 2.0 for the SOF 2.0 release Please merge after the SOF 2.0 release occurs. --- conf.py | 2 +- release.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/conf.py b/conf.py index 574a1455..4e7b7b53 100755 --- a/conf.py +++ b/conf.py @@ -70,7 +70,7 @@ # |version| and |release|, also used in various other places throughout the # built documents. -version = release = "0.1" +version = release = "2.0" # # The short X.Y version. diff --git a/release.rst b/release.rst index 0ff6939e..2d1f65d3 100755 --- a/release.rst +++ b/release.rst @@ -26,7 +26,7 @@ kernel, and documentation. Download the source code as a zip or tar.gz file: Source and Binary Releases -------------------------- -The latest SOF release is v1.9 (October 2021). +The latest SOF release is v2.0 (December 2021). View new feature information and release downloads for the latest and previous releases on GitHub. Firmware and SDK tool source code and binary From 984ca7a8036c4426fd76c3b03e1066ac74208274 Mon Sep 17 00:00:00 2001 From: Jyri Sarha Date: Thu, 9 Dec 2021 17:24:27 +0200 Subject: [PATCH 144/290] build-from-scratch: Minor fix to local alsa-utils install command Do not mess with the host systemd or udev conf if making a local installation to a home directory. Signed-off-by: Jyri Sarha --- getting_started/build-guide/build-from-scratch.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/getting_started/build-guide/build-from-scratch.rst b/getting_started/build-guide/build-from-scratch.rst index 286d4f4f..c2cda4dd 100755 --- a/getting_started/build-guide/build-from-scratch.rst +++ b/getting_started/build-guide/build-from-scratch.rst @@ -157,7 +157,9 @@ Clone, build, and install alsa-utils. # To install alsa-utils locally ./gitcompile --prefix=$HOME/local \ --with-alsa-inc-prefix=$HOME/local/include \ - --with-alsa-prefix=$HOME/local/lib + --with-alsa-prefix=$HOME/local/lib \ + --with-systemdsystemunitdir=$HOME/local/lib/systemd \ + --with-udev-rules-dir=$HOME/local/lib/udev sudo make install If you run into alsa-lib linking errors, try to re-build it with the libdir From 758e01e4bff1f096583fd2b745bfeeba00da4376 Mon Sep 17 00:00:00 2001 From: Kai Vehmanen Date: Thu, 9 Dec 2021 13:07:03 +0200 Subject: [PATCH 145/290] developer_guides: add coredump-reader example usage on Linux Add documentation and practical example how to extract the DSP coredump via Linux SOF driver debugfs interface and how to parse the result with coredump-reader. v2: update text with corrections from Anton Bobkov Signed-off-by: Kai Vehmanen --- .../debugability/coredump-reader/index.rst | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/developer_guides/debugability/coredump-reader/index.rst b/developer_guides/debugability/coredump-reader/index.rst index 1400a073..71661c82 100644 --- a/developer_guides/debugability/coredump-reader/index.rst +++ b/developer_guides/debugability/coredump-reader/index.rst @@ -30,3 +30,53 @@ We read from dump file into sof-coredump-reader.py, then we pipe its output to x .. code-block:: bash ./sof-coredump-to-gdb.sh sof-apl dump_file + +Usage with Linux SOF Driver +*************************** + +If a core dump occurs after a DSP error, the Linux SOF driver allows +accessing the dump via debugfs. Consider the following example of capturing +the dump file and processing it with coredump-reader: + +.. code-block:: bash + + dut> cat /sys/kernel/debug/sof/exception >dsp-coredump + # transfer file to host + host> sof/tools/coredumper/sof-coredump-reader.py -v -l 4 -i dsp-coredump -o dsp-coredump.gdb + host> xt-gdb sof/build_tlg_xcc/sof --command=dsp-coredump.gdb + [cut] + $1 = "Exception location:" + 0xbe02fb29 is in ipc_glb_debug_message (/home/user/sof/src/ipc/handler-ipc3.c:1371). + [cut] + $2 = "backtrace" + #0 0xbe051b00 in literals () + #1 0xbe04e277 in dump_stack (p=3187705884, addr=0x1cc6c29b, offset=3270769662, limit=380, stack_ptr=0x1) at /home/user//sof/src/arch/xtensa/include/arch/lib/cache.h:79 + #2 0xbe04e2f7 in panic_dump (p=233492486, panic_info=0x0, data=0xbe0a4130) at /home/user/sof/src/arch/xtensa/include/arch/debug/panic.h:45 + #3 0xbe02dfd9 in exception () at /home/user/sof/src/arch/xtensa/init.c:115 + #4 0xbe050a28 in _GeneralException () + #5 0xbe02fb29 in ipc_glb_debug_message (header=394016) at /home/user/sof/src/ipc/handler-ipc3.c:1373 + [cut] + (xt-gdb) info all-registers + pc 0xbe051b00 0xbe051b00 + ar0 0x0 0 + ar1 0xbe00a044 -1107255228 + ar2 0x10000 65536 + +Notes: + +- Coredump-reader only works with the xcc toolchain. + +- If the Linux kernel fails to probe, the exception file cannot be read. + +- To prevent runtime suspend from powering off the DSP and erasing + the exception data, perform one of the following steps: + + - Set the ``CONFIG_SND_SOC_SOF_DEBUG_RETAIN_DSP_CONTEXT`` option in the + kernel to ensure DSP is left powered on if a DSP crash occurs. + + - Disable runtime power management (PM) with a module parameter. + For example, for PCI devices:: + options sof_pci_dev sof_pci_debug=1 + +- The DSP core dump information is also printed to kernel dmesg, but + sof-coredump-reader.py cannot parse this core dump format. From 44344d27bf6004556a34ae387c420e453dfc826f Mon Sep 17 00:00:00 2001 From: Marc Herbert Date: Tue, 21 Dec 2021 01:45:23 +0000 Subject: [PATCH 146/290] unit_tests: add workaround for uintptr_t redefinition Also regroup -DTOOLCHAIN=xt closer to the other flags, stop hiding it after the example. Signed-off-by: Marc Herbert --- developer_guides/unit_tests.rst | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/developer_guides/unit_tests.rst b/developer_guides/unit_tests.rst index 3b1008dd..93e0e0e7 100644 --- a/developer_guides/unit_tests.rst +++ b/developer_guides/unit_tests.rst @@ -35,6 +35,28 @@ and re-use to build unit tests. Like this: ``-DINIT_CONFIG`` and a new build directory - Build and run the tests with ``make test`` or ``ninja test``. +.. note:: + + Use -DTOOLCHAIN=xt option. + + As of December 2021, -DTOOLCHAIN=xtensa--elf is not + supported. You can use a native toolchain, see below. + +If you get this double ``uintptr_t`` definition error: + +.. code-block:: bash + + [ 2%] Building C object test/cmocka/CMakeFiles/common_mock.dir/src/common_mocks.c.o + In file included from sof/test/cmocka/src/common_mocks.c:29: + sof/but/cmocka_git/src/cmocka_git/include/cmocka.h:132: + error: redefinition of typedef ‘uintptr_t’ + xcc/install/builds/RG-2017.8-linux/X4H3I16w2D48w3a_2017_8/xtensa-elf/include/stdint.h:252: + error: previous declaration of ‘uintptr_t’ was here + +... then append this to your cmake invocation: ``-DEXTRA_CFLAGS=-D_UINTPTR_T_DEFINED=1`` + +Additional unit tests options can be found in :ref:`cmake`. + Example: Running tests for APL ============================== @@ -45,12 +67,6 @@ Example: Running tests for APL -DROOT_DIR=/xcc/install/builds/RG-2017.8-linux/X4H3I16w2D48w3a_2017_8/xtensa-elf .. make -j4 && ctest -j8 -.. note:: - - Use -DTOOLCHAIN=xt option, -DTOOLCHAIN=xtensa--elf is not supported - -Additional unit tests options can be found in :ref:`cmake`. - Compiling unit tests without a cross-compilation toolchain ========================================================== From a099bba192cead6ebd95be2758c9d861cf6e7e6c Mon Sep 17 00:00:00 2001 From: Jyri Sarha Date: Wed, 29 Dec 2021 23:53:38 +0200 Subject: [PATCH 147/290] ktest: Change sof-mach-driver-defconfig to mach-driver-defconfig All machine drivers were merged under same defconfig in sof kconfig repository and the name of the defoconfig file was changed in the process. Signed-off-by: Jyri Sarha --- getting_started/setup/setup_ktest_environment.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/getting_started/setup/setup_ktest_environment.rst b/getting_started/setup/setup_ktest_environment.rst index 41ed55b1..1b800ffd 100644 --- a/getting_started/setup/setup_ktest_environment.rst +++ b/getting_started/setup/setup_ktest_environment.rst @@ -256,7 +256,7 @@ If you don't know what options are needed, you can start using configurations ma git clone https://github.com/thesofproject/kconfig.git cd linux make defconfig - scripts/kconfig/merge_config.sh .config ../kconfig/base-defconfig ../kconfig/sof-defconfig ../kconfig/sof-mach-driver-defconfig ../kconfig/hdaudio-codecs-defconfig + scripts/kconfig/merge_config.sh .config ../kconfig/base-defconfig ../kconfig/sof-defconfig ../kconfig/mach-driver-defconfig ../kconfig/hdaudio-codecs-defconfig cp .config ../sof-dev-defconfig make mrproper cd .. From f6377950c0c1e725e2cccc36917d21c9bb92bd67 Mon Sep 17 00:00:00 2001 From: Michal Wasko Date: Wed, 29 Dec 2021 13:36:20 +0100 Subject: [PATCH 148/290] Re-name architecture chapters tree Change DSP Architecture to Firmware Architecture. Signed-off-by: Michal Wasko --- architectures/{dsp => firmware}/index.rst | 11 +++++------ .../intel/cavs-boot/apollolake/apl-boot-ldr.rst | 0 .../intel/cavs-boot/apollolake/apl-boot-rom.rst | 0 .../intel/cavs-boot/apollolake/images/apl-rom-flow.pu | 0 .../intel/cavs-boot/apollolake/index.rst | 0 .../intel/cavs-boot/cavs-dsp-boot-overview.rst | 0 .../intel/cavs-boot/images/boot-dsp.pu | 0 .../intel/cavs-boot/images/boot-ldr-flow.pu | 0 .../intel/cavs-boot/images/loading-bins.pu | 0 .../intel/cavs-boot/images/write-bin.pu | 0 .../{dsp => firmware}/intel/cavs-boot/index.rst | 0 .../intel/images/idc-send-message.pu | 0 architectures/{dsp => firmware}/intel/index.rst | 0 architectures/{dsp => firmware}/intel/smp/index.rst | 0 architectures/index.rst | 4 ++-- 15 files changed, 7 insertions(+), 8 deletions(-) rename architectures/{dsp => firmware}/index.rst (96%) rename architectures/{dsp => firmware}/intel/cavs-boot/apollolake/apl-boot-ldr.rst (100%) rename architectures/{dsp => firmware}/intel/cavs-boot/apollolake/apl-boot-rom.rst (100%) rename architectures/{dsp => firmware}/intel/cavs-boot/apollolake/images/apl-rom-flow.pu (100%) rename architectures/{dsp => firmware}/intel/cavs-boot/apollolake/index.rst (100%) rename architectures/{dsp => firmware}/intel/cavs-boot/cavs-dsp-boot-overview.rst (100%) rename architectures/{dsp => firmware}/intel/cavs-boot/images/boot-dsp.pu (100%) rename architectures/{dsp => firmware}/intel/cavs-boot/images/boot-ldr-flow.pu (100%) rename architectures/{dsp => firmware}/intel/cavs-boot/images/loading-bins.pu (100%) rename architectures/{dsp => firmware}/intel/cavs-boot/images/write-bin.pu (100%) rename architectures/{dsp => firmware}/intel/cavs-boot/index.rst (100%) rename architectures/{dsp => firmware}/intel/images/idc-send-message.pu (100%) rename architectures/{dsp => firmware}/intel/index.rst (100%) rename architectures/{dsp => firmware}/intel/smp/index.rst (100%) diff --git a/architectures/dsp/index.rst b/architectures/firmware/index.rst similarity index 96% rename from architectures/dsp/index.rst rename to architectures/firmware/index.rst index 1d19a785..b7b25a2b 100644 --- a/architectures/dsp/index.rst +++ b/architectures/firmware/index.rst @@ -1,7 +1,7 @@ -.. _architecture-dsp: +.. _architecture-firmware: -DSP Architecture -################ +Firmware Architecture +##################### Currently SOF has support for the Cadence Xtensa DSP architecture in UP and SMP modes in the upstream code base today. @@ -43,7 +43,7 @@ main sections: Each section above is well insulated from the other sections by partitioning code into separate directories and by using DSP and platform agnostic generic -APIs for orchestration between the sections. +APIs for orchestration between the sections. Adding a new DSP architecture to SOF ==================================== @@ -78,7 +78,6 @@ from the SOF build in order to use the RTOS version if desireable i.e. allocator, schedulers, messaging etc. The final stage is to link the SOF audio code to the RTOS. - Vendor Specific Architecture Information ======================================== @@ -92,4 +91,4 @@ Intel .. toctree:: :maxdepth: 1 - intel/index + intel/index \ No newline at end of file diff --git a/architectures/dsp/intel/cavs-boot/apollolake/apl-boot-ldr.rst b/architectures/firmware/intel/cavs-boot/apollolake/apl-boot-ldr.rst similarity index 100% rename from architectures/dsp/intel/cavs-boot/apollolake/apl-boot-ldr.rst rename to architectures/firmware/intel/cavs-boot/apollolake/apl-boot-ldr.rst diff --git a/architectures/dsp/intel/cavs-boot/apollolake/apl-boot-rom.rst b/architectures/firmware/intel/cavs-boot/apollolake/apl-boot-rom.rst similarity index 100% rename from architectures/dsp/intel/cavs-boot/apollolake/apl-boot-rom.rst rename to architectures/firmware/intel/cavs-boot/apollolake/apl-boot-rom.rst diff --git a/architectures/dsp/intel/cavs-boot/apollolake/images/apl-rom-flow.pu b/architectures/firmware/intel/cavs-boot/apollolake/images/apl-rom-flow.pu similarity index 100% rename from architectures/dsp/intel/cavs-boot/apollolake/images/apl-rom-flow.pu rename to architectures/firmware/intel/cavs-boot/apollolake/images/apl-rom-flow.pu diff --git a/architectures/dsp/intel/cavs-boot/apollolake/index.rst b/architectures/firmware/intel/cavs-boot/apollolake/index.rst similarity index 100% rename from architectures/dsp/intel/cavs-boot/apollolake/index.rst rename to architectures/firmware/intel/cavs-boot/apollolake/index.rst diff --git a/architectures/dsp/intel/cavs-boot/cavs-dsp-boot-overview.rst b/architectures/firmware/intel/cavs-boot/cavs-dsp-boot-overview.rst similarity index 100% rename from architectures/dsp/intel/cavs-boot/cavs-dsp-boot-overview.rst rename to architectures/firmware/intel/cavs-boot/cavs-dsp-boot-overview.rst diff --git a/architectures/dsp/intel/cavs-boot/images/boot-dsp.pu b/architectures/firmware/intel/cavs-boot/images/boot-dsp.pu similarity index 100% rename from architectures/dsp/intel/cavs-boot/images/boot-dsp.pu rename to architectures/firmware/intel/cavs-boot/images/boot-dsp.pu diff --git a/architectures/dsp/intel/cavs-boot/images/boot-ldr-flow.pu b/architectures/firmware/intel/cavs-boot/images/boot-ldr-flow.pu similarity index 100% rename from architectures/dsp/intel/cavs-boot/images/boot-ldr-flow.pu rename to architectures/firmware/intel/cavs-boot/images/boot-ldr-flow.pu diff --git a/architectures/dsp/intel/cavs-boot/images/loading-bins.pu b/architectures/firmware/intel/cavs-boot/images/loading-bins.pu similarity index 100% rename from architectures/dsp/intel/cavs-boot/images/loading-bins.pu rename to architectures/firmware/intel/cavs-boot/images/loading-bins.pu diff --git a/architectures/dsp/intel/cavs-boot/images/write-bin.pu b/architectures/firmware/intel/cavs-boot/images/write-bin.pu similarity index 100% rename from architectures/dsp/intel/cavs-boot/images/write-bin.pu rename to architectures/firmware/intel/cavs-boot/images/write-bin.pu diff --git a/architectures/dsp/intel/cavs-boot/index.rst b/architectures/firmware/intel/cavs-boot/index.rst similarity index 100% rename from architectures/dsp/intel/cavs-boot/index.rst rename to architectures/firmware/intel/cavs-boot/index.rst diff --git a/architectures/dsp/intel/images/idc-send-message.pu b/architectures/firmware/intel/images/idc-send-message.pu similarity index 100% rename from architectures/dsp/intel/images/idc-send-message.pu rename to architectures/firmware/intel/images/idc-send-message.pu diff --git a/architectures/dsp/intel/index.rst b/architectures/firmware/intel/index.rst similarity index 100% rename from architectures/dsp/intel/index.rst rename to architectures/firmware/intel/index.rst diff --git a/architectures/dsp/intel/smp/index.rst b/architectures/firmware/intel/smp/index.rst similarity index 100% rename from architectures/dsp/intel/smp/index.rst rename to architectures/firmware/intel/smp/index.rst diff --git a/architectures/index.rst b/architectures/index.rst index 246cb14c..b16f224b 100644 --- a/architectures/index.rst +++ b/architectures/index.rst @@ -1,6 +1,6 @@ .. _architectures: -Supported Architectures +Architecture ####################### SOF is intended to run on many different hardware architectures and is therefore @@ -15,4 +15,4 @@ should always be consulted for the low level details. :maxdepth: 2 host/index - dsp/index + firmware/index From fa3716062486d70b51059ee7be0110e0088bc7c1 Mon Sep 17 00:00:00 2001 From: Michal Wasko Date: Wed, 29 Dec 2021 13:46:44 +0100 Subject: [PATCH 149/290] Move Add new DSP architecture chapter to developers guide Signed-off-by: Michal Wasko --- architectures/firmware/index.rst | 33 ------------------------------- developer_guides/add_new_arch.rst | 33 +++++++++++++++++++++++++++++++ developer_guides/index.rst | 1 + 3 files changed, 34 insertions(+), 33 deletions(-) create mode 100644 developer_guides/add_new_arch.rst diff --git a/architectures/firmware/index.rst b/architectures/firmware/index.rst index b7b25a2b..fd2ca745 100644 --- a/architectures/firmware/index.rst +++ b/architectures/firmware/index.rst @@ -45,39 +45,6 @@ Each section above is well insulated from the other sections by partitioning code into separate directories and by using DSP and platform agnostic generic APIs for orchestration between the sections. -Adding a new DSP architecture to SOF -==================================== - -This is not yet a guide for architecure porting, but in general are two ways to -add support for new DSP architectures to SOF. - -#. Write a new Hardware Abstraction Layer (HAL) for your DSP. - -#. Use an existing RTOS that supports your DSP architecture as a HAL for SOF. - -Both methods require a working compiler for the new DSP architecture and -preferrably an emulation environment or hardware debugger to help with the -bringup and debug. - -Method 1 - New HAL ------------------- - -The main work in adding the new architecture HAL is duplicating and porting the -src/arch directory to your new architecture. The code in the architecture -directory mainly deals with architecture abstraction and initialization of any -architecture IP like MMU, IRQs and caches alongside providing optimized -versions of some common C functions (memcpy, memset, etc) for that architecture. -Adding a new architecture also usually means adding a new host platform too. - -Method 2 - Use existing RTOS ----------------------------- - -This method involves creating a HAL by wrapping the RTOS functions used by SOF -as thinly as possible (i.e. to compile out). It also means removing unused code -from the SOF build in order to use the RTOS version if desireable i.e. -allocator, schedulers, messaging etc. The final stage is to link the SOF audio -code to the RTOS. - Vendor Specific Architecture Information ======================================== diff --git a/developer_guides/add_new_arch.rst b/developer_guides/add_new_arch.rst new file mode 100644 index 00000000..b0ba708c --- /dev/null +++ b/developer_guides/add_new_arch.rst @@ -0,0 +1,33 @@ +.. _add_new_arch: + +Adding a new DSP architecture to SOF +==================================== + +This is not yet a guide for architecure porting, but in general, you can add +support for a new DSP architectures to SOF in the following two ways: + +- Write a new Hardware Abstraction Layer (HAL) for your DSP. +- Use an existing RTOS that supports your DSP architecture as a HAL for SOF. + +Both methods require a working compiler for the new DSP architecture and +preferrably an emulation environment or hardware debugger to help with the +bringup and debug. + +Method 1 - New HAL +------------------ + +The main work in adding the new architecture HAL is duplicating and porting the +src/arch directory to your new architecture. The code in the architecture +directory mainly deals with architecture abstraction and initialization of any +architecture IP like MMU, IRQs and caches alongside providing optimized +versions of some common C functions (memcpy, memset, etc) for that architecture. +Adding a new architecture also usually means adding a new host platform too. + +Method 2 - Use existing RTOS +---------------------------- + +This method involves creating a HAL by wrapping the RTOS functions used by SOF +as thinly as possible (i.e. to compile out). It also means removing unused code +from the SOF build in order to use the RTOS version if desireable i.e. +allocator, schedulers, messaging etc. The final stage is to link the SOF audio +code to the RTOS. diff --git a/developer_guides/index.rst b/developer_guides/index.rst index 3ef80cdd..5ac976e5 100644 --- a/developer_guides/index.rst +++ b/developer_guides/index.rst @@ -24,6 +24,7 @@ terminology before reading further. virtualization/running fuzzing/index testbench/index + add_new_arch Technical Notes *************** From f5199233e93e1043e855e70798024a867bfe57b5 Mon Sep 17 00:00:00 2001 From: Michal Wasko Date: Wed, 29 Dec 2021 14:24:04 +0100 Subject: [PATCH 150/290] Move Linux Driver architecture to Architecture tree Signed-off-by: Michal Wasko --- architectures/host/index.rst | 63 +----------------- .../architecture/images/sof-driver-arch-1.png | Bin .../architecture/images/sof-driver-arch-2.png | Bin .../architecture/sof_driver_arch.rst | 14 +++- developer_guides/linux_driver/index.rst | 1 - 5 files changed, 15 insertions(+), 63 deletions(-) rename {developer_guides => architectures/host}/linux_driver/architecture/images/sof-driver-arch-1.png (100%) rename {developer_guides => architectures/host}/linux_driver/architecture/images/sof-driver-arch-2.png (100%) rename {developer_guides => architectures/host}/linux_driver/architecture/sof_driver_arch.rst (97%) diff --git a/architectures/host/index.rst b/architectures/host/index.rst index 30d8bb2a..a7a3cd13 100644 --- a/architectures/host/index.rst +++ b/architectures/host/index.rst @@ -3,64 +3,7 @@ Host Architecture ################# -SOF Driver Architecture -======================= - -|SOF| can either operate as a standalone firmware or alongside a host OS -driver for configuration and control. The |SOF| OS driver is responsible for -loading firmware, loading configuration and managing firmware use cases. -Currently |SOF| has a driver for the Linux OS. - -The |SOF| driver code is dual licensed GPLv2 and BSD and this means the user -can choose which licence they want to use (either BSD or GPLv2). The driver -stack is designed with maximum resuse so that large portions of it can be -taken and integrated into other OSs or RTOSs. - -.. seealso:: - - Refer to the indepth :ref:`sof_driver_arch` document for more information. - -Linux Driver ------------- - -The Linux ASoC driver is upstream in the Linux kernel from v5.2 onwards. The -architecture for |SOF| is shown in the diagram below. The driver -architecture is split into four layers, like a protocol stack, each with a -different purpose. - -#. **Machine driver.** The ASoC machine driver does all the - machine/board audio hardware integration. It also glues the platform - driver and drivers for any codec(s) together so they appear as a single - ALSA sound card. |SOF| can reuse existing upstream machine drivers (as - only the platform name needs to be changed) or can have bespoke machine - drivers. *Linux OS specific - GPLv2 only.* - -#. **Generic PCM Driver.** The PCM driver creates ALSA PCMs, DAPM, and - kcontrols based on the topology data loaded at run time. The PCM driver - also allocates buffers for DMA and registers with run time PM. It is - architecture and platform generic code. Generic for all **platforms**, - but OS specific - GPLv2 only.* - -#. **Generic IPC driver.** The IPC driver is the messaging bridge - between the host and DSP and defines the messaging ABI and protocol. It - is architecture and platform generic code. *Generic OS - BSD or GPLv2.* - -#. **DSP Platform Driver.** The platform driver is a platform specific - driver that abstracts the low level platform DSP hardware into a common - generic API that is used by the upper layers. This includes code that - will initialize the DSP and boot the firmware. *Generic OS - BSD or GPLv2.* - - - .. figure:: ../images/driver-arch-diag.png - :align: center - :alt: SOF Driver Architecture - :width: 800px - - `Sound Open Firmware Linux Driver Architecture. The right-hand side of - the diagram shows the mailbox/doorbell mechanism and the DSP. - The Linux PCM and IPC drivers can be reused without modification on every - platform. Runtime differentiation can be achived by regenerating - topology data to match device use cases whilst static hardware - differentiation is achieved via the machine driver and/or ACPI / Device - Tree configuration.` +.. toctree:: + :maxdepth: 1 + linux_driver/architecture/sof_driver_arch.rst diff --git a/developer_guides/linux_driver/architecture/images/sof-driver-arch-1.png b/architectures/host/linux_driver/architecture/images/sof-driver-arch-1.png similarity index 100% rename from developer_guides/linux_driver/architecture/images/sof-driver-arch-1.png rename to architectures/host/linux_driver/architecture/images/sof-driver-arch-1.png diff --git a/developer_guides/linux_driver/architecture/images/sof-driver-arch-2.png b/architectures/host/linux_driver/architecture/images/sof-driver-arch-2.png similarity index 100% rename from developer_guides/linux_driver/architecture/images/sof-driver-arch-2.png rename to architectures/host/linux_driver/architecture/images/sof-driver-arch-2.png diff --git a/developer_guides/linux_driver/architecture/sof_driver_arch.rst b/architectures/host/linux_driver/architecture/sof_driver_arch.rst similarity index 97% rename from developer_guides/linux_driver/architecture/sof_driver_arch.rst rename to architectures/host/linux_driver/architecture/sof_driver_arch.rst index a307b1d7..61f774f9 100644 --- a/developer_guides/linux_driver/architecture/sof_driver_arch.rst +++ b/architectures/host/linux_driver/architecture/sof_driver_arch.rst @@ -1,7 +1,17 @@ .. _sof_driver_arch: -SOF Driver Architecture -####################### +SOF Linux Driver Architecture +############################# + +|SOF| can either operate as a standalone firmware or alongside a host OS +driver for configuration and control. The |SOF| OS driver is responsible for +loading firmware, loading configuration and managing firmware use cases. +Currently |SOF| has a driver for the Linux OS. + +The |SOF| driver code is dual licensed GPLv2 and BSD and this means the user +can choose which licence they want to use (either BSD or GPLv2). The driver +stack is designed with maximum resuse so that large portions of it can be +taken and integrated into other OSs or RTOSs. .. contents:: :local: diff --git a/developer_guides/linux_driver/index.rst b/developer_guides/linux_driver/index.rst index 4082c00b..c6534d70 100644 --- a/developer_guides/linux_driver/index.rst +++ b/developer_guides/linux_driver/index.rst @@ -6,6 +6,5 @@ SOF Linux Driver .. toctree:: :maxdepth: 1 - architecture/sof_driver_arch third_party/index From be45234485fab19fb8c308712fa5f15231c12559 Mon Sep 17 00:00:00 2001 From: Michal Wasko Date: Wed, 29 Dec 2021 15:17:02 +0100 Subject: [PATCH 151/290] Move FW architecture details to Architecture tree Signed-off-by: Michal Wasko --- .../firmware/components/component-mgmt-api.rst | 0 .../firmware/components/component-overview.rst | 0 .../firmware/components/images/comp-dev-states.pu | 0 .../firmware/components/images/comp-driver.pu | 0 .../firmware/components/images/comp-new-flow.pu | 0 .../components/images/component-mgmt-api.pu | 0 .../firmware/components/index.rst | 0 .../firmware/drivers/dai/images/dai-ops.pu | 0 .../firmware/drivers/dai/images/dai-set-config.pu | 0 .../firmware/drivers/dai/index.rst | 0 .../firmware/drivers/dma/images/dma-ops.pu | 0 .../firmware/drivers/dma/images/dma-transfer.pu | 0 .../firmware/drivers/dma/index.rst | 0 .../firmware/drivers/dma/intel/hda-dma.rst | 0 .../drivers/dma/intel/images/hda-host-output.pu | 0 .../firmware/drivers/dma/intel/images/hda-link.pu | 0 .../drivers/dma/intel/images/hda-start-flow.pu | 0 .../drivers/dma/intel/images/hda-stop-flow.pu | 0 .../firmware/drivers/dma/intel/index.rst | 0 .../firmware/drivers/images/device-disco.pu | 0 .../firmware/drivers/images/device-probe.pu | 0 .../firmware/drivers/images/device-remove.pu | 0 .../firmware/drivers/index.rst | 0 .../firmware/images/edf-scheduler-deps.pu | 0 .../firmware/images/edf-scheduler-flow.pu | 0 .../firmware/images/ll-scheduler-deps.pu | 0 .../firmware/images/ll-scheduler-flow.pu | 0 .../firmware/images/memory-zones.dot | 0 .../firmware/images/runtime-zone.dot | 0 .../firmware/images/scheduler-ops.pu | 0 .../firmware/images/system-zone.dot | 0 architectures/firmware/index.rst | 14 ++++++++++++++ .../kd_integration/images/kd-component-diagram.pu | 0 .../images/kd-e2e-sequence-diagram.pu | 0 .../kd_integration/images/kd-state-diagram.pu | 0 .../kd_integration/images/kd-timing-diagram.pu | 0 .../firmware/kd_integration/index.rst | 0 .../firmware/kd_integration/kd-integration.rst | 0 .../firmware/mem-mgmt.rst | 0 .../firmware/pipelines/images/ppl-new.pu | 0 .../firmware/pipelines/images/ppl-op-downstream.pu | 0 .../firmware/pipelines/images/ppl-operations.pu | 0 .../firmware/pipelines/images/ppl-params.pu | 0 .../firmware/pipelines/images/ppl-reset.pu | 0 .../firmware/pipelines/images/ppl-struct.pu | 0 .../firmware/pipelines/images/ppl-task.pu | 0 .../firmware/pipelines/index.rst | 0 .../firmware/pm-runtime/images/pm-dsp-core-idle.pu | 0 .../firmware/pm-runtime/images/pm-dsp-core-init.pu | 0 .../firmware/pm-runtime/index.rst | 0 .../intel/images/dsp-core-lps-cavs-d0-d0i3-d0.pu | 0 .../firmware/pm-runtime/intel/pm-dsp-core-cavs.rst | 0 .../firmware/pm-runtime/pm-dsp-core.rst | 0 .../firmware/schedulers.rst | 0 developer_guides/firmware/index.rst | 7 ------- 55 files changed, 14 insertions(+), 7 deletions(-) rename {developer_guides => architectures}/firmware/components/component-mgmt-api.rst (100%) rename {developer_guides => architectures}/firmware/components/component-overview.rst (100%) rename {developer_guides => architectures}/firmware/components/images/comp-dev-states.pu (100%) rename {developer_guides => architectures}/firmware/components/images/comp-driver.pu (100%) rename {developer_guides => architectures}/firmware/components/images/comp-new-flow.pu (100%) rename {developer_guides => architectures}/firmware/components/images/component-mgmt-api.pu (100%) rename {developer_guides => architectures}/firmware/components/index.rst (100%) rename {developer_guides => architectures}/firmware/drivers/dai/images/dai-ops.pu (100%) rename {developer_guides => architectures}/firmware/drivers/dai/images/dai-set-config.pu (100%) rename {developer_guides => architectures}/firmware/drivers/dai/index.rst (100%) rename {developer_guides => architectures}/firmware/drivers/dma/images/dma-ops.pu (100%) rename {developer_guides => architectures}/firmware/drivers/dma/images/dma-transfer.pu (100%) rename {developer_guides => architectures}/firmware/drivers/dma/index.rst (100%) rename {developer_guides => architectures}/firmware/drivers/dma/intel/hda-dma.rst (100%) rename {developer_guides => architectures}/firmware/drivers/dma/intel/images/hda-host-output.pu (100%) rename {developer_guides => architectures}/firmware/drivers/dma/intel/images/hda-link.pu (100%) rename {developer_guides => architectures}/firmware/drivers/dma/intel/images/hda-start-flow.pu (100%) rename {developer_guides => architectures}/firmware/drivers/dma/intel/images/hda-stop-flow.pu (100%) rename {developer_guides => architectures}/firmware/drivers/dma/intel/index.rst (100%) rename {developer_guides => architectures}/firmware/drivers/images/device-disco.pu (100%) rename {developer_guides => architectures}/firmware/drivers/images/device-probe.pu (100%) rename {developer_guides => architectures}/firmware/drivers/images/device-remove.pu (100%) rename {developer_guides => architectures}/firmware/drivers/index.rst (100%) rename {developer_guides => architectures}/firmware/images/edf-scheduler-deps.pu (100%) rename {developer_guides => architectures}/firmware/images/edf-scheduler-flow.pu (100%) rename {developer_guides => architectures}/firmware/images/ll-scheduler-deps.pu (100%) rename {developer_guides => architectures}/firmware/images/ll-scheduler-flow.pu (100%) rename {developer_guides => architectures}/firmware/images/memory-zones.dot (100%) rename {developer_guides => architectures}/firmware/images/runtime-zone.dot (100%) rename {developer_guides => architectures}/firmware/images/scheduler-ops.pu (100%) rename {developer_guides => architectures}/firmware/images/system-zone.dot (100%) rename {developer_guides => architectures}/firmware/kd_integration/images/kd-component-diagram.pu (100%) rename {developer_guides => architectures}/firmware/kd_integration/images/kd-e2e-sequence-diagram.pu (100%) rename {developer_guides => architectures}/firmware/kd_integration/images/kd-state-diagram.pu (100%) rename {developer_guides => architectures}/firmware/kd_integration/images/kd-timing-diagram.pu (100%) rename {developer_guides => architectures}/firmware/kd_integration/index.rst (100%) rename {developer_guides => architectures}/firmware/kd_integration/kd-integration.rst (100%) rename {developer_guides => architectures}/firmware/mem-mgmt.rst (100%) rename {developer_guides => architectures}/firmware/pipelines/images/ppl-new.pu (100%) rename {developer_guides => architectures}/firmware/pipelines/images/ppl-op-downstream.pu (100%) rename {developer_guides => architectures}/firmware/pipelines/images/ppl-operations.pu (100%) rename {developer_guides => architectures}/firmware/pipelines/images/ppl-params.pu (100%) rename {developer_guides => architectures}/firmware/pipelines/images/ppl-reset.pu (100%) rename {developer_guides => architectures}/firmware/pipelines/images/ppl-struct.pu (100%) rename {developer_guides => architectures}/firmware/pipelines/images/ppl-task.pu (100%) rename {developer_guides => architectures}/firmware/pipelines/index.rst (100%) rename {developer_guides => architectures}/firmware/pm-runtime/images/pm-dsp-core-idle.pu (100%) rename {developer_guides => architectures}/firmware/pm-runtime/images/pm-dsp-core-init.pu (100%) rename {developer_guides => architectures}/firmware/pm-runtime/index.rst (100%) rename {developer_guides => architectures}/firmware/pm-runtime/intel/images/dsp-core-lps-cavs-d0-d0i3-d0.pu (100%) rename {developer_guides => architectures}/firmware/pm-runtime/intel/pm-dsp-core-cavs.rst (100%) rename {developer_guides => architectures}/firmware/pm-runtime/pm-dsp-core.rst (100%) rename {developer_guides => architectures}/firmware/schedulers.rst (100%) diff --git a/developer_guides/firmware/components/component-mgmt-api.rst b/architectures/firmware/components/component-mgmt-api.rst similarity index 100% rename from developer_guides/firmware/components/component-mgmt-api.rst rename to architectures/firmware/components/component-mgmt-api.rst diff --git a/developer_guides/firmware/components/component-overview.rst b/architectures/firmware/components/component-overview.rst similarity index 100% rename from developer_guides/firmware/components/component-overview.rst rename to architectures/firmware/components/component-overview.rst diff --git a/developer_guides/firmware/components/images/comp-dev-states.pu b/architectures/firmware/components/images/comp-dev-states.pu similarity index 100% rename from developer_guides/firmware/components/images/comp-dev-states.pu rename to architectures/firmware/components/images/comp-dev-states.pu diff --git a/developer_guides/firmware/components/images/comp-driver.pu b/architectures/firmware/components/images/comp-driver.pu similarity index 100% rename from developer_guides/firmware/components/images/comp-driver.pu rename to architectures/firmware/components/images/comp-driver.pu diff --git a/developer_guides/firmware/components/images/comp-new-flow.pu b/architectures/firmware/components/images/comp-new-flow.pu similarity index 100% rename from developer_guides/firmware/components/images/comp-new-flow.pu rename to architectures/firmware/components/images/comp-new-flow.pu diff --git a/developer_guides/firmware/components/images/component-mgmt-api.pu b/architectures/firmware/components/images/component-mgmt-api.pu similarity index 100% rename from developer_guides/firmware/components/images/component-mgmt-api.pu rename to architectures/firmware/components/images/component-mgmt-api.pu diff --git a/developer_guides/firmware/components/index.rst b/architectures/firmware/components/index.rst similarity index 100% rename from developer_guides/firmware/components/index.rst rename to architectures/firmware/components/index.rst diff --git a/developer_guides/firmware/drivers/dai/images/dai-ops.pu b/architectures/firmware/drivers/dai/images/dai-ops.pu similarity index 100% rename from developer_guides/firmware/drivers/dai/images/dai-ops.pu rename to architectures/firmware/drivers/dai/images/dai-ops.pu diff --git a/developer_guides/firmware/drivers/dai/images/dai-set-config.pu b/architectures/firmware/drivers/dai/images/dai-set-config.pu similarity index 100% rename from developer_guides/firmware/drivers/dai/images/dai-set-config.pu rename to architectures/firmware/drivers/dai/images/dai-set-config.pu diff --git a/developer_guides/firmware/drivers/dai/index.rst b/architectures/firmware/drivers/dai/index.rst similarity index 100% rename from developer_guides/firmware/drivers/dai/index.rst rename to architectures/firmware/drivers/dai/index.rst diff --git a/developer_guides/firmware/drivers/dma/images/dma-ops.pu b/architectures/firmware/drivers/dma/images/dma-ops.pu similarity index 100% rename from developer_guides/firmware/drivers/dma/images/dma-ops.pu rename to architectures/firmware/drivers/dma/images/dma-ops.pu diff --git a/developer_guides/firmware/drivers/dma/images/dma-transfer.pu b/architectures/firmware/drivers/dma/images/dma-transfer.pu similarity index 100% rename from developer_guides/firmware/drivers/dma/images/dma-transfer.pu rename to architectures/firmware/drivers/dma/images/dma-transfer.pu diff --git a/developer_guides/firmware/drivers/dma/index.rst b/architectures/firmware/drivers/dma/index.rst similarity index 100% rename from developer_guides/firmware/drivers/dma/index.rst rename to architectures/firmware/drivers/dma/index.rst diff --git a/developer_guides/firmware/drivers/dma/intel/hda-dma.rst b/architectures/firmware/drivers/dma/intel/hda-dma.rst similarity index 100% rename from developer_guides/firmware/drivers/dma/intel/hda-dma.rst rename to architectures/firmware/drivers/dma/intel/hda-dma.rst diff --git a/developer_guides/firmware/drivers/dma/intel/images/hda-host-output.pu b/architectures/firmware/drivers/dma/intel/images/hda-host-output.pu similarity index 100% rename from developer_guides/firmware/drivers/dma/intel/images/hda-host-output.pu rename to architectures/firmware/drivers/dma/intel/images/hda-host-output.pu diff --git a/developer_guides/firmware/drivers/dma/intel/images/hda-link.pu b/architectures/firmware/drivers/dma/intel/images/hda-link.pu similarity index 100% rename from developer_guides/firmware/drivers/dma/intel/images/hda-link.pu rename to architectures/firmware/drivers/dma/intel/images/hda-link.pu diff --git a/developer_guides/firmware/drivers/dma/intel/images/hda-start-flow.pu b/architectures/firmware/drivers/dma/intel/images/hda-start-flow.pu similarity index 100% rename from developer_guides/firmware/drivers/dma/intel/images/hda-start-flow.pu rename to architectures/firmware/drivers/dma/intel/images/hda-start-flow.pu diff --git a/developer_guides/firmware/drivers/dma/intel/images/hda-stop-flow.pu b/architectures/firmware/drivers/dma/intel/images/hda-stop-flow.pu similarity index 100% rename from developer_guides/firmware/drivers/dma/intel/images/hda-stop-flow.pu rename to architectures/firmware/drivers/dma/intel/images/hda-stop-flow.pu diff --git a/developer_guides/firmware/drivers/dma/intel/index.rst b/architectures/firmware/drivers/dma/intel/index.rst similarity index 100% rename from developer_guides/firmware/drivers/dma/intel/index.rst rename to architectures/firmware/drivers/dma/intel/index.rst diff --git a/developer_guides/firmware/drivers/images/device-disco.pu b/architectures/firmware/drivers/images/device-disco.pu similarity index 100% rename from developer_guides/firmware/drivers/images/device-disco.pu rename to architectures/firmware/drivers/images/device-disco.pu diff --git a/developer_guides/firmware/drivers/images/device-probe.pu b/architectures/firmware/drivers/images/device-probe.pu similarity index 100% rename from developer_guides/firmware/drivers/images/device-probe.pu rename to architectures/firmware/drivers/images/device-probe.pu diff --git a/developer_guides/firmware/drivers/images/device-remove.pu b/architectures/firmware/drivers/images/device-remove.pu similarity index 100% rename from developer_guides/firmware/drivers/images/device-remove.pu rename to architectures/firmware/drivers/images/device-remove.pu diff --git a/developer_guides/firmware/drivers/index.rst b/architectures/firmware/drivers/index.rst similarity index 100% rename from developer_guides/firmware/drivers/index.rst rename to architectures/firmware/drivers/index.rst diff --git a/developer_guides/firmware/images/edf-scheduler-deps.pu b/architectures/firmware/images/edf-scheduler-deps.pu similarity index 100% rename from developer_guides/firmware/images/edf-scheduler-deps.pu rename to architectures/firmware/images/edf-scheduler-deps.pu diff --git a/developer_guides/firmware/images/edf-scheduler-flow.pu b/architectures/firmware/images/edf-scheduler-flow.pu similarity index 100% rename from developer_guides/firmware/images/edf-scheduler-flow.pu rename to architectures/firmware/images/edf-scheduler-flow.pu diff --git a/developer_guides/firmware/images/ll-scheduler-deps.pu b/architectures/firmware/images/ll-scheduler-deps.pu similarity index 100% rename from developer_guides/firmware/images/ll-scheduler-deps.pu rename to architectures/firmware/images/ll-scheduler-deps.pu diff --git a/developer_guides/firmware/images/ll-scheduler-flow.pu b/architectures/firmware/images/ll-scheduler-flow.pu similarity index 100% rename from developer_guides/firmware/images/ll-scheduler-flow.pu rename to architectures/firmware/images/ll-scheduler-flow.pu diff --git a/developer_guides/firmware/images/memory-zones.dot b/architectures/firmware/images/memory-zones.dot similarity index 100% rename from developer_guides/firmware/images/memory-zones.dot rename to architectures/firmware/images/memory-zones.dot diff --git a/developer_guides/firmware/images/runtime-zone.dot b/architectures/firmware/images/runtime-zone.dot similarity index 100% rename from developer_guides/firmware/images/runtime-zone.dot rename to architectures/firmware/images/runtime-zone.dot diff --git a/developer_guides/firmware/images/scheduler-ops.pu b/architectures/firmware/images/scheduler-ops.pu similarity index 100% rename from developer_guides/firmware/images/scheduler-ops.pu rename to architectures/firmware/images/scheduler-ops.pu diff --git a/developer_guides/firmware/images/system-zone.dot b/architectures/firmware/images/system-zone.dot similarity index 100% rename from developer_guides/firmware/images/system-zone.dot rename to architectures/firmware/images/system-zone.dot diff --git a/architectures/firmware/index.rst b/architectures/firmware/index.rst index fd2ca745..0cd53d78 100644 --- a/architectures/firmware/index.rst +++ b/architectures/firmware/index.rst @@ -3,6 +3,9 @@ Firmware Architecture ##################### +Overview +======== + Currently SOF has support for the Cadence Xtensa DSP architecture in UP and SMP modes in the upstream code base today. @@ -45,6 +48,17 @@ Each section above is well insulated from the other sections by partitioning code into separate directories and by using DSP and platform agnostic generic APIs for orchestration between the sections. +.. toctree:: + :maxdepth: 1 + + mem-mgmt + pm-runtime/index + schedulers + drivers/index + components/index + pipelines/index + kd_integration/index + Vendor Specific Architecture Information ======================================== diff --git a/developer_guides/firmware/kd_integration/images/kd-component-diagram.pu b/architectures/firmware/kd_integration/images/kd-component-diagram.pu similarity index 100% rename from developer_guides/firmware/kd_integration/images/kd-component-diagram.pu rename to architectures/firmware/kd_integration/images/kd-component-diagram.pu diff --git a/developer_guides/firmware/kd_integration/images/kd-e2e-sequence-diagram.pu b/architectures/firmware/kd_integration/images/kd-e2e-sequence-diagram.pu similarity index 100% rename from developer_guides/firmware/kd_integration/images/kd-e2e-sequence-diagram.pu rename to architectures/firmware/kd_integration/images/kd-e2e-sequence-diagram.pu diff --git a/developer_guides/firmware/kd_integration/images/kd-state-diagram.pu b/architectures/firmware/kd_integration/images/kd-state-diagram.pu similarity index 100% rename from developer_guides/firmware/kd_integration/images/kd-state-diagram.pu rename to architectures/firmware/kd_integration/images/kd-state-diagram.pu diff --git a/developer_guides/firmware/kd_integration/images/kd-timing-diagram.pu b/architectures/firmware/kd_integration/images/kd-timing-diagram.pu similarity index 100% rename from developer_guides/firmware/kd_integration/images/kd-timing-diagram.pu rename to architectures/firmware/kd_integration/images/kd-timing-diagram.pu diff --git a/developer_guides/firmware/kd_integration/index.rst b/architectures/firmware/kd_integration/index.rst similarity index 100% rename from developer_guides/firmware/kd_integration/index.rst rename to architectures/firmware/kd_integration/index.rst diff --git a/developer_guides/firmware/kd_integration/kd-integration.rst b/architectures/firmware/kd_integration/kd-integration.rst similarity index 100% rename from developer_guides/firmware/kd_integration/kd-integration.rst rename to architectures/firmware/kd_integration/kd-integration.rst diff --git a/developer_guides/firmware/mem-mgmt.rst b/architectures/firmware/mem-mgmt.rst similarity index 100% rename from developer_guides/firmware/mem-mgmt.rst rename to architectures/firmware/mem-mgmt.rst diff --git a/developer_guides/firmware/pipelines/images/ppl-new.pu b/architectures/firmware/pipelines/images/ppl-new.pu similarity index 100% rename from developer_guides/firmware/pipelines/images/ppl-new.pu rename to architectures/firmware/pipelines/images/ppl-new.pu diff --git a/developer_guides/firmware/pipelines/images/ppl-op-downstream.pu b/architectures/firmware/pipelines/images/ppl-op-downstream.pu similarity index 100% rename from developer_guides/firmware/pipelines/images/ppl-op-downstream.pu rename to architectures/firmware/pipelines/images/ppl-op-downstream.pu diff --git a/developer_guides/firmware/pipelines/images/ppl-operations.pu b/architectures/firmware/pipelines/images/ppl-operations.pu similarity index 100% rename from developer_guides/firmware/pipelines/images/ppl-operations.pu rename to architectures/firmware/pipelines/images/ppl-operations.pu diff --git a/developer_guides/firmware/pipelines/images/ppl-params.pu b/architectures/firmware/pipelines/images/ppl-params.pu similarity index 100% rename from developer_guides/firmware/pipelines/images/ppl-params.pu rename to architectures/firmware/pipelines/images/ppl-params.pu diff --git a/developer_guides/firmware/pipelines/images/ppl-reset.pu b/architectures/firmware/pipelines/images/ppl-reset.pu similarity index 100% rename from developer_guides/firmware/pipelines/images/ppl-reset.pu rename to architectures/firmware/pipelines/images/ppl-reset.pu diff --git a/developer_guides/firmware/pipelines/images/ppl-struct.pu b/architectures/firmware/pipelines/images/ppl-struct.pu similarity index 100% rename from developer_guides/firmware/pipelines/images/ppl-struct.pu rename to architectures/firmware/pipelines/images/ppl-struct.pu diff --git a/developer_guides/firmware/pipelines/images/ppl-task.pu b/architectures/firmware/pipelines/images/ppl-task.pu similarity index 100% rename from developer_guides/firmware/pipelines/images/ppl-task.pu rename to architectures/firmware/pipelines/images/ppl-task.pu diff --git a/developer_guides/firmware/pipelines/index.rst b/architectures/firmware/pipelines/index.rst similarity index 100% rename from developer_guides/firmware/pipelines/index.rst rename to architectures/firmware/pipelines/index.rst diff --git a/developer_guides/firmware/pm-runtime/images/pm-dsp-core-idle.pu b/architectures/firmware/pm-runtime/images/pm-dsp-core-idle.pu similarity index 100% rename from developer_guides/firmware/pm-runtime/images/pm-dsp-core-idle.pu rename to architectures/firmware/pm-runtime/images/pm-dsp-core-idle.pu diff --git a/developer_guides/firmware/pm-runtime/images/pm-dsp-core-init.pu b/architectures/firmware/pm-runtime/images/pm-dsp-core-init.pu similarity index 100% rename from developer_guides/firmware/pm-runtime/images/pm-dsp-core-init.pu rename to architectures/firmware/pm-runtime/images/pm-dsp-core-init.pu diff --git a/developer_guides/firmware/pm-runtime/index.rst b/architectures/firmware/pm-runtime/index.rst similarity index 100% rename from developer_guides/firmware/pm-runtime/index.rst rename to architectures/firmware/pm-runtime/index.rst diff --git a/developer_guides/firmware/pm-runtime/intel/images/dsp-core-lps-cavs-d0-d0i3-d0.pu b/architectures/firmware/pm-runtime/intel/images/dsp-core-lps-cavs-d0-d0i3-d0.pu similarity index 100% rename from developer_guides/firmware/pm-runtime/intel/images/dsp-core-lps-cavs-d0-d0i3-d0.pu rename to architectures/firmware/pm-runtime/intel/images/dsp-core-lps-cavs-d0-d0i3-d0.pu diff --git a/developer_guides/firmware/pm-runtime/intel/pm-dsp-core-cavs.rst b/architectures/firmware/pm-runtime/intel/pm-dsp-core-cavs.rst similarity index 100% rename from developer_guides/firmware/pm-runtime/intel/pm-dsp-core-cavs.rst rename to architectures/firmware/pm-runtime/intel/pm-dsp-core-cavs.rst diff --git a/developer_guides/firmware/pm-runtime/pm-dsp-core.rst b/architectures/firmware/pm-runtime/pm-dsp-core.rst similarity index 100% rename from developer_guides/firmware/pm-runtime/pm-dsp-core.rst rename to architectures/firmware/pm-runtime/pm-dsp-core.rst diff --git a/developer_guides/firmware/schedulers.rst b/architectures/firmware/schedulers.rst similarity index 100% rename from developer_guides/firmware/schedulers.rst rename to architectures/firmware/schedulers.rst diff --git a/developer_guides/firmware/index.rst b/developer_guides/firmware/index.rst index 9584ee4f..6c9d3280 100644 --- a/developer_guides/firmware/index.rst +++ b/developer_guides/firmware/index.rst @@ -9,12 +9,5 @@ Developer guides and information for firmware development. :maxdepth: 1 component-tutorial/tut-intro - mem-mgmt - pm-runtime/index - schedulers - drivers/index - components/index - pipelines/index porting - kd_integration/index cmake From b8194a1a4ffab38720d1e91a69e667c3411e5b04 Mon Sep 17 00:00:00 2001 From: Michal Wasko Date: Wed, 29 Dec 2021 15:32:31 +0100 Subject: [PATCH 152/290] Move firmware architecture overview to separate file Signed-off-by: Michal Wasko --- architectures/firmware/index.rst | 46 +---------------------------- architectures/firmware/overview.rst | 46 +++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 45 deletions(-) create mode 100644 architectures/firmware/overview.rst diff --git a/architectures/firmware/index.rst b/architectures/firmware/index.rst index 0cd53d78..2e50cf73 100644 --- a/architectures/firmware/index.rst +++ b/architectures/firmware/index.rst @@ -3,54 +3,10 @@ Firmware Architecture ##################### -Overview -======== - -Currently SOF has support for the Cadence Xtensa DSP architecture in UP and SMP -modes in the upstream code base today. - -The diagram below shows the high-level firmware architecture with the -Baytrail platform integration as an example. The firmware is divided into four -main sections: - -#. **Generic microkernel.** The microkernel manages and abstracts the - DSP hardware for the rest of the system. It also exports C APIs for - memory allocation, scheduling work, event notifications, and power - management. - -#. **Audio components.** The audio components can be used to form an - audio processing pipeline from the host DMA buffer to the DSP digital - audio interface. Audio components will have a source and sink buffer - where they will usually transform or route audio data as part of their - processing. - -#. **Audio task.** The audio task manages the audio pipelines at run - time; it manages the transportation of data from source to sink - component within the pipeline. The pipelines are currently statically - defined in the firmware, but infrastructure is now in place to allow the - dynamic creation of pipelines from Linux userspace. - -#. **Platform drivers.** The platform drivers are used to control any - external IP to the DSP IP. This will usually be things like DMA engines - or DAI (Digital Audio Interface) controllers. These drivers are used by - the audio components and pipelines to send/receive data to/from the host - and external codecs. - - .. figure:: ../images/fw-arch-diag.png - :align: center - :alt: SOF Architecture - :width: 800px - - `Sound Open Firmware Architecture using Intel Baytrail Platform` - - -Each section above is well insulated from the other sections by partitioning -code into separate directories and by using DSP and platform agnostic generic -APIs for orchestration between the sections. - .. toctree:: :maxdepth: 1 + overview mem-mgmt pm-runtime/index schedulers diff --git a/architectures/firmware/overview.rst b/architectures/firmware/overview.rst new file mode 100644 index 00000000..48649106 --- /dev/null +++ b/architectures/firmware/overview.rst @@ -0,0 +1,46 @@ +.. _overview: + +Overview +########## + +Currently SOF has support for the Cadence Xtensa DSP architecture in UP and SMP +modes in the upstream code base. + +The diagram below shows the high-level firmware architecture with the +Bay Trail platform integration as an example. The firmware is divided into four +main sections: + +#. **Generic microkernel.** The microkernel manages and abstracts the + DSP hardware for the rest of the system. It also exports C APIs for + memory allocation, scheduling work, event notifications, and power + management. + +#. **Audio components.** The audio components can be used to form an + audio processing pipeline from the host DMA buffer to the DSP digital + audio interface. Audio components will have a source and sink buffer + where they will usually transform or route audio data as part of their + processing. + +#. **Audio task.** The audio task manages the audio pipelines at run + time; it manages the transportation of data from source to sink + component within the pipeline. The pipelines are currently statically + defined in the firmware, but infrastructure is now in place to allow the + dynamic creation of pipelines from Linux userspace. + +#. **Platform drivers.** The platform drivers are used to control any + external IP to the DSP IP. This will usually be things like DMA engines + or DAI (Digital Audio Interface) controllers. These drivers are used by + the audio components and pipelines to send/receive data to/from the host + and external codecs. + + .. figure:: ../images/fw-arch-diag.png + :align: center + :alt: SOF Architecture + :width: 800px + + `Sound Open Firmware Architecture using Intel Baytrail Platform` + + +Each section above is well insulated from the other sections by partitioning +code into separate directories and by using DSP and platform agnostic generic +APIs for orchestration between the sections. \ No newline at end of file From 5125972682400d8498f80e9bbca1de55df42eeb4 Mon Sep 17 00:00:00 2001 From: anton-intel Date: Sat, 1 Jan 2022 12:37:58 +0300 Subject: [PATCH 153/290] Update copyright to 2022 (#399) --- conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf.py b/conf.py index 4e7b7b53..02794784 100755 --- a/conf.py +++ b/conf.py @@ -63,7 +63,7 @@ # General information about the project. project = u'SOF Project' -copyright = u'2021, SOF Project' +copyright = u'2022, SOF Project' author = u'SOF Project developers' # The version info for the project you're documenting, acts as replacement for From a77b50fd4105cedccc9e846aebf7bd27e44535ef Mon Sep 17 00:00:00 2001 From: Pierre-Louis Bossart Date: Tue, 1 Feb 2022 11:24:43 -0600 Subject: [PATCH 154/290] ktest: update needed git remotes and kconfig setups Reduce the number of remotes and use a script to create .config Signed-off-by: Pierre-Louis Bossart --- .../setup/setup_ktest_environment.rst | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/getting_started/setup/setup_ktest_environment.rst b/getting_started/setup/setup_ktest_environment.rst index 1b800ffd..77bc71fd 100644 --- a/getting_started/setup/setup_ktest_environment.rst +++ b/getting_started/setup/setup_ktest_environment.rst @@ -205,22 +205,19 @@ Create a linux development environment 2. Add a set of useful remotes ------------------------------ +The SOF contributions can be handled by different maintainers, so it's useful to point directly +to maintainer trees. + .. code-block:: bash git remote add sof https://github.com/thesofproject/linux.git git remote add takashi git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git git remote add broonie git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git - git remote add liam git://git.kernel.org/pub/scm/linux/kernel/git/lrg/asoc.git - git remote add keyon git://github.com/keyonjie/linux.git git remote add vinod git://git.kernel.org/pub/scm/linux/kernel/git/vkoul/sound.git - git remote add plb git://github.com/plbossart/sound.git git fetch sof git fetch takashi git fetch broonie - git fetch liam - git fetch keyon git fetch vinod - git fetch plb All of these branches will be accessible and can be updated from any worktree. Clone once and use fetch to update the main working tree. @@ -254,9 +251,8 @@ If you don't know what options are needed, you can start using configurations ma .. code-block:: bash git clone https://github.com/thesofproject/kconfig.git - cd linux - make defconfig - scripts/kconfig/merge_config.sh .config ../kconfig/base-defconfig ../kconfig/sof-defconfig ../kconfig/mach-driver-defconfig ../kconfig/hdaudio-codecs-defconfig + cd sof-dev + bash ../kconfig/kconfig-sof-default.sh cp .config ../sof-dev-defconfig make mrproper cd .. @@ -266,6 +262,14 @@ If you don't know what options are needed, you can start using configurations ma Use make proper since ktest.pl requires the source directory to be clean. All compilation happens in the -build directory. +.. note:: + + SOF developers and the Intel CI also use "kconfig-sof-nocodec.sh" on Up2 and UpExtreme boards. + +.. note:: + + Distributions should not use the options provided in kconfig/sof-dev-defconfig + 6. Edit ktest configuration as needed ------------------------------------- From 06388da6278b7bebc0ee6b0d6fda7fedb0bceb9d Mon Sep 17 00:00:00 2001 From: Michal Wasko Date: Mon, 24 Jan 2022 14:53:11 +0100 Subject: [PATCH 155/290] debugability: performance counters Performance counters usage descriptions added Signed-off-by: Michal Wasko --- developer_guides/debugability/index.rst | 1 + .../debugability/perf-counters/index.rst | 63 +++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 developer_guides/debugability/perf-counters/index.rst diff --git a/developer_guides/debugability/index.rst b/developer_guides/debugability/index.rst index 8c8f5d2a..02c712ef 100644 --- a/developer_guides/debugability/index.rst +++ b/developer_guides/debugability/index.rst @@ -11,3 +11,4 @@ Debugability coredump-reader/index probes/index ri-info/index + perf-counters/index diff --git a/developer_guides/debugability/perf-counters/index.rst b/developer_guides/debugability/perf-counters/index.rst new file mode 100644 index 00000000..db96c5c6 --- /dev/null +++ b/developer_guides/debugability/perf-counters/index.rst @@ -0,0 +1,63 @@ +.. _dbg-perf-counters: + +Performance Counters +#################### + +Firmware can be configured to trace performance counters for each processing +component. Each performance trace entry includes: + +- component UUID + +- peak platform and cpu timer ticks consumed during component's copy processing + +.. note:: + Performance timestamp macros use both the platform timer and cpu timer in case + the latter is not always running. + +Performance Counters usage +************************** + +Currently, you can only enable performance counters statically during FW build in +one of two ways: + +* Select **Performance counter** from **Debug** menu using ``make menuconfig`` + +* Add ``CONFIG_PERFORMANCE_COUNTERS=y`` to specific FW config, for +example, tigerlake_defconfig. + + +After you enable the performance counters, they are logged periodically for each +active component with the pipeline period frequency. + +Example +******* + +Performance counter trace example: + + .. code-block:: bash + + [ 8481257.031250] ( 51.562500) c0 demux 1.2 src/audio/pipeline.c:206 perf comp_copy peak plat 782 cpu 8136 + +``demux 1.2`` - processing component + +``plat 782`` - peak platform cycles consumed + +``cpu 8136`` - peak CPU cycles consumed + +MCPS calculation +---------------- + +The equation below illustrates how to calculate component MCPS (million cycles +per second) consumption. + + .. code-block:: bash + + MCPS = cpu_ticks / (pipeline_period[s] * 10^6) + + // for common pipeline_period = 1ms it can be simplified to + MCPS = cpu_ticks / 1000 + +In the trace example above, cpu_ticks = 8136, the pipeline_period is 1ms so the +demux consumption equals 8,136 MCPS + + From 749bf0c082f64f9cd8db9d916b6425299c27673d Mon Sep 17 00:00:00 2001 From: anton-intel Date: Wed, 2 Feb 2022 19:15:11 +0300 Subject: [PATCH 156/290] Fix for Performance Counters (#402) Build fails because of the following warning for perf-counters/index.rst: Bullet list ends without a blank line; unexpected unindent. Fixed the indent. Changed * to - for consistency. --- developer_guides/debugability/perf-counters/index.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/developer_guides/debugability/perf-counters/index.rst b/developer_guides/debugability/perf-counters/index.rst index db96c5c6..4e1ea77b 100644 --- a/developer_guides/debugability/perf-counters/index.rst +++ b/developer_guides/debugability/perf-counters/index.rst @@ -20,10 +20,10 @@ Performance Counters usage Currently, you can only enable performance counters statically during FW build in one of two ways: -* Select **Performance counter** from **Debug** menu using ``make menuconfig`` +- Select **Performance counter** from **Debug** menu using ``make menuconfig``. -* Add ``CONFIG_PERFORMANCE_COUNTERS=y`` to specific FW config, for -example, tigerlake_defconfig. +- Add ``CONFIG_PERFORMANCE_COUNTERS=y`` to specific FW config, for + example, tigerlake_defconfig. After you enable the performance counters, they are logged periodically for each From 2861c299abd15f3683ada6820201323a56275c7c Mon Sep 17 00:00:00 2001 From: Michal Wasko Date: Wed, 16 Feb 2022 13:57:41 +0100 Subject: [PATCH 157/290] Supported Platforms: Platform Clock column added Platform clock frequency information is required to get correct timestamps in sof-logger. Signed-off-by: Michal Wasko --- platforms/index.rst | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/platforms/index.rst b/platforms/index.rst index d968bf9d..c75379dc 100644 --- a/platforms/index.rst +++ b/platforms/index.rst @@ -9,27 +9,27 @@ Supported Platforms Platform and board specific support is continually added to the SOF project as documented below. .. csv-table:: Supported Platforms - :header: "Platform", "Architecture", "Cores/Clocks", "Memory", "Audio Interfaces" - :widths: 20, 20, 10, 10, 20 - - "Host Testbench", "PC command line", "N/A", "N/A", "N/A Files are used to simulate audio interfaces" - "Qemu", "All supported SOF HW platforms", "N/A", "N/A", "WiP Files will be used to simulate audio interfaces" - "Intel Baytrail / Merrifield", "Xtensa HiFi2 EP", "1 @ 50 - 400MHz", "96KB IRAM / 192KB DRAM", "3 x SSP (I2S, PCM)" - "Intel Cherrytrail / Braswell", "Xtensa HiFi2 EP", "1 @ 50 - 400MHz", "96KB IRAM / 192KB DRAM", "6 x SSP (I2S, PCM)" - "Intel Broadwell", "Xtensa HiFi2 EP", "1 @ 50 - 400MHz", "320KB IRAM / 640KB DRAM", "2 x SSP (I2S, PCM)" - "Intel Apollolake / Geminilake", "Xtensa HiFi3", "2 @ 100 - 400MHz", "128KB LP SRAM / 512KB HP SRAM", "6 x SSP (I2S, PCM), HDA, DMIC" - "Intel Cannonlake / Whiskeylake / Cometlake", "Xtensa HiFi3", "4 @ 120 - 400MHz", "64KB LP / 3008KB HP SRAM", "3 x SSP (I2S, PCM), HDA, DMIC, Soundwire" - "Intel Suecreek", "Xtensa HiFi3", "2 @ 120 - 400MHz", "64KB LP SRAM / 4096KB HP SRAM", "6 x SSP (I2S, PCM), DMIC" - "Intel Icelake", "Xtensa HiFi3", "4 @ 120 - 400MHz", "64KB LP SRAM / 3008KB HP SRAM", "6 x SSP (I2S, PCM), HDA, DMIC, Soundwire" - "Intel Jasperlake", "Xtensa HiFi3", "2 @ 120 - 400MHz", "64KB LP SRAM / 1024KB HP SRAM", "3 x SSP (I2S, PCM), HDA, DMIC, Soundwire" - "Intel Tigerlake", "Xtensa HiFi3", "4 @ 120 - 400MHz", "64KB LP SRAM / 2944KB HP SRAM", "6 x SSP (I2S, PCM), HDA, DMIC, Soundwire" - "Intel Alderlake", "Xtensa HiFi3", "4 @ 120 - 400MHz", "64KB LP SRAM / 2944KB HP SRAM", "6 x SSP (I2S, PCM), HDA, DMIC, Soundwire" - "NXP i.MX8", "Xtensa HiFi4", "1 @ 666MHz", "64 KB TCM / 448 KB OCRAM / 8MB SDRAM", "1 x ESAI, 1 x SAI" - "NXP i.MX8X", "Xtensa HiFi4", "1 @ 640MHz", "64 KB TCM / 448 KB OCRAM / 8MB SDRAM", "1 x ESAI, 1 x SAI" - "NXP i.MX8M", "Xtensa HiFi4", "1 @ 800MHz", "64 KB TCM / 256 KB OCRAM / 8MB SDRAM", "1 x SAI, MICFIL" - "NXP i.MX8ULP", "Xtensa HiFi4", "1 @ 520MHz", "64 KB TCM / 256 KB OCRAM / 8MB SDRAM", "1 x SAI" - "AMD Renoir", "Xtensa HiFi3", "1 @ 600MHz", "20 KB LP SRAM / 1152 KB IRAM/DRAM", "1 x SP (I2S, PCM), 1 x BT (I2S, PCM), DMIC" - "Mediatek mt8195", "Xtensa HiFi4", "1 @ 220 - 720MHz", "256 KB SRAM / 16 MB DRAM", "2 x TDM Out, 1 x TDM In, DMIC" + :header: "Platform", "Architecture", "Cores/Clocks", "Platform Clock", "Memory", "Audio Interfaces" + :widths: 20, 20, 10, 10, 10, 20 + + "Host Testbench", "PC command line", "N/A", "N/A", "N/A", "N/A Files are used to simulate audio interfaces" + "Qemu", "All supported SOF HW platforms", "N/A", "N/A", "N/A", "WiP Files will be used to simulate audio interfaces" + "Intel Baytrail / Merrifield", "Xtensa HiFi2 EP", "1 @ 50 - 400MHz", "25MHz", "96KB IRAM / 192KB DRAM", "3 x SSP (I2S, PCM)" + "Intel Cherrytrail / Braswell", "Xtensa HiFi2 EP", "1 @ 50 - 400MHz", "19.2MHz", "96KB IRAM / 192KB DRAM", "6 x SSP (I2S, PCM)" + "Intel Broadwell", "Xtensa HiFi2 EP", "1 @ 50 - 400MHz", "24MHz", "320KB IRAM / 640KB DRAM", "2 x SSP (I2S, PCM)" + "Intel Apollolake / Geminilake", "Xtensa HiFi3", "2 @ 100 - 400MHz", "19.2MHz", "128KB LP SRAM / 512KB HP SRAM", "6 x SSP (I2S, PCM), HDA, DMIC" + "Intel Cannonlake / Whiskeylake / Cometlake", "Xtensa HiFi3", "4 @ 120 - 400MHz", "19.2Hz or 24MHz strap selectable", "64KB LP / 3008KB HP SRAM", "3 x SSP (I2S, PCM), HDA, DMIC, Soundwire" + "Intel Suecreek", "Xtensa HiFi3", "2 @ 120 - 400MHz","19.2Hz or 24MHz strap selectable", "64KB LP SRAM / 4096KB HP SRAM", "6 x SSP (I2S, PCM), DMIC" + "Intel Icelake", "Xtensa HiFi3", "4 @ 120 - 400MHz", "24MHz or 38.4MHz strap selectable", "64KB LP SRAM / 3008KB HP SRAM", "6 x SSP (I2S, PCM), HDA, DMIC, Soundwire" + "Intel Jasperlake", "Xtensa HiFi3", "2 @ 120 - 400MHz", "24MHz or 38.4MHz strap selectable", "64KB LP SRAM / 1024KB HP SRAM", "3 x SSP (I2S, PCM), HDA, DMIC, Soundwire" + "Intel Tigerlake", "Xtensa HiFi3", "4 @ 120 - 400MHz", "24MHz or 38.4MHz strap selectable", "64KB LP SRAM / 2944KB HP SRAM", "6 x SSP (I2S, PCM), HDA, DMIC, Soundwire" + "Intel Alderlake", "Xtensa HiFi3", "4 @ 120 - 400MHz", "24MHz or 38.4MHz strap selectable", "64KB LP SRAM / 2944KB HP SRAM", "6 x SSP (I2S, PCM), HDA, DMIC, Soundwire" + "NXP i.MX8", "Xtensa HiFi4", "1 @ 666MHz", "TBD", "64 KB TCM / 448 KB OCRAM / 8MB SDRAM", "1 x ESAI, 1 x SAI" + "NXP i.MX8X", "Xtensa HiFi4", "1 @ 640MHz", "TBD", "64 KB TCM / 448 KB OCRAM / 8MB SDRAM", "1 x ESAI, 1 x SAI" + "NXP i.MX8M", "Xtensa HiFi4", "1 @ 800MHz", "TBD", "64 KB TCM / 256 KB OCRAM / 8MB SDRAM", "1 x SAI, MICFIL" + "NXP i.MX8ULP", "Xtensa HiFi4", "1 @ 520MHz", "TBD", "64 KB TCM / 256 KB OCRAM / 8MB SDRAM", "1 x SAI" + "AMD Renoir", "Xtensa HiFi3", "1 @ 600MHz", "TBD", "20 KB LP SRAM / 1152 KB IRAM/DRAM", "1 x SP (I2S, PCM), 1 x BT (I2S, PCM), DMIC" + "Mediatek mt8195", "Xtensa HiFi4", "1 @ 220 - 720MHz", "TBD", "256 KB SRAM / 16 MB DRAM", "2 x TDM Out, 1 x TDM In, DMIC" When support for a new platform is being added, certain interfaces required by SOF infrastructure must be implemented. Refer to Platform API documentation From f33a5da5ac5c5f387efa2d4175b361152c347cf5 Mon Sep 17 00:00:00 2001 From: Michal Wasko Date: Thu, 17 Feb 2022 09:54:14 +0100 Subject: [PATCH 158/290] Supported Platforms: intel platform clocks update Platform clock value limited to currently supported configuration. Signed-off-by: Michal Wasko --- platforms/index.rst | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/platforms/index.rst b/platforms/index.rst index c75379dc..27fd5407 100644 --- a/platforms/index.rst +++ b/platforms/index.rst @@ -18,12 +18,12 @@ Platform and board specific support is continually added to the SOF project as d "Intel Cherrytrail / Braswell", "Xtensa HiFi2 EP", "1 @ 50 - 400MHz", "19.2MHz", "96KB IRAM / 192KB DRAM", "6 x SSP (I2S, PCM)" "Intel Broadwell", "Xtensa HiFi2 EP", "1 @ 50 - 400MHz", "24MHz", "320KB IRAM / 640KB DRAM", "2 x SSP (I2S, PCM)" "Intel Apollolake / Geminilake", "Xtensa HiFi3", "2 @ 100 - 400MHz", "19.2MHz", "128KB LP SRAM / 512KB HP SRAM", "6 x SSP (I2S, PCM), HDA, DMIC" - "Intel Cannonlake / Whiskeylake / Cometlake", "Xtensa HiFi3", "4 @ 120 - 400MHz", "19.2Hz or 24MHz strap selectable", "64KB LP / 3008KB HP SRAM", "3 x SSP (I2S, PCM), HDA, DMIC, Soundwire" - "Intel Suecreek", "Xtensa HiFi3", "2 @ 120 - 400MHz","19.2Hz or 24MHz strap selectable", "64KB LP SRAM / 4096KB HP SRAM", "6 x SSP (I2S, PCM), DMIC" - "Intel Icelake", "Xtensa HiFi3", "4 @ 120 - 400MHz", "24MHz or 38.4MHz strap selectable", "64KB LP SRAM / 3008KB HP SRAM", "6 x SSP (I2S, PCM), HDA, DMIC, Soundwire" - "Intel Jasperlake", "Xtensa HiFi3", "2 @ 120 - 400MHz", "24MHz or 38.4MHz strap selectable", "64KB LP SRAM / 1024KB HP SRAM", "3 x SSP (I2S, PCM), HDA, DMIC, Soundwire" - "Intel Tigerlake", "Xtensa HiFi3", "4 @ 120 - 400MHz", "24MHz or 38.4MHz strap selectable", "64KB LP SRAM / 2944KB HP SRAM", "6 x SSP (I2S, PCM), HDA, DMIC, Soundwire" - "Intel Alderlake", "Xtensa HiFi3", "4 @ 120 - 400MHz", "24MHz or 38.4MHz strap selectable", "64KB LP SRAM / 2944KB HP SRAM", "6 x SSP (I2S, PCM), HDA, DMIC, Soundwire" + "Intel Cannonlake / Whiskeylake / Cometlake", "Xtensa HiFi3", "4 @ 120 - 400MHz", "24MHz", "64KB LP / 3008KB HP SRAM", "3 x SSP (I2S, PCM), HDA, DMIC, Soundwire" + "Intel Suecreek", "Xtensa HiFi3", "2 @ 120 - 400MHz","24MHz", "64KB LP SRAM / 4096KB HP SRAM", "6 x SSP (I2S, PCM), DMIC" + "Intel Icelake", "Xtensa HiFi3", "4 @ 120 - 400MHz", "38.4MHz", "64KB LP SRAM / 3008KB HP SRAM", "6 x SSP (I2S, PCM), HDA, DMIC, Soundwire" + "Intel Jasperlake", "Xtensa HiFi3", "2 @ 120 - 400MHz", "38.4MHz", "64KB LP SRAM / 1024KB HP SRAM", "3 x SSP (I2S, PCM), HDA, DMIC, Soundwire" + "Intel Tigerlake", "Xtensa HiFi3", "4 @ 120 - 400MHz", "38.4MHz", "64KB LP SRAM / 2944KB HP SRAM", "6 x SSP (I2S, PCM), HDA, DMIC, Soundwire" + "Intel Alderlake", "Xtensa HiFi3", "4 @ 120 - 400MHz", "38.4MHz", "64KB LP SRAM / 2944KB HP SRAM", "6 x SSP (I2S, PCM), HDA, DMIC, Soundwire" "NXP i.MX8", "Xtensa HiFi4", "1 @ 666MHz", "TBD", "64 KB TCM / 448 KB OCRAM / 8MB SDRAM", "1 x ESAI, 1 x SAI" "NXP i.MX8X", "Xtensa HiFi4", "1 @ 640MHz", "TBD", "64 KB TCM / 448 KB OCRAM / 8MB SDRAM", "1 x ESAI, 1 x SAI" "NXP i.MX8M", "Xtensa HiFi4", "1 @ 800MHz", "TBD", "64 KB TCM / 256 KB OCRAM / 8MB SDRAM", "1 x SAI, MICFIL" From b1be685e18748dc7bf9abf8aad276e01887528d0 Mon Sep 17 00:00:00 2001 From: Noah Klayman Date: Fri, 4 Feb 2022 20:00:24 +0000 Subject: [PATCH 159/290] feat(getting_started): update organization and instructions - Change the organization of the getting started section to make it easier to determine which guide to follow. - Add instructions for building a custom kernel with SOF config so that it can be booted on that same device. This is useful for people without dedicated test hardware who just want to try out the latest code, such as when they are running into issues with new hardware. - Revamp the ktest setup documentation. This was very out of date and had tons of errors, especially for using Fedora. It has now been validated to work on both Fedora and Ubuntu target devices, from a Ubuntu dev machine (but Fedora should work just fine too). Signed-off-by: Noah Klayman --- getting_started/index.rst | 32 ++- .../setup_linux/install_locally.rst | 109 +++++++ .../setup_linux/prepare_build_environment.rst | 102 +++++++ .../setup_ktest_environment.rst | 266 +++++++++--------- .../images/minnow_turbot.png | Bin .../setup_minnowboard_turbot.rst | 0 .../setup_up_2_board.rst | 0 7 files changed, 374 insertions(+), 135 deletions(-) create mode 100644 getting_started/setup_linux/install_locally.rst create mode 100644 getting_started/setup_linux/prepare_build_environment.rst rename getting_started/{setup => setup_linux}/setup_ktest_environment.rst (50%) rename getting_started/{setup => setup_special_device}/images/minnow_turbot.png (100%) rename getting_started/{setup => setup_special_device}/setup_minnowboard_turbot.rst (100%) rename getting_started/{setup => setup_special_device}/setup_up_2_board.rst (100%) diff --git a/getting_started/index.rst b/getting_started/index.rst index a9511ef1..a932ec3a 100755 --- a/getting_started/index.rst +++ b/getting_started/index.rst @@ -21,18 +21,36 @@ current distro release is always preferred. build-guide/build-3rd-party-toolchain build-guide/build-with-zephyr -Set up SOF on hardware -********************** +Set up SOF on a Linux machine +***************************** -SOF runs on a variety of devices with varying audio capabilities so -instructions may differ between devices. +You can build the Linux kernel with the latest SOF code and install it locally or remotely with ktest. + +Do this first: + +.. toctree:: + :maxdepth: 1 + + setup_linux/prepare_build_environment + +Then proceed based on if you are installing locally or through ktest: + +.. toctree:: + :maxdepth: 1 + + setup_linux/install_locally + setup_linux/setup_ktest_environment + +Set up SOF on a special device +****************************** + +SOF also runs on the MinnowBoard Turbot and the Up Squared board with Hifiberry Dac+. .. toctree:: :maxdepth: 1 - setup/setup_minnowboard_turbot - setup/setup_up_2_board - setup/setup_ktest_environment + setup_special_device/setup_minnowboard_turbot + setup_special_device/setup_up_2_board Debug Audio issues on Intel platforms ************************************* diff --git a/getting_started/setup_linux/install_locally.rst b/getting_started/setup_linux/install_locally.rst new file mode 100644 index 00000000..f62c0594 --- /dev/null +++ b/getting_started/setup_linux/install_locally.rst @@ -0,0 +1,109 @@ +.. _install-locally: + +Install the Kernel locally +####################################### + +.. contents:: + :local: + :depth: 3 + +Introduction +************ + +Make sure you have `setup your development environment `_ before following these steps. This page will guide you through the process of installing the kernel locally on your machine. It will be installed in addition to your distro's default kernel so that you can always change back to that in case something goes wrong. If you're interested in learning more about this process there's lots of online guides available, for example `Fedora's guide `_ or `this wiki page `_. + + +Build and install the kernel +**************************** + +(You should be in the ``~/sof/linux`` directory you created on the setup page) + +1. Load base kernel configuration +--------------------------------- + +.. code-block:: bash + + # This will copy the booted kernel's configuration so that it will be used as a base + cp /boot/config-$(uname -r)* .config + + +2. Apply SOF-specific configuration +----------------------------------- + +The following scripts will update your base config so that it uses the latest SOF modules. Run only one of them depending on your needs. If it prompts you with any questions, just press to accept the default value. Note that, by default, these scripts will set the configuration to only compile modules that are currently loaded in order to lower compile times. This means that when you've booted from the custom kernel some external devices may not work if they weren't connected while running this script. If you want to compile all modules, delete the line ``make localmodconfig`` from the script you will run in this step. + +.. code-block:: bash + + # For most users + ../kconfig/kconfig-distro-sof-update.sh + # For additional logging and experimental device support + ../kconfig/kconfig-distro-sof-dev-update.sh + +3. Compile the kernel +--------------------- + +.. code-block:: bash + + # The first time you run this it can take a while (over 30 minutes on some machines), + # so grab a coffee or take an exercise break while it runs + make -j$(nproc --all) + +4. Install the kernel +--------------------- + +.. code-block:: bash + + sudo make modules_install + sudo make install + +If all went well, your freshly-built kernel will be installed and available at next boot. Restart your computer, and you should have the option to pick a kernel when it turns on. Select the kernel that has "-sof" at the end of it, and your computer should boot as normal using the kernel you just built. On Ubuntu, the kernel option may be hidden behind the "Advanced options for Ubuntu" submenu. + +5. Updating and rebuilding +-------------------------- + +If you need to try some new changes, you'll have to download the updated code and rebuild the kernel. + +If you originally cloned the repo using git, you just need to pull the changes: + +.. code-block:: bash + + git pull + # You should run this after switching branches or configuration or any other major code change + # If you just pulled some minor updates, it's likely unnecessary and will increase your build time + make clean + +Now, repeat steps 3 and 4 to rebuild and reinstall the kernel. Reboot your computer, and select the kernel with -sof at the end to test it. + +Unfortunately, if you downloaded via zip, the entire process has to be restarted from the "Get the kernel source" section; there's no good way to incrementally update. However, the kernel build should be faster now as part of it will be cached. + +.. code-block:: bash + + cd .. + # Delete the old folder before starting over + rm -rf linux + +6. Removing the kernel +---------------------- + +If you run into issues or no longer need the custom kernel, you can remove it. + +Ubuntu: + +.. code-block:: bash + + cd ~/sof/linux + sudo rm /boot/*-$(make kernelversion) + sudo rm -rf /lib/modules/$(make kernelversion) + sudo update-grub + +Fedora: + +.. code-block:: bash + + cd ~/sof/linux + sudo rm /boot/*-$(make kernelversion)* + sudo rm -rf /lib/modules/$(make kernelversion) + sudo grubby --remove-kernel=/boot/vmlinuz-$(make kernelversion) + + +After rebooting, you should be back to your old kernel with all traces of the custom kernel installation gone. If you'd like, you can also delete the ``~sof`` directory to save disk space. diff --git a/getting_started/setup_linux/prepare_build_environment.rst b/getting_started/setup_linux/prepare_build_environment.rst new file mode 100644 index 00000000..30382aa7 --- /dev/null +++ b/getting_started/setup_linux/prepare_build_environment.rst @@ -0,0 +1,102 @@ +.. _prepare-build-environment: + +Set up a development environment to build the kernel +#################################################### + +.. contents:: + :local: + :depth: 3 + +Introduction +************ + + +These instructions will help you set up a development environment for the SOF branch of the Linux kernel. If you have dedicated test hardware you can use ktest to install it over ssh, otherwise you can install it locally on your device in addition to your default kernel. + +Prerequisites +************* + +1. Device requirements +----------------------- + +**Development device:** PC running Fedora 35+ or Ubuntu 20.04+. + +**Target device:** PC running Fedora 35+ or Ubuntu 20.04+, with secure boot disabled. If the target device is different than the development device you must be able to ssh into the target, which is typically on the same local network/VPN. + +2. Create working directory +--------------------------- + +This directory can be located anywhere, simply change the ``SOF_WORKSPACE`` variable if you would like to store your sources somewhere else. + +.. code-block:: bash + + export SOF_WORKSPACE=~/work/sof + mkdir -p $SOF_WORKSPACE + cd $SOF_WORKSPACE + +3. Install kernel build dependencies +------------------------------------ + +Fedora (see `their guide `_ for details): + +.. code-block:: bash + + sudo dnf install fedpkg + fedpkg clone -a kernel + cd kernel + sudo dnf builddep kernel.spec + sudo dnf install ccache + cd .. + +Ubuntu (see `their page `_ for details): + +.. code-block:: bash + + sudo apt update + sudo apt install git libncurses-dev gawk flex bison openssl libssl-dev dkms libelf-dev libudev-dev libpci-dev libiberty-dev autoconf dwarves zstd + +4. Download the configuration scripts +------------------------------------- + +.. code-block:: bash + + git clone https://github.com/thesofproject/kconfig.git + +Get the kernel source +********************* + +There are two ways to get the kernel source. We strongly recommend using git as it makes updates **much** easier, but the zip download may be more successful if you have an unstable connection. + +Option 1: Clone with git +------------------------ +.. code-block:: bash + + # If a maintainer requests that you check out a different branch + # to test a bug fix, add -b [branch] + # to the end of this command, where [branch] is the branch name + git clone https://github.com/thesofproject/linux.git --depth=1 + cd linux + +Option 2: Download via zip +-------------------------- + +Visit the SOF Linux fork at https://github.com/thesofproject/linux. If a maintainer asks you to test a specific branch, click the dropdown with the text "topic/sof-dev" and select the branch they asked you to test. Then, click the green "Code" dropdown and select "download zip". Once it's downloaded, extract it to the directory you created in the previous step: + +.. code-block:: bash + + cd ~/Downloads + unzip linux-*.zip -d $SOF_WORKSPACE + cd $SOF_WORKSPACE + mv linux-* linux + cd linux + +Build the kernel +**************** + +Your device should now be ready to configure and build the kernel. How to proceed depends on if you are installing locally or on dedicated test hardware. + +.. toctree:: + :maxdepth: 1 + + install_locally + setup_ktest_environment \ No newline at end of file diff --git a/getting_started/setup/setup_ktest_environment.rst b/getting_started/setup_linux/setup_ktest_environment.rst similarity index 50% rename from getting_started/setup/setup_ktest_environment.rst rename to getting_started/setup_linux/setup_ktest_environment.rst index 77bc71fd..b67e6ef7 100644 --- a/getting_started/setup/setup_ktest_environment.rst +++ b/getting_started/setup_linux/setup_ktest_environment.rst @@ -11,22 +11,20 @@ Introduction ************ These instructions explain how a target device can be configured to update the kernel over SSH. The use of ktest.pl and git worktrees -allow for simultaneous configs to be tested on multiple platforms, -though only one branch can be checked out at a time. Wired Ethernet -access is assumed as wireless is unreliable. If there is no Ethernet -port, use a USB-Ethernet dongle supported in the kernel. +allow for simultaneous configs to be tested on multiple platforms. +Wired Ethernet access is assumed as wireless is unreliable. If there +is no Ethernet port, use a USB-Ethernet dongle supported in the kernel. Prerequisites on the target device ********************************** The target device can be any of the SOF-supported platforms, -e.g. MinnowBoard, Up^2, Asus T100, Chromebooks) +e.g. MinnowBoard, Up^2, Asus T100, Chromebooks. 1. Install OS on target ----------------------- -Install ubuntu or debian (fedora is possible with a minor change -in the *initrd* generation) +Install Ubuntu, Debian, or Fedora. 2. Enable root password ----------------------- @@ -44,27 +42,59 @@ Copy your existing known-to-work kernels/initrd .. code-block:: bash - cp /boot/vmlinuz-4.13.0-16-generic /boot/vmlinuz-test - cp /boot/initrd.img-4.13.0-16-generic /boot/initrd.img-test + sudo cp /boot/vmlinuz-$(uname -r) /boot/vmlinuz-test -Change the extensions as needed to create an initial grub entry -for a test kernel. You will never override the default -Ubuntu/Debian stuff, so you will always have the ability to boot a -working kernel if your changes fail to boot. + # On Ubuntu: + sudo cp /boot/initrd.img-$(uname -r) /boot/initrd.img-test -4. Edit grub default --------------------- + # On Fedora: + sudo cp /boot/initramfs-$(uname -r).img /boot/initramfs-test.img + sudo grubby --add-kernel /boot/vmlinuz-test --title=test + +4. Edit grub settings +--------------------- + +This only needs to be run on Ubuntu and Debian, Fedora has the proper settings by default. .. code-block:: bash # Use your text editor of choice. sudo emacs /etc/default/grub + # Change GRUB_DEFAULT=[n] to GRUB_DEFAULT=saved + # Then add GRUB_DISABLE_SUBMENU=y to the end and save, + # submenus confuse ktest. sudo update-grub -Add ``GRUB_DISABLE_SUBMENU=y`` to the end and save. -Sub-menus confuse ktest. +5. Set the default kernel +------------------------- + +You will never override the default +distro kernel, so you will always have the ability to boot a +working kernel if your changes cause issues. +By setting the default kernel, you can return your system to a stable +state with just a power cycle, no grub menus involved. + +On Ubuntu: + +.. code-block:: bash + + # Print your currently booted (and known-safe) option + cat /proc/cmdline + # List the grub entries + awk '/^menuentry/ { print i++, '\t', $0 }' /boot/grub/grub.cfg + # Find the entry that matches the output of the + # first command you ran, and take note of it's number + sudo grub-set-default [n] # Where [n] is that number + # This should print saved_entry=[n] + grub-editenv list + +On Fedora: + +.. code-block:: bash + + sudo grubby --set-default /boot/vmlinuz-$(uname -r) -5. Get familiar with grub-reboot +6. Get familiar with grub-reboot -------------------------------- ktest relies on grub-reboot. grub-reboot lets you try a freshly built @@ -80,11 +110,13 @@ grub-reboot works is required to fully understand ktest configuration. It's much easier to discover grub-reboot alone than when entangled with ktest. -There's a lot of grub-reboot documentation online and offline but -apparently no good and very short cheat sheet so here is one below. For +Here's a quick cheat sheet for grub-reboot on Ubuntu/Debian. For more details search the documentation of your Linux distribution. The commands below have been tested on Ubuntu 20.04; they should be nearly -identical for most Linux distributions. +identical for most Debian-derived linux distributions. + +Warning: ``update-grub`` does not care about menuentry order and will +mess up what the numbers below point to! After running update-grub, make sure the default kernel index is correct and points towards a known-safe kernel. .. code-block:: bash @@ -95,94 +127,104 @@ identical for most Linux distributions. # See which GRUB entry was booted cat /proc/cmdline - # grub-reboot requires "unharcoding" GRUB_DEFAULT - printf 'GRUB_DEFAULT=saved\n' >> /etc/default/grub - update-grub - -Warning: ``update-grub`` does not care about menuentry order and will -mess up what the numbers below point to! - -.. code-block:: bash - - # Show the currently selected menuentry + # Show the default menuentry grub-editenv list - => saved_entry=6 + #=> saved_entry=6 # Show all, numbered kernel choices without (re)booting awk '/^menuentry/ { print i++, '\t', $0 }' /boot/grub/grub.cfg - => 5 menuentry ... - => 6 menuentry 'Ubuntu, with Linux 5.4.0-53-generic' --class ubuntu ... - => 7 menuentry ... + #=> 5 menuentry ... + #=> 6 menuentry 'Ubuntu, with Linux 5.4.0-53-generic' --class ubuntu ... + #=> 7 menuentry ... # Attempt to boot menuentry 4 only once - grub-reboot 4; grub-editenv list - => saved_entry=6 - => next_entry=4 + grub-reboot 4 + # Run this to see the updated settings + grub-editenv list + #=> saved_entry=6 + #=> next_entry=4 reboot # Switch to menuentry number 4 as the new "safe" kernel - grub-set-default 4; grub-editenv list - => saved_entry=4 + grub-set-default 4 Fedora and derived distributions have a more elaborate system to manage "installed" kernels. Instead of extracting ``menuentry`` lines from ``/boot/grub/grub.cfg`` with the ``awk`` command above, to list all -installed kernels use: ``grubby --info=ALL``. - -After copying it to ``/boot``/, "install" a new kernel with: -``grubby --add-kernel /boot/vmlinuz-softest --title=softest``. Check -``grubby``'s documentation for more details. +installed kernels use ``grubby --info=ALL``. +Check ``grubby``'s documentation for more details. +To boot a different kernel just once, use ``grub2-reboot [n]``, where ``[n]`` is the index of the menu entry you'd like to boot. 6. Install openssh-server ------------------------- .. code-block:: bash + # On Ubuntu, you need to install it sudo apt-get install openssh-server + + #On Fedora, you just need to enable it + sudo systemctl enable sshd + + # On either system, you'll need to update the config # Use your editor of choice. sudo emacs /etc/ssh/sshd_config -Replace ``PermitRootLogin without-password`` with ``PermitRootLogin yes`` -and save. +Replace ``#PermitRootLogin prohibit-password`` with ``PermitRootLogin yes`` +(make sure to remove the ``#``) and save. This is just temporary, you'll change this back once you've copied over your ssh key. -7. reboot target +7. Reboot target ---------------- +Make sure it boots automatically to your safe kernel. It's also recommended to test using grub-reboot to boot the test kernel, then rebooting again to make sure it goes back to the safe kernel. + Configure SSH without password ****************************** 1. Check SSH connection ----------------------- +You must be able to ssh into the target device, which is typically on the same local network/VPN. Run ``ip addr`` on the target to get its IP address. All other commands should be run on your dev machine, unless specified otherwise. + .. code-block:: bash - ssh root@ + # Make sure that you can connect and login to the target + ssh root@ 2. Generate an SSH key for the target ------------------------------------- +If you already have an ssh key you'd prefer to use, you can skip this step. + .. code-block:: bash - cd ~/.ssh - ssh-keygen -f sshktest - # Enter a 5+ character passphrase. + ssh-keygen -f ~/.ssh/sshktest + # This will prompt you for the target's root password. ssh-copy-id -i ~/.ssh/sshktest root@ - # This will prompt you for the root password. 3. Test the key --------------- .. code-block:: bash - ssh -i ~/.ssh/sshktest root@ - # Ubuntu unlocks the key so the -i option is not necessary. + ssh root@ + +.. note:: + + In most cases `ssh-agent` should automatically manage your password(s) and key(s). If you are still prompted for a password, it's likely your distro hasn't configured `ssh-agent`. You can either figure out how to enable it, or you can manually update your config. + To do this, put the following in ``~/.ssh/config`` (make sure to update ````) and then use ``ktest-target`` instead of the actual target's IP for ssh connections (ie ``ssh root@ktest-target``). + + .. code-block:: text + + Host ktest-target + HostName + IdentityFile ~/.ssh/sshktest 4. Disable root access ---------------------- - -Disable the root password on the target device if you -are concerned about access control. +Run this on the target device to disable root password, +you won't need it now that you've copied the key. .. code-block:: bash @@ -191,67 +233,33 @@ are concerned about access control. Replace ``PermitRootLogin yes`` by ``PermitRootLogin without-password``, save, and exit. -Create a linux development environment -************************************** - -1. Create a main working GIT tree ---------------------------------- - -.. code-block:: bash +Build and install the kernel with ktest +*************************************** - git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git linux-ref.git - cd linux-ref.git +Follow the `prepare build environment `_ instructions before proceeding. -2. Add a set of useful remotes ------------------------------- +1. Prepare ktest environment +---------------------------- -The SOF contributions can be handled by different maintainers, so it's useful to point directly -to maintainer trees. +If you're running this in a different terminal than you used for the prepare build environment page, you will need to re-set the SOF_WORKSPACE variable by running ``export SOF_WORKSPACE = ~/work/sof``. .. code-block:: bash - git remote add sof https://github.com/thesofproject/linux.git - git remote add takashi git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git - git remote add broonie git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git - git remote add vinod git://git.kernel.org/pub/scm/linux/kernel/git/vkoul/sound.git - git fetch sof - git fetch takashi - git fetch broonie - git fetch vinod - -All of these branches will be accessible and can be updated from any -worktree. Clone once and use fetch to update the main working tree. - -3. Create a worktree for SOF in ~/ktest ---------------------------------------- - -.. note:: - Change the location of your ktest directory and which branch you use - as needed. - -.. code-block:: bash - - git worktree add ~/ktest/sof-dev sof/topic/sof-dev - -4. Set-up worktree ------------------- - -.. code-block:: bash - - cd ~/ktest/sof-dev + cd $SOF_WORKSPACE mkdir sof-dev-build mkfifo sof-dev-cat - cp sof-dev/tools/testing/ktest/ktest.pl . + cp linux/tools/testing/ktest/ktest.pl . -5. Save your kernel config as ~/ktest/sof-dev-defconfig -------------------------------------------------------- +2. Save your kernel config as sof-dev-defconfig +----------------------------------------------- If you don't know what options are needed, you can start using configurations maintained by SOF developers. .. code-block:: bash - git clone https://github.com/thesofproject/kconfig.git - cd sof-dev + cd linux + make O=../sof-dev-build olddefconfig + echo test > ../sof-dev-build/localversion bash ../kconfig/kconfig-sof-default.sh cp .config ../sof-dev-defconfig make mrproper @@ -264,16 +272,12 @@ If you don't know what options are needed, you can start using configurations ma .. note:: - SOF developers and the Intel CI also use "kconfig-sof-nocodec.sh" on Up2 and UpExtreme boards. - -.. note:: - - Distributions should not use the options provided in kconfig/sof-dev-defconfig + The options provided in kconfig/sof-dev-defconfig should not be used for a distro's production kernel. -6. Edit ktest configuration as needed +3. Edit ktest configuration as needed ------------------------------------- -Save the following in sof-dev.conf. +Save the following in ``sof-dev.conf``. Make sure to update the ``MACHINE=`` line with your target device's IP (or ``ktest-target`` if you had to do the additional ssh config). .. code-block:: perl @@ -285,7 +289,7 @@ Save the following in sof-dev.conf. SSH_USER = root THIS_DIR := ${PWD} # BUILD_DIR is the source directory - BUILD_DIR = ${THIS_DIR}/sof-dev + BUILD_DIR = ${THIS_DIR}/linux # OUTPUT_DIR is the actual build directory OUTPUT_DIR = ${THIS_DIR}/sof-dev-build BUILD_TARGET = arch/x86/boot/bzImage @@ -303,7 +307,7 @@ Save the following in sof-dev.conf. CONSOLE = cat ${THIS_DIR}/sof-dev-cat POWER_CYCLE = echo Power cycle the machine now and press ENTER; read a #set below to help ssh connection to close after sending reboot command - REBOOT = ssh -o 'ProxyCommand none' $SSH_USER@$MACHINE 'sudo reboot > /dev/null &' + REBOOT = ssh $SSH_USER@$MACHINE 'sudo reboot > /dev/null &' # This how ktest finds which menuentry number to pass to grub-reboot GRUB_FILE = /boot/grub/grub.cfg @@ -319,7 +323,7 @@ Save the following in sof-dev.conf. # mkinitramfs -o initrdfile 5.10.0-rc5test+ # ktest finds the real KERNEL_VERSION thanks to "make O=${OUTPUT_DIR} # kernelrelease" - POST_INSTALL = ssh -o 'ProxyCommand none' $SSH_USER@$MACHINE sudo /usr/sbin/mkinitramfs -o /boot/initrd.img-${LOCALVERSION} $KERNEL_VERSION + POST_INSTALL = ssh $SSH_USER@$MACHINE sudo /usr/sbin/mkinitramfs -o /boot/initrd.img-${LOCALVERSION} $KERNEL_VERSION #REBOOT_TYPE = script #REBOOT_SCRIPT = ssh $SSH_USER@$MACHINE "sed -i 's|^default.*$|default test|' /boot/loader/loader.conf" @@ -331,20 +335,24 @@ Save the following in sof-dev.conf. BUILD_NOCLEAN = 1 -For Fedora and derived distributions, make the following changes: +For targets running Fedora and derived distributions, make the following changes: .. code-block:: perl - GRUB_MENU = "title" of the kernel entry as displayed by: 'grubby --info=ALL' + # GRUB_MENU should be the title of the custom kernel entry you added, + # which will match LOCALVERSION ("test") if you followed the previous steps + # You can view all your kernel entries with `grubby --info=ALL` + GRUB_MENU = ${LOCALVERSION} GRUB_REBOOT = grub2-reboot REBOOT_TYPE = grub2bls - POST_INSTALL = ssh -o 'ProxyCommand none' $SSH_USER@$MACHINE sudo dracut --hostonly --force --kver ${LOCALVERSION} + POST_INSTALL = ssh $SSH_USER@$MACHINE sudo dracut --hostonly --force /boot/initramfs-${LOCALVERSION}.img $KERNEL_VERSION -7. Build and test +4. Build and test ----------------- .. code-block:: bash + # This can take a while, so don't kill it if it appears to freeze ./ktest.pl sof-dev.conf If this does not work, make sure you have all the following files in the @@ -352,29 +360,31 @@ local directory: * ktest.pl * sof-dev-cat -* sof-dev +* linux * sof-dev-build * sof-dev.conf * sof-dev-defconfig -Ktest will compile, install the new kernel, and reboot. Prompt -detection only works with a UART, not over SSH, so you will have to -``Control-C`` manually when the console is not enabled. +Ktest will compile and install the new kernel, then reboot the target device. Check which kernel is booted by running ``uname -r`` on the target. + +.. note:: + + KTest expects a UART connection to verify that the boot was successful. If you do not have a UART connection you will get some errors at the end of the ``ktest.pl`` script's execution, but you can ignore them as long as the custom kernel was installed and booted on the target device. -8. Enjoy! +5. Enjoy! --------- -9. Enjoy even more! +6. Enjoy even more! ------------------- -By having multiple worktrees and configs, you can run tests in parallel +By having multiple `Git worktrees `_ and configs, you can run tests in parallel on different machines on the same kernel or different branches. -10. Clean up /lib/modules +7. Clean up /lib/modules ------------------------- Ktest creates a separate module directory per kernel version. -User needs to clean up old module directory periodically. +User needs to clean up old module directory periodically on the target device. .. code-block:: bash diff --git a/getting_started/setup/images/minnow_turbot.png b/getting_started/setup_special_device/images/minnow_turbot.png similarity index 100% rename from getting_started/setup/images/minnow_turbot.png rename to getting_started/setup_special_device/images/minnow_turbot.png diff --git a/getting_started/setup/setup_minnowboard_turbot.rst b/getting_started/setup_special_device/setup_minnowboard_turbot.rst similarity index 100% rename from getting_started/setup/setup_minnowboard_turbot.rst rename to getting_started/setup_special_device/setup_minnowboard_turbot.rst diff --git a/getting_started/setup/setup_up_2_board.rst b/getting_started/setup_special_device/setup_up_2_board.rst similarity index 100% rename from getting_started/setup/setup_up_2_board.rst rename to getting_started/setup_special_device/setup_up_2_board.rst From 9f62952d63f7721fe7cfeebbe8004d7620cfb3f4 Mon Sep 17 00:00:00 2001 From: Anton Bobkov Date: Tue, 1 Mar 2022 11:09:09 +0300 Subject: [PATCH 160/290] Change formatting of the getting started docs --- .../setup_linux/install_locally.rst | 137 +++-- .../setup_linux/prepare_build_environment.rst | 115 ++-- .../setup_linux/setup_ktest_environment.rst | 538 +++++++++--------- 3 files changed, 396 insertions(+), 394 deletions(-) diff --git a/getting_started/setup_linux/install_locally.rst b/getting_started/setup_linux/install_locally.rst index f62c0594..d4b7f0b6 100644 --- a/getting_started/setup_linux/install_locally.rst +++ b/getting_started/setup_linux/install_locally.rst @@ -1,7 +1,7 @@ .. _install-locally: -Install the Kernel locally -####################################### +Install the Kernel Locally +########################## .. contents:: :local: @@ -9,101 +9,126 @@ Install the Kernel locally Introduction ************ - -Make sure you have `setup your development environment `_ before following these steps. This page will guide you through the process of installing the kernel locally on your machine. It will be installed in addition to your distro's default kernel so that you can always change back to that in case something goes wrong. If you're interested in learning more about this process there's lots of online guides available, for example `Fedora's guide `_ or `this wiki page `_. + +Make sure you have `set up your development environment `_ before following these steps. This page will guide you through the process of installing the kernel locally on your machine. It will be installed in addition to your distro's default kernel so that you can always change back to that in case something goes wrong. If you are interested in learning more about this process, there are lots of online guides available, for example `Fedora* Quick Docs `_ or `this wiki page `_. Build and install the kernel **************************** -(You should be in the ``~/sof/linux`` directory you created on the setup page) +1. Change directory to ``~/sof/linux`` that you created on the setup page. -1. Load base kernel configuration ---------------------------------- +#. Load the base kernel configuration. -.. code-block:: bash + The following command copies the configuration of the booted kernel so that it will be used as a base: + + .. code-block:: bash - # This will copy the booted kernel's configuration so that it will be used as a base - cp /boot/config-$(uname -r)* .config + cp /boot/config-$(uname -r)* .config -2. Apply SOF-specific configuration ------------------------------------ +#. Apply the SOF-specific configuration. -The following scripts will update your base config so that it uses the latest SOF modules. Run only one of them depending on your needs. If it prompts you with any questions, just press to accept the default value. Note that, by default, these scripts will set the configuration to only compile modules that are currently loaded in order to lower compile times. This means that when you've booted from the custom kernel some external devices may not work if they weren't connected while running this script. If you want to compile all modules, delete the line ``make localmodconfig`` from the script you will run in this step. -.. code-block:: bash + The following scripts update your base configuration so that it uses the latest SOF modules. Run only one of them depending on your needs. If it prompts you with any questions, just press **Enter** to accept the default value. Note that, by default, these scripts will set the configuration to only compile modules that are currently loaded in order to lower compile times. This means that when you've booted from the custom kernel, some external devices may not work if they were not connected while running this script. If you want to compile all modules, delete the line ``make localmodconfig`` from the script you will run in this step. - # For most users - ../kconfig/kconfig-distro-sof-update.sh - # For additional logging and experimental device support - ../kconfig/kconfig-distro-sof-dev-update.sh + - For most users: -3. Compile the kernel ---------------------- + .. code-block:: bash -.. code-block:: bash + ../kconfig/kconfig-distro-sof-update.sh - # The first time you run this it can take a while (over 30 minutes on some machines), - # so grab a coffee or take an exercise break while it runs - make -j$(nproc --all) -4. Install the kernel ---------------------- + - For additional logging and experimental device support: -.. code-block:: bash + .. code-block:: bash + + ../kconfig/kconfig-distro-sof-dev-update.sh - sudo make modules_install - sudo make install + .. _compile-kernel-step: -If all went well, your freshly-built kernel will be installed and available at next boot. Restart your computer, and you should have the option to pick a kernel when it turns on. Select the kernel that has "-sof" at the end of it, and your computer should boot as normal using the kernel you just built. On Ubuntu, the kernel option may be hidden behind the "Advanced options for Ubuntu" submenu. +#. Compile the kernel. -5. Updating and rebuilding --------------------------- + The first time you run this command, it can take a while (over 30 minutes on some machines), so grab a coffee or take an exercise break while it runs. -If you need to try some new changes, you'll have to download the updated code and rebuild the kernel. + .. code-block:: bash -If you originally cloned the repo using git, you just need to pull the changes: + make -j$(nproc --all) -.. code-block:: bash + .. _install-kernel-step: - git pull - # You should run this after switching branches or configuration or any other major code change - # If you just pulled some minor updates, it's likely unnecessary and will increase your build time - make clean +#. Install the kernel. -Now, repeat steps 3 and 4 to rebuild and reinstall the kernel. Reboot your computer, and select the kernel with -sof at the end to test it. + .. code-block:: bash + + sudo make modules_install + sudo make install + +If all went well, your freshly-built kernel will be installed and available at next boot. Restart your computer, and you should have the option to pick a kernel when it turns on. Select the kernel which name has ``-sof`` at the end of it, and your computer should boot as normal using the kernel you just built. On Ubuntu*, the kernel option may be hidden behind the **Advanced options for Ubuntu** submenu. + +Update and rebuild +****************** + +If you need to try some new changes, download the updated code and rebuild the kernel. + +Update the kernel cloned with git +--------------------------------- + +If you originally cloned the repo using git, perform the following steps to update and rebuild the kernel: + +1. Pull the changes. -Unfortunately, if you downloaded via zip, the entire process has to be restarted from the "Get the kernel source" section; there's no good way to incrementally update. However, the kernel build should be faster now as part of it will be cached. + .. code-block:: bash + + git pull + +#. Clean the directory. + + .. note:: You should clean up after switching branches or configuration or any other major code change. If you just pulled some minor updates, it's likely unnecessary and will increase your build time. + + .. code:: bash + + make clean + +#. Repeat :ref:`steps 4` :ref:`and 5` to rebuild and reinstall the kernel. + +#. Reboot your computer, and select the kernel with ``-sof`` at the end of its name to test it. + +Update the kernel downloaded via zip +------------------------------------ + +Unfortunately, if you downloaded via zip, the entire process has to be restarted from the :ref:`Get the kernel source` step. There is no good way to incrementally update. However, the kernel build should be faster now as part of it will be cached. + +Make sure you delete the old folder before starting over: .. code-block:: bash cd .. - # Delete the old folder before starting over rm -rf linux -6. Removing the kernel ----------------------- + +Remove the kernel +***************** If you run into issues or no longer need the custom kernel, you can remove it. -Ubuntu: +- Ubuntu: -.. code-block:: bash + .. code-block:: bash - cd ~/sof/linux - sudo rm /boot/*-$(make kernelversion) - sudo rm -rf /lib/modules/$(make kernelversion) - sudo update-grub + cd ~/sof/linux + sudo rm /boot/*-$(make kernelversion) + sudo rm -rf /lib/modules/$(make kernelversion) + sudo update-grub -Fedora: +- Fedora: -.. code-block:: bash + .. code-block:: bash - cd ~/sof/linux - sudo rm /boot/*-$(make kernelversion)* - sudo rm -rf /lib/modules/$(make kernelversion) - sudo grubby --remove-kernel=/boot/vmlinuz-$(make kernelversion) + cd ~/sof/linux + sudo rm /boot/*-$(make kernelversion)* + sudo rm -rf /lib/modules/$(make kernelversion) + sudo grubby --remove-kernel=/boot/vmlinuz-$(make kernelversion) After rebooting, you should be back to your old kernel with all traces of the custom kernel installation gone. If you'd like, you can also delete the ``~sof`` directory to save disk space. diff --git a/getting_started/setup_linux/prepare_build_environment.rst b/getting_started/setup_linux/prepare_build_environment.rst index 30382aa7..d86cb6aa 100644 --- a/getting_started/setup_linux/prepare_build_environment.rst +++ b/getting_started/setup_linux/prepare_build_environment.rst @@ -1,102 +1,79 @@ .. _prepare-build-environment: -Set up a development environment to build the kernel +Set up a Development Environment to Build the Kernel #################################################### -.. contents:: - :local: - :depth: 3 +These instructions will help you set up a development environment for the SOF branch of the Linux kernel. If you have dedicated test hardware, you can use ktest to install it over ssh. Otherwise, you can install it locally on your device in addition to your default kernel. -Introduction -************ +Review the following prerequisites: +- **Development device:** PC running Fedora* 35+ or Ubuntu* 20.04+. -These instructions will help you set up a development environment for the SOF branch of the Linux kernel. If you have dedicated test hardware you can use ktest to install it over ssh, otherwise you can install it locally on your device in addition to your default kernel. +- **Target device:** PC running Fedora 35+ or Ubuntu 20.04+, with secure boot disabled. If the target device is different than the development device, you must be able to ssh into the target, which is typically on the same local network/VPN. -Prerequisites -************* +1. Create a working directory. -1. Device requirements ------------------------ + This directory can be located anywhere. Simply change the ``SOF_WORKSPACE`` variable if you would like to store your sources somewhere else. -**Development device:** PC running Fedora 35+ or Ubuntu 20.04+. + .. code-block:: bash -**Target device:** PC running Fedora 35+ or Ubuntu 20.04+, with secure boot disabled. If the target device is different than the development device you must be able to ssh into the target, which is typically on the same local network/VPN. + export SOF_WORKSPACE=~/work/sof + mkdir -p $SOF_WORKSPACE + cd $SOF_WORKSPACE -2. Create working directory ---------------------------- +#. Install kernel build dependencies. -This directory can be located anywhere, simply change the ``SOF_WORKSPACE`` variable if you would like to store your sources somewhere else. + - Fedora (see `their guide `_ for details): -.. code-block:: bash + .. code-block:: bash - export SOF_WORKSPACE=~/work/sof - mkdir -p $SOF_WORKSPACE - cd $SOF_WORKSPACE + sudo dnf install fedpkg + fedpkg clone -a kernel + cd kernel + sudo dnf builddep kernel.spec + sudo dnf install ccache + cd .. -3. Install kernel build dependencies ------------------------------------- + - Ubuntu (see `their page `_ for details): -Fedora (see `their guide `_ for details): + .. code-block:: bash -.. code-block:: bash + sudo apt update + sudo apt install git libncurses-dev gawk flex bison openssl libssl-dev dkms libelf-dev libudev-dev libpci-dev libiberty-dev autoconf dwarves zstd - sudo dnf install fedpkg - fedpkg clone -a kernel - cd kernel - sudo dnf builddep kernel.spec - sudo dnf install ccache - cd .. +#. Download the configuration scripts. -Ubuntu (see `their page `_ for details): + .. code-block:: bash -.. code-block:: bash + git clone https://github.com/thesofproject/kconfig.git - sudo apt update - sudo apt install git libncurses-dev gawk flex bison openssl libssl-dev dkms libelf-dev libudev-dev libpci-dev libiberty-dev autoconf dwarves zstd + .. _get-kernel-source: + +#. Get the kernel source. -4. Download the configuration scripts -------------------------------------- + There are two ways to get the kernel source. We strongly recommend using git as it makes updates **much** easier, but the zip download may be more successful if you have an unstable connection. -.. code-block:: bash + - Option 1: Clone with git. - git clone https://github.com/thesofproject/kconfig.git + .. code-block:: bash -Get the kernel source -********************* + git clone https://github.com/thesofproject/linux.git --depth=1 + cd linux -There are two ways to get the kernel source. We strongly recommend using git as it makes updates **much** easier, but the zip download may be more successful if you have an unstable connection. + .. note:: -Option 1: Clone with git ------------------------- -.. code-block:: bash + If a maintainer requests that you check out a different branch to test a bug fix, add ``-b [branch]`` to the end of this command, where `[branch]` is the branch name. - # If a maintainer requests that you check out a different branch - # to test a bug fix, add -b [branch] - # to the end of this command, where [branch] is the branch name - git clone https://github.com/thesofproject/linux.git --depth=1 - cd linux + - Option 2: Download via zip. -Option 2: Download via zip --------------------------- + Visit the SOF Linux fork at https://github.com/thesofproject/linux. If a maintainer asks you to test a specific branch, click the dropdown with the text "topic/sof-dev" and select the branch they asked you to test. Then, click the green **Code** dropdown and select **Download ZIP**. Once it is downloaded, extract it to the directory you created in the previous step: -Visit the SOF Linux fork at https://github.com/thesofproject/linux. If a maintainer asks you to test a specific branch, click the dropdown with the text "topic/sof-dev" and select the branch they asked you to test. Then, click the green "Code" dropdown and select "download zip". Once it's downloaded, extract it to the directory you created in the previous step: + .. code-block:: bash -.. code-block:: bash + cd ~/Downloads + unzip linux-*.zip -d $SOF_WORKSPACE + cd $SOF_WORKSPACE + mv linux-* linux + cd linux - cd ~/Downloads - unzip linux-*.zip -d $SOF_WORKSPACE - cd $SOF_WORKSPACE - mv linux-* linux - cd linux - -Build the kernel -**************** - -Your device should now be ready to configure and build the kernel. How to proceed depends on if you are installing locally or on dedicated test hardware. - -.. toctree:: - :maxdepth: 1 - - install_locally - setup_ktest_environment \ No newline at end of file +Your device should now be ready to configure and build the kernel. How to proceed depends on if you are installing :ref:`locally` or on :ref:`dedicated test hardware`. diff --git a/getting_started/setup_linux/setup_ktest_environment.rst b/getting_started/setup_linux/setup_ktest_environment.rst index b67e6ef7..37dddda3 100644 --- a/getting_started/setup_linux/setup_ktest_environment.rst +++ b/getting_started/setup_linux/setup_ktest_environment.rst @@ -1,6 +1,6 @@ .. _setup-ktest-environment: -Set up a Ktest-based environment +Set up a Ktest-based Environment ################################ .. contents:: @@ -9,389 +9,389 @@ Set up a Ktest-based environment Introduction ************ + These instructions explain how a target device can be configured to update the kernel over SSH. The use of ktest.pl and git worktrees allow for simultaneous configs to be tested on multiple platforms. Wired Ethernet access is assumed as wireless is unreliable. If there is no Ethernet port, use a USB-Ethernet dongle supported in the kernel. -Prerequisites on the target device -********************************** - The target device can be any of the SOF-supported platforms, -e.g. MinnowBoard, Up^2, Asus T100, Chromebooks. +such as MinnowBoard, Up^2, Asus T100, Chromebooks. + +Set up a target +*************** + +1. Install Ubuntu*, Debian*, or Fedora* on the target. + +#. Enable root password. + + .. code-block:: bash + + sudo su (enter your password) + passwd (enter new root password) + exit + +#. Create a test kernel. + + Copy your existing known-to-work kernels/initrd. -1. Install OS on target ------------------------ + .. code-block:: bash -Install Ubuntu, Debian, or Fedora. + sudo cp /boot/vmlinuz-$(uname -r) /boot/vmlinuz-test -2. Enable root password ------------------------ + # On Ubuntu: + sudo cp /boot/initrd.img-$(uname -r) /boot/initrd.img-test -.. code-block:: bash + # On Fedora: + sudo cp /boot/initramfs-$(uname -r).img /boot/initramfs-test.img + sudo grubby --add-kernel /boot/vmlinuz-test --title=test - sudo su (enter your password) - passwd (enter new root password) - exit +#. Edit grub settings. -3. Create test kernel ---------------------- + Perform these steps only on Ubuntu and Debian. Fedora has the proper settings by default. -Copy your existing known-to-work kernels/initrd + a) Open the grub configuration file in your editor of choice as a super user: -.. code-block:: bash + .. code-block:: bash - sudo cp /boot/vmlinuz-$(uname -r) /boot/vmlinuz-test + sudo emacs /etc/default/grub - # On Ubuntu: - sudo cp /boot/initrd.img-$(uname -r) /boot/initrd.img-test + b) Change ``GRUB_DEFAULT=[n]`` to ``GRUB_DEFAULT=saved``. + + c) Add ``GRUB_DISABLE_SUBMENU=y`` to the end of the file and save it. - # On Fedora: - sudo cp /boot/initramfs-$(uname -r).img /boot/initramfs-test.img - sudo grubby --add-kernel /boot/vmlinuz-test --title=test + This step is necessary because submenus confuse ktest. -4. Edit grub settings ---------------------- + d) Update the grub configuration. -This only needs to be run on Ubuntu and Debian, Fedora has the proper settings by default. + .. code-block:: + + sudo update-grub -.. code-block:: bash +#. Set the default kernel. - # Use your text editor of choice. - sudo emacs /etc/default/grub - # Change GRUB_DEFAULT=[n] to GRUB_DEFAULT=saved - # Then add GRUB_DISABLE_SUBMENU=y to the end and save, - # submenus confuse ktest. - sudo update-grub + You will never override the default + distro kernel, so you will always have the ability to boot a + working kernel if your changes cause issues. + By setting the default kernel, you can return your system to a stable + state with just a power cycle, no grub menus involved. -5. Set the default kernel -------------------------- + - On Ubuntu: -You will never override the default -distro kernel, so you will always have the ability to boot a -working kernel if your changes cause issues. -By setting the default kernel, you can return your system to a stable -state with just a power cycle, no grub menus involved. + .. code-block:: bash -On Ubuntu: + # Print your currently booted (and known-safe) option + cat /proc/cmdline + # List the grub entries + awk '/^menuentry/ { print i++, '\t', $0 }' /boot/grub/grub.cfg + # Find the entry that matches the output of the + # first command you ran, and take note of its number + sudo grub-set-default [n] # Where [n] is that number + # This should print saved_entry=[n] + grub-editenv list -.. code-block:: bash + - On Fedora: - # Print your currently booted (and known-safe) option - cat /proc/cmdline - # List the grub entries - awk '/^menuentry/ { print i++, '\t', $0 }' /boot/grub/grub.cfg - # Find the entry that matches the output of the - # first command you ran, and take note of it's number - sudo grub-set-default [n] # Where [n] is that number - # This should print saved_entry=[n] - grub-editenv list + .. code-block:: bash -On Fedora: + sudo grubby --set-default /boot/vmlinuz-$(uname -r) -.. code-block:: bash +6. Get familiar with grub-reboot. - sudo grubby --set-default /boot/vmlinuz-$(uname -r) + ktest relies on grub-reboot. grub-reboot lets you try a freshly built + kernel *only once* and then boot immediately a "safe" kernel again + without interacting with the boot menu: a simple power cycle is + enough. It's a must have for testing development kernels that may not + fully boot. -6. Get familiar with grub-reboot --------------------------------- + In case something goes wrong with ktest, being familiar with grub-reboot + may save you interacting with the boot menu or even better: it may save + you making your system unbootable by accident. Understanding how + grub-reboot works is required to fully understand ktest + configuration. It's much easier to discover grub-reboot alone than when + entangled with ktest. -ktest relies on grub-reboot. grub-reboot lets you try a freshly built -kernel *only once* and then boot immediately a "safe" kernel again -without interacting with the boot menu: a simple power cycle is -enough. It's a must have for testing development kernels that may not -fully boot. + Here is a quick cheat sheet for grub-reboot on Ubuntu/Debian. For + more details, search the documentation of your Linux distribution. The + commands below have been tested on Ubuntu 20.04. They should be nearly + identical for most Debian-derived Linux distributions. -In case something goes wrong with ktest, being familiar with grub-reboot -may save you interacting with the boot menu or even better: it may save -you making your system unbootable by accident. Understanding how -grub-reboot works is required to fully understand ktest -configuration. It's much easier to discover grub-reboot alone than when -entangled with ktest. + .. warning:: -Here's a quick cheat sheet for grub-reboot on Ubuntu/Debian. For -more details search the documentation of your Linux distribution. The -commands below have been tested on Ubuntu 20.04; they should be nearly -identical for most Debian-derived linux distributions. + ``update-grub`` does not care about menuentry order and will mess up what the numbers below point to! After running update-grub, make sure the default kernel index is correct and points towards a known-safe kernel. -Warning: ``update-grub`` does not care about menuentry order and will -mess up what the numbers below point to! After running update-grub, make sure the default kernel index is correct and points towards a known-safe kernel. + .. code-block:: bash -.. code-block:: bash + # Add/remove entries in grub.cfg after making changes in /boot/ + # grub.cfg is generated, don't edit it! + update-grub - # Add/remove entries in grub.cfg after making changes in /boot/ - # grub.cfg is generated, don't edit it! - update-grub + # See which GRUB entry was booted + cat /proc/cmdline - # See which GRUB entry was booted - cat /proc/cmdline + # Show the default menuentry + grub-editenv list + #=> saved_entry=6 - # Show the default menuentry - grub-editenv list - #=> saved_entry=6 + # Show all, numbered kernel choices without (re)booting + awk '/^menuentry/ { print i++, '\t', $0 }' /boot/grub/grub.cfg + #=> 5 menuentry ... + #=> 6 menuentry 'Ubuntu, with Linux 5.4.0-53-generic' --class ubuntu ... + #=> 7 menuentry ... - # Show all, numbered kernel choices without (re)booting - awk '/^menuentry/ { print i++, '\t', $0 }' /boot/grub/grub.cfg - #=> 5 menuentry ... - #=> 6 menuentry 'Ubuntu, with Linux 5.4.0-53-generic' --class ubuntu ... - #=> 7 menuentry ... + # Attempt to boot menuentry 4 only once + grub-reboot 4 + # Run this to see the updated settings + grub-editenv list + #=> saved_entry=6 + #=> next_entry=4 + reboot - # Attempt to boot menuentry 4 only once - grub-reboot 4 - # Run this to see the updated settings - grub-editenv list - #=> saved_entry=6 - #=> next_entry=4 - reboot + # Switch to menuentry number 4 as the new "safe" kernel + grub-set-default 4 - # Switch to menuentry number 4 as the new "safe" kernel - grub-set-default 4 + Fedora and derived distributions have a more elaborate system to manage + "installed" kernels. Instead of extracting ``menuentry`` lines from + ``/boot/grub/grub.cfg`` with the ``awk`` command above, to list all + installed kernels use ``grubby --info=ALL``. + Check ``grubby`` documentation for more details. + To boot a different kernel just once, use ``grub2-reboot [n]``, where ``[n]`` is the index of the menu entry you'd like to boot. -Fedora and derived distributions have a more elaborate system to manage -"installed" kernels. Instead of extracting ``menuentry`` lines from -``/boot/grub/grub.cfg`` with the ``awk`` command above, to list all -installed kernels use ``grubby --info=ALL``. -Check ``grubby``'s documentation for more details. -To boot a different kernel just once, use ``grub2-reboot [n]``, where ``[n]`` is the index of the menu entry you'd like to boot. +#. Install and configure openssh-server. -6. Install openssh-server -------------------------- + a) Install or enable openssh-server: -.. code-block:: bash + - On Ubuntu, install the server: - # On Ubuntu, you need to install it - sudo apt-get install openssh-server + .. code-block:: bash - #On Fedora, you just need to enable it - sudo systemctl enable sshd + sudo apt-get install openssh-server - # On either system, you'll need to update the config - # Use your editor of choice. - sudo emacs /etc/ssh/sshd_config + - On Fedora, enable the server: -Replace ``#PermitRootLogin prohibit-password`` with ``PermitRootLogin yes`` -(make sure to remove the ``#``) and save. This is just temporary, you'll change this back once you've copied over your ssh key. + .. code-block:: bash + + sudo systemctl enable sshd -7. Reboot target ----------------- + b) Update the openssh-server configuration using your editor of choice. -Make sure it boots automatically to your safe kernel. It's also recommended to test using grub-reboot to boot the test kernel, then rebooting again to make sure it goes back to the safe kernel. + .. code-block:: bash + + sudo emacs /etc/ssh/sshd_config + + Replace ``#PermitRootLogin prohibit-password`` with ``PermitRootLogin yes`` and save the file. Make sure to remove the hash character (#). + + This is just temporary, you will change this back once you have copied over your ssh key. + +#. Reboot the target. + + Make sure it boots automatically to your safe kernel. We also recommend to test using grub-reboot to boot the test kernel, then rebooting again to make sure it goes back to the safe kernel. Configure SSH without password ****************************** -1. Check SSH connection ------------------------ +1. Check the SSH connection. -You must be able to ssh into the target device, which is typically on the same local network/VPN. Run ``ip addr`` on the target to get its IP address. All other commands should be run on your dev machine, unless specified otherwise. + You must be able to ssh into the target device, which is typically on the same local network/VPN. Run ``ip addr`` on the target to get its IP address. All other commands should be run on your dev machine, unless specified otherwise. -.. code-block:: bash + .. code-block:: bash - # Make sure that you can connect and login to the target - ssh root@ + # Make sure that you can connect and login to the target + ssh root@ -2. Generate an SSH key for the target -------------------------------------- +#. Generate an SSH key for the target. -If you already have an ssh key you'd prefer to use, you can skip this step. + If you already have an ssh key you'd prefer to use, you can skip this step. -.. code-block:: bash + .. code-block:: bash - ssh-keygen -f ~/.ssh/sshktest - # This will prompt you for the target's root password. - ssh-copy-id -i ~/.ssh/sshktest root@ + ssh-keygen -f ~/.ssh/sshktest + # This will prompt you for the target's root password. + ssh-copy-id -i ~/.ssh/sshktest root@ -3. Test the key ---------------- +#. Test the key. -.. code-block:: bash + .. code-block:: bash - ssh root@ + ssh root@ -.. note:: + .. note:: - In most cases `ssh-agent` should automatically manage your password(s) and key(s). If you are still prompted for a password, it's likely your distro hasn't configured `ssh-agent`. You can either figure out how to enable it, or you can manually update your config. - To do this, put the following in ``~/.ssh/config`` (make sure to update ````) and then use ``ktest-target`` instead of the actual target's IP for ssh connections (ie ``ssh root@ktest-target``). + In most cases `ssh-agent` should automatically manage your password(s) and key(s). If you are still prompted for a password, it's likely your distro hasn't configured `ssh-agent`. You can either figure out how to enable it, or you can manually update your config. + To do this, put the following in ``~/.ssh/config`` (make sure to update ````) and then use ``ktest-target`` instead of the actual target's IP for ssh connections (for example, ``ssh root@ktest-target``). - .. code-block:: text + .. code-block:: text - Host ktest-target - HostName - IdentityFile ~/.ssh/sshktest + Host ktest-target + HostName + IdentityFile ~/.ssh/sshktest -4. Disable root access ----------------------- -Run this on the target device to disable root password, -you won't need it now that you've copied the key. +#. Disable root access. -.. code-block:: bash + Run this on the target device to disable root password, + you do not need it now that you have copied the key. - # Use your editor of choice. - sudo emacs /etc/ssh/sshd_config + .. code-block:: bash -Replace ``PermitRootLogin yes`` by ``PermitRootLogin without-password``, save, and exit. + # Use your editor of choice. + sudo emacs /etc/ssh/sshd_config + + Replace ``PermitRootLogin yes`` by ``PermitRootLogin without-password``, save, and exit. Build and install the kernel with ktest *************************************** Follow the `prepare build environment `_ instructions before proceeding. -1. Prepare ktest environment ----------------------------- +1. Prepare the ktest environment. + + If you run this in a different terminal than you used for the `prepare build environment `_ instructions, you need to re-set the SOF_WORKSPACE variable by running ``export SOF_WORKSPACE = ~/work/sof``. + + .. code-block:: bash + + cd $SOF_WORKSPACE + mkdir sof-dev-build + mkfifo sof-dev-cat + cp linux/tools/testing/ktest/ktest.pl . -If you're running this in a different terminal than you used for the prepare build environment page, you will need to re-set the SOF_WORKSPACE variable by running ``export SOF_WORKSPACE = ~/work/sof``. +#. Save your kernel configuration as ``sof-dev-defconfig``. -.. code-block:: bash + If you do not know what options are needed, you can start using configurations maintained by SOF developers. - cd $SOF_WORKSPACE - mkdir sof-dev-build - mkfifo sof-dev-cat - cp linux/tools/testing/ktest/ktest.pl . + .. code-block:: bash -2. Save your kernel config as sof-dev-defconfig ------------------------------------------------ + cd linux + make O=../sof-dev-build olddefconfig + echo test > ../sof-dev-build/localversion + bash ../kconfig/kconfig-sof-default.sh + cp .config ../sof-dev-defconfig + make mrproper + cd .. -If you don't know what options are needed, you can start using configurations maintained by SOF developers. + .. note:: -.. code-block:: bash + Use make proper since ktest.pl requires the source directory + to be clean. All compilation happens in the -build directory. - cd linux - make O=../sof-dev-build olddefconfig - echo test > ../sof-dev-build/localversion - bash ../kconfig/kconfig-sof-default.sh - cp .config ../sof-dev-defconfig - make mrproper - cd .. + .. note:: -.. note:: + The options provided in kconfig/sof-dev-defconfig should not be used for a distro's production kernel. - Use make proper since ktest.pl requires the source directory - to be clean. All compilation happens in the -build directory. +#. Edit ktest configuration as needed. -.. note:: + Save the following in ``sof-dev.conf``. Make sure to update the ``MACHINE=`` line with your target device's IP (or ``ktest-target`` if you had to do the additional ssh config). - The options provided in kconfig/sof-dev-defconfig should not be used for a distro's production kernel. + .. code-block:: perl -3. Edit ktest configuration as needed -------------------------------------- + # The difference between config variables (:=) and ktest options (=) and a + # few other things are explained in tools/testing/ktest/examples/sample.conf -Save the following in ``sof-dev.conf``. Make sure to update the ``MACHINE=`` line with your target device's IP (or ``ktest-target`` if you had to do the additional ssh config). + MACHINE = 192.168.1.205 + CLEAR_LOG = 1 + SSH_USER = root + THIS_DIR := ${PWD} + # BUILD_DIR is the source directory + BUILD_DIR = ${THIS_DIR}/linux + # OUTPUT_DIR is the actual build directory + OUTPUT_DIR = ${THIS_DIR}/sof-dev-build + BUILD_TARGET = arch/x86/boot/bzImage -.. code-block:: perl + # ktest requires LOCALVERSION. This is normally a '-something' suffix like + # in 'vmlinuz-5.10-rc5-something'. Let's (ab)use it as the full version so + # we have a constant 'vmlinuz-something' filename and we don't have to + # make changes in /boot/ all the time. + # update-grub will complain but work anyway. + LOCALVERSION = test + TARGET_IMAGE = /boot/vmlinuz-${LOCALVERSION} - # The difference between config variables (:=) and ktest options (=) and a - # few other things are explained in tools/testing/ktest/examples/sample.conf + BUILD_OPTIONS = -j8 + LOG_FILE = ${OUTPUT_DIR}/sof-dev.log + CONSOLE = cat ${THIS_DIR}/sof-dev-cat + POWER_CYCLE = echo Power cycle the machine now and press ENTER; read a + #set below to help ssh connection to close after sending reboot command + REBOOT = ssh $SSH_USER@$MACHINE 'sudo reboot > /dev/null &' - MACHINE = 192.168.1.205 - CLEAR_LOG = 1 - SSH_USER = root - THIS_DIR := ${PWD} - # BUILD_DIR is the source directory - BUILD_DIR = ${THIS_DIR}/linux - # OUTPUT_DIR is the actual build directory - OUTPUT_DIR = ${THIS_DIR}/sof-dev-build - BUILD_TARGET = arch/x86/boot/bzImage + # This how ktest finds which menuentry number to pass to grub-reboot + GRUB_FILE = /boot/grub/grub.cfg + GRUB_MENU = Ubuntu, with Linux ${LOCALVERSION} + #GRUB_MENU = ubilinux GNU/Linux, with Linux ${LOCALVERSION} + #GRUB_MENU = GalliumOS GNU/Linux, with Linux ${LOCALVERSION} + GRUB_REBOOT = grub-reboot + REBOOT_TYPE = grub2 - # ktest requires LOCALVERSION. This is normally a '-something' suffix like - # in 'vmlinuz-5.10-rc5-something'. Let's (ab)use it as the full version so - # we have a constant 'vmlinuz-something' filename and we don't have to - # make changes in /boot/ all the time. - # update-grub will complain but work anyway. - LOCALVERSION = test - TARGET_IMAGE = /boot/vmlinuz-${LOCALVERSION} + # update-initramfs does not support any "version-less" 'vmlinuz-test' because it + # does not tell where to find modules like '/lib/modules/5.10.0-rc5test+' + # So we have to use a lower level, more explicit command like: + # mkinitramfs -o initrdfile 5.10.0-rc5test+ + # ktest finds the real KERNEL_VERSION thanks to "make O=${OUTPUT_DIR} + # kernelrelease" + POST_INSTALL = ssh $SSH_USER@$MACHINE sudo /usr/sbin/mkinitramfs -o /boot/initrd.img-${LOCALVERSION} $KERNEL_VERSION - BUILD_OPTIONS = -j8 - LOG_FILE = ${OUTPUT_DIR}/sof-dev.log - CONSOLE = cat ${THIS_DIR}/sof-dev-cat - POWER_CYCLE = echo Power cycle the machine now and press ENTER; read a - #set below to help ssh connection to close after sending reboot command - REBOOT = ssh $SSH_USER@$MACHINE 'sudo reboot > /dev/null &' + #REBOOT_TYPE = script + #REBOOT_SCRIPT = ssh $SSH_USER@$MACHINE "sed -i 's|^default.*$|default test|' /boot/loader/loader.conf" - # This how ktest finds which menuentry number to pass to grub-reboot - GRUB_FILE = /boot/grub/grub.cfg - GRUB_MENU = Ubuntu, with Linux ${LOCALVERSION} - #GRUB_MENU = ubilinux GNU/Linux, with Linux ${LOCALVERSION} - #GRUB_MENU = GalliumOS GNU/Linux, with Linux ${LOCALVERSION} - GRUB_REBOOT = grub-reboot - REBOOT_TYPE = grub2 + TEST_START + # TEST_TYPE can be: build, install, boot, ... + TEST_TYPE = boot + BUILD_TYPE = useconfig:${THIS_DIR}/sof-dev-defconfig + BUILD_NOCLEAN = 1 - # update-initramfs does not support any "version-less" 'vmlinuz-test' because it - # does not tell where to find modules like '/lib/modules/5.10.0-rc5test+' - # So we have to use a lower level, more explicit command like: - # mkinitramfs -o initrdfile 5.10.0-rc5test+ - # ktest finds the real KERNEL_VERSION thanks to "make O=${OUTPUT_DIR} - # kernelrelease" - POST_INSTALL = ssh $SSH_USER@$MACHINE sudo /usr/sbin/mkinitramfs -o /boot/initrd.img-${LOCALVERSION} $KERNEL_VERSION - #REBOOT_TYPE = script - #REBOOT_SCRIPT = ssh $SSH_USER@$MACHINE "sed -i 's|^default.*$|default test|' /boot/loader/loader.conf" + For targets running Fedora and derived distributions, make the following changes: - TEST_START - # TEST_TYPE can be: build, install, boot, ... - TEST_TYPE = boot - BUILD_TYPE = useconfig:${THIS_DIR}/sof-dev-defconfig - BUILD_NOCLEAN = 1 + .. code-block:: perl + # GRUB_MENU should be the title of the custom kernel entry you added, + # which will match LOCALVERSION ("test") if you followed the previous steps + # You can view all your kernel entries with `grubby --info=ALL` + GRUB_MENU = ${LOCALVERSION} + GRUB_REBOOT = grub2-reboot + REBOOT_TYPE = grub2bls + POST_INSTALL = ssh $SSH_USER@$MACHINE sudo dracut --hostonly --force /boot/initramfs-${LOCALVERSION}.img $KERNEL_VERSION -For targets running Fedora and derived distributions, make the following changes: +#. Build and test. -.. code-block:: perl + .. code-block:: bash - # GRUB_MENU should be the title of the custom kernel entry you added, - # which will match LOCALVERSION ("test") if you followed the previous steps - # You can view all your kernel entries with `grubby --info=ALL` - GRUB_MENU = ${LOCALVERSION} - GRUB_REBOOT = grub2-reboot - REBOOT_TYPE = grub2bls - POST_INSTALL = ssh $SSH_USER@$MACHINE sudo dracut --hostonly --force /boot/initramfs-${LOCALVERSION}.img $KERNEL_VERSION + # This can take a while, so don't kill it if it appears to freeze + ./ktest.pl sof-dev.conf -4. Build and test ------------------ + If this does not work, make sure you have all the following files in the + local directory: -.. code-block:: bash + * ktest.pl + * sof-dev-cat + * linux + * sof-dev-build + * sof-dev.conf + * sof-dev-defconfig - # This can take a while, so don't kill it if it appears to freeze - ./ktest.pl sof-dev.conf + Ktest will compile and install the new kernel, then reboot the target device. Check which kernel is booted by running ``uname -r`` on the target. -If this does not work, make sure you have all the following files in the -local directory: + .. note:: -* ktest.pl -* sof-dev-cat -* linux -* sof-dev-build -* sof-dev.conf -* sof-dev-defconfig + KTest expects a UART connection to verify that the boot was successful. If you do not have a UART connection you will get some errors at the end of the ``ktest.pl`` script's execution, but you can ignore them as long as the custom kernel was installed and booted on the target device. -Ktest will compile and install the new kernel, then reboot the target device. Check which kernel is booted by running ``uname -r`` on the target. +#. Enjoy! -.. note:: +#. Enjoy even more! - KTest expects a UART connection to verify that the boot was successful. If you do not have a UART connection you will get some errors at the end of the ``ktest.pl`` script's execution, but you can ignore them as long as the custom kernel was installed and booted on the target device. + By having multiple `Git worktrees `_ and configs, you can run tests in parallel + on different machines on the same kernel or different branches. -5. Enjoy! ---------- +#. Clean up `/lib/modules`. -6. Enjoy even more! -------------------- + Ktest creates a separate module directory per kernel version. + User needs to clean up old module directory periodically on the target device. + + .. code-block:: bash -By having multiple `Git worktrees `_ and configs, you can run tests in parallel -on different machines on the same kernel or different branches. - -7. Clean up /lib/modules -------------------------- - -Ktest creates a separate module directory per kernel version. -User needs to clean up old module directory periodically on the target device. - -.. code-block:: bash - - $ ls -al /lib/modules - drwxrwxr-x 3 ubuntu ubuntu 4096 Sep 28 15:07 5.9.0-rc4-test+ - drwxrwxr-x 3 ubuntu ubuntu 4096 Sep 24 11:06 5.9.0-rc5-test+ - drwxrwxr-x 3 ubuntu ubuntu 4096 Oct 5 16:39 5.9.0-rc6-test+ - drwxrwxr-x 3 ubuntu ubuntu 4096 Oct 14 21:42 5.9.0-rc7-test+ - drwxrwxr-x 3 ubuntu ubuntu 4096 Nov 2 12:16 5.9.0-rc8-test+ + $ ls -al /lib/modules + drwxrwxr-x 3 ubuntu ubuntu 4096 Sep 28 15:07 5.9.0-rc4-test+ + drwxrwxr-x 3 ubuntu ubuntu 4096 Sep 24 11:06 5.9.0-rc5-test+ + drwxrwxr-x 3 ubuntu ubuntu 4096 Oct 5 16:39 5.9.0-rc6-test+ + drwxrwxr-x 3 ubuntu ubuntu 4096 Oct 14 21:42 5.9.0-rc7-test+ + drwxrwxr-x 3 ubuntu ubuntu 4096 Nov 2 12:16 5.9.0-rc8-test+ From 2f88b994b72d3f41ed2a9f6f4693d72dd7eb45dd Mon Sep 17 00:00:00 2001 From: Anton Bobkov Date: Fri, 25 Mar 2022 17:41:51 +0300 Subject: [PATCH 161/290] Edit code names --- .../cavs-boot/apollolake/apl-boot-ldr.rst | 4 ++-- .../cavs-boot/apollolake/apl-boot-rom.rst | 4 ++-- .../intel/cavs-boot/apollolake/index.rst | 4 ++-- .../firmware/intel/cavs-boot/index.rst | 4 ++-- architectures/firmware/overview.rst | 4 ++-- developer_guides/topology/topology.rst | 2 +- .../build-guide/build-from-scratch.rst | 4 ++-- .../build-guide/build-with-docker.rst | 4 ++-- getting_started/intel_debug/introduction.rst | 14 ++++++------ introduction/index.rst | 2 +- platforms/index.rst | 22 +++++++++---------- platforms/intel-cavs/icelake/icl-memory.rst | 2 +- platforms/intel-cavs/index.rst | 2 +- platforms/intel-legacy/baytrail/index.rst | 12 +++++----- platforms/intel-legacy/index.rst | 2 +- platforms/intel-legacy/merrifield/index.rst | 4 ++-- 16 files changed, 45 insertions(+), 45 deletions(-) diff --git a/architectures/firmware/intel/cavs-boot/apollolake/apl-boot-ldr.rst b/architectures/firmware/intel/cavs-boot/apollolake/apl-boot-ldr.rst index 2b6c68c5..04fd5d0e 100644 --- a/architectures/firmware/intel/cavs-boot/apollolake/apl-boot-ldr.rst +++ b/architectures/firmware/intel/cavs-boot/apollolake/apl-boot-ldr.rst @@ -1,7 +1,7 @@ .. _apl-boot-ldr: -Apollolake Boot Loader -###################### +Apollo Lake Boot Loader +####################### * Additional HPSRAM memory initialization. * L2 cache disabled in ``boot_entry`` (enabled by default by APL ROM). diff --git a/architectures/firmware/intel/cavs-boot/apollolake/apl-boot-rom.rst b/architectures/firmware/intel/cavs-boot/apollolake/apl-boot-rom.rst index 037b5718..5070e745 100644 --- a/architectures/firmware/intel/cavs-boot/apollolake/apl-boot-rom.rst +++ b/architectures/firmware/intel/cavs-boot/apollolake/apl-boot-rom.rst @@ -1,7 +1,7 @@ .. _apl-boot-rom: -Apollolake Boot ROM -################### +Apollo Lake Boot ROM +#################### Progress of the boot process is reflected by the status information updated by the ROM in an SRAM area called *FW Registers*. It is available to the host diff --git a/architectures/firmware/intel/cavs-boot/apollolake/index.rst b/architectures/firmware/intel/cavs-boot/apollolake/index.rst index 043d6503..21ee69cb 100644 --- a/architectures/firmware/intel/cavs-boot/apollolake/index.rst +++ b/architectures/firmware/intel/cavs-boot/apollolake/index.rst @@ -1,7 +1,7 @@ .. _cavs-boot-apl: -Apollolake Boot Process -####################### +Apollo Lake Boot Process +######################## .. toctree:: :maxdepth: 1 diff --git a/architectures/firmware/intel/cavs-boot/index.rst b/architectures/firmware/intel/cavs-boot/index.rst index 098f12f2..54ba2ef6 100644 --- a/architectures/firmware/intel/cavs-boot/index.rst +++ b/architectures/firmware/intel/cavs-boot/index.rst @@ -4,9 +4,9 @@ Booting up CAVS ADSP #################### Intel has several generations of audio DSP. "CAVS" versions relate to the audio -DSP in Skylake Core and Apollolake Atom platforms onwards. +DSP in Skylake Core and Apollo Lake Atom platforms onwards. -Baytrail, Cherrytrail, Braswell, Haswell and Broadwell audio DSPs have a simpler +Bay Trail, Cherry Trail, Braswell, Haswell, and Broadwell audio DSPs have a simpler boot flow using memory copy and not authentication. diff --git a/architectures/firmware/overview.rst b/architectures/firmware/overview.rst index 48649106..4cbe26b5 100644 --- a/architectures/firmware/overview.rst +++ b/architectures/firmware/overview.rst @@ -38,9 +38,9 @@ main sections: :alt: SOF Architecture :width: 800px - `Sound Open Firmware Architecture using Intel Baytrail Platform` + `Sound Open Firmware Architecture using Intel Bay Trail Platform` Each section above is well insulated from the other sections by partitioning code into separate directories and by using DSP and platform agnostic generic -APIs for orchestration between the sections. \ No newline at end of file +APIs for orchestration between the sections. diff --git a/developer_guides/topology/topology.rst b/developer_guides/topology/topology.rst index d2f7a4ab..0f9b04a3 100644 --- a/developer_guides/topology/topology.rst +++ b/developer_guides/topology/topology.rst @@ -217,7 +217,7 @@ DAI_ADD macro defined as follows: | **dai_index**: index of the dai in the firmware. Please note that the DAI’s of different types can have the same dai_index. The dai_index information can be found by looking in platform-specific dai array - definitions in the firmware. For example, for apollolake these are + definitions in the firmware. For example, for Apollo Lake these are defined in src/platform/apollolake/dai.c. | **dai_be**: name of CPU DAI as defined in DAI array in the platform driver. | **buffer**: Source/sink buffer the DAI is connected to. This completes the diff --git a/getting_started/build-guide/build-from-scratch.rst b/getting_started/build-guide/build-from-scratch.rst index c2cda4dd..1ac50ffc 100755 --- a/getting_started/build-guide/build-from-scratch.rst +++ b/getting_started/build-guide/build-from-scratch.rst @@ -235,7 +235,7 @@ download gcc components. unset LD_LIBRARY_PATH - # Baytrail/Cherrytrail + # Bay Trail / Cherry Trail cp config-byt-gcc10.2-gdb9 .config ./ct-ng build # Haswell/Broadwell @@ -244,7 +244,7 @@ download gcc components. # Apollo Lake cp config-apl-gcc10.2-gdb9 .config ./ct-ng build - # Cannon Lake, Ice Lake, Jasper Lake and Tiger Lake + # Cannon Lake, Ice Lake, Jasper Lake, and Tiger Lake cp config-cnl-gcc10.2-gdb9 .config ./ct-ng build # i.MX8/i.MX8X diff --git a/getting_started/build-guide/build-with-docker.rst b/getting_started/build-guide/build-with-docker.rst index 62831f71..de972829 100644 --- a/getting_started/build-guide/build-with-docker.rst +++ b/getting_started/build-guide/build-with-docker.rst @@ -120,9 +120,9 @@ To build the SOF binaries for one or more platforms: .. code-block:: bash cd "${SOF_WORKSPACE}"/sof/ - # Baytrail + # Bay Trail ./scripts/docker-run.sh ./scripts/xtensa-build-all.sh byt - # Baytrail and Apollo Lake + # Bay Trail and Apollo Lake ./scripts/docker-run.sh ./scripts/xtensa-build-all.sh byt apl Build inside container diff --git a/getting_started/intel_debug/introduction.rst b/getting_started/intel_debug/introduction.rst index 7260602b..f07807bc 100644 --- a/getting_started/intel_debug/introduction.rst +++ b/getting_started/intel_debug/introduction.rst @@ -6,14 +6,14 @@ Overview of Intel hardware platforms ACPI platforms (introduced before and up to 2015) ************************************************* -On Baytrail, Cherrytrail, Braswell, and Broadwell devices (also referred to +On Bay Trail, Cherry Trail, Braswell, and Broadwell devices (also referred to as `legacy` devices), the DSP enumeration is handled by the ACPI subsystem. 1. Local audio accessories (mics, speakers, headset) ---------------------------------------------------- -On Baytrail, Cherrytrail, Braswell, and Broadwell, the BIOS can either +On Bay Trail, Cherry Trail, Braswell, and Broadwell, the BIOS can either enable or disable the DSP: * Enable the DSP. In this case, a DSP driver is required. This mode is @@ -28,7 +28,7 @@ enable or disable the DSP: On Broadwell, HDMI/DP is handled by an HDaudio controller. -On Baytrail/Cherrytrail and Braswell, the BIOS can enable two modes: +On Bay Trail/Cherry Trail and Braswell, the BIOS can enable two modes: * HDAudio-based solution (similar to Broadwell). @@ -55,12 +55,12 @@ exposes PCM devices and no audio processing capabilities. When OEM platforms integrate digital microphones attached directly to the Intel chipset (aka DMIC), or they use I2C/I2S or SoundWire interfaces, the DSP must be enabled by the BIOS. There is, however, one -more option. On Skylake and Kabylake platforms, the Intel DSP is handled by +more option. On Skylake and Kaby Lake platforms, the Intel DSP is handled by the ``snd-soc-skl`` module which relies on closed-source firmware. -SOF is available on Intel PCI devices starting with GeminiLake, and +SOF is available on Intel PCI devices starting with Gemini Lake, and has since been the only solution provided by Intel for the following -platforms: CometLake, IceLake, and TigerLake. +platforms: Comet Lake, Ice Lake, and Tiger Lake. Since multiple drivers can register for the same PCI ID, it was (until recently) common for users and distributions to use the wrong @@ -107,7 +107,7 @@ used. The Intel ME (Management Engine) is responsible for authentication of the firmware, whether it is signed by an Intel production key (consumer products), a community key (open development systems and Chromebooks -since GeminiLake) or an OEM key. If the Intel ME is disabled by an +since Gemini Lake) or an OEM key. If the Intel ME is disabled by an OEM, or disabled by user-accessible BIOS options, the firmware authentication will fail and the firmware boot will not complete. If the ME is disabled by the OEM, the only solution is to fall-back diff --git a/introduction/index.rst b/introduction/index.rst index 40a78904..6b007c57 100644 --- a/introduction/index.rst +++ b/introduction/index.rst @@ -49,7 +49,7 @@ there can be more than once choice for other ingredients as shown in the diagram :alt: SDK Overview :width: 1000px - `SDK example configuration showing development flow for SOF on the Intel Apollolake platform running Linux OS. Note the choice of compiler toolchains and choice of optional DSP emulators.` + `SDK example configuration showing development flow for SOF on the Intel Apollo Lake platform running Linux OS. Note the choice of compiler toolchains and choice of optional DSP emulators.` SOF source code, tools, and topologies diff --git a/platforms/index.rst b/platforms/index.rst index 27fd5407..585e1e00 100644 --- a/platforms/index.rst +++ b/platforms/index.rst @@ -14,16 +14,16 @@ Platform and board specific support is continually added to the SOF project as d "Host Testbench", "PC command line", "N/A", "N/A", "N/A", "N/A Files are used to simulate audio interfaces" "Qemu", "All supported SOF HW platforms", "N/A", "N/A", "N/A", "WiP Files will be used to simulate audio interfaces" - "Intel Baytrail / Merrifield", "Xtensa HiFi2 EP", "1 @ 50 - 400MHz", "25MHz", "96KB IRAM / 192KB DRAM", "3 x SSP (I2S, PCM)" - "Intel Cherrytrail / Braswell", "Xtensa HiFi2 EP", "1 @ 50 - 400MHz", "19.2MHz", "96KB IRAM / 192KB DRAM", "6 x SSP (I2S, PCM)" + "Intel Bay Trail / Merrifield", "Xtensa HiFi2 EP", "1 @ 50 - 400MHz", "25MHz", "96KB IRAM / 192KB DRAM", "3 x SSP (I2S, PCM)" + "Intel Cherry Trail / Braswell", "Xtensa HiFi2 EP", "1 @ 50 - 400MHz", "19.2MHz", "96KB IRAM / 192KB DRAM", "6 x SSP (I2S, PCM)" "Intel Broadwell", "Xtensa HiFi2 EP", "1 @ 50 - 400MHz", "24MHz", "320KB IRAM / 640KB DRAM", "2 x SSP (I2S, PCM)" - "Intel Apollolake / Geminilake", "Xtensa HiFi3", "2 @ 100 - 400MHz", "19.2MHz", "128KB LP SRAM / 512KB HP SRAM", "6 x SSP (I2S, PCM), HDA, DMIC" - "Intel Cannonlake / Whiskeylake / Cometlake", "Xtensa HiFi3", "4 @ 120 - 400MHz", "24MHz", "64KB LP / 3008KB HP SRAM", "3 x SSP (I2S, PCM), HDA, DMIC, Soundwire" - "Intel Suecreek", "Xtensa HiFi3", "2 @ 120 - 400MHz","24MHz", "64KB LP SRAM / 4096KB HP SRAM", "6 x SSP (I2S, PCM), DMIC" - "Intel Icelake", "Xtensa HiFi3", "4 @ 120 - 400MHz", "38.4MHz", "64KB LP SRAM / 3008KB HP SRAM", "6 x SSP (I2S, PCM), HDA, DMIC, Soundwire" - "Intel Jasperlake", "Xtensa HiFi3", "2 @ 120 - 400MHz", "38.4MHz", "64KB LP SRAM / 1024KB HP SRAM", "3 x SSP (I2S, PCM), HDA, DMIC, Soundwire" - "Intel Tigerlake", "Xtensa HiFi3", "4 @ 120 - 400MHz", "38.4MHz", "64KB LP SRAM / 2944KB HP SRAM", "6 x SSP (I2S, PCM), HDA, DMIC, Soundwire" - "Intel Alderlake", "Xtensa HiFi3", "4 @ 120 - 400MHz", "38.4MHz", "64KB LP SRAM / 2944KB HP SRAM", "6 x SSP (I2S, PCM), HDA, DMIC, Soundwire" + "Intel Apollo Lake / Gemini Lake", "Xtensa HiFi3", "2 @ 100 - 400MHz", "19.2MHz", "128KB LP SRAM / 512KB HP SRAM", "6 x SSP (I2S, PCM), HDA, DMIC" + "Intel Cannon Lake / Whiskey Lake / Comet Lake", "Xtensa HiFi3", "4 @ 120 - 400MHz", "24MHz", "64KB LP / 3008KB HP SRAM", "3 x SSP (I2S, PCM), HDA, DMIC, Soundwire" + "Intel Sue Creek", "Xtensa HiFi3", "2 @ 120 - 400MHz","24MHz", "64KB LP SRAM / 4096KB HP SRAM", "6 x SSP (I2S, PCM), DMIC" + "Intel Ice Lake", "Xtensa HiFi3", "4 @ 120 - 400MHz", "38.4MHz", "64KB LP SRAM / 3008KB HP SRAM", "6 x SSP (I2S, PCM), HDA, DMIC, Soundwire" + "Intel Jasper Lake", "Xtensa HiFi3", "2 @ 120 - 400MHz", "38.4MHz", "64KB LP SRAM / 1024KB HP SRAM", "3 x SSP (I2S, PCM), HDA, DMIC, Soundwire" + "Intel Tiger Lake", "Xtensa HiFi3", "4 @ 120 - 400MHz", "38.4MHz", "64KB LP SRAM / 2944KB HP SRAM", "6 x SSP (I2S, PCM), HDA, DMIC, Soundwire" + "Intel Alder Lake", "Xtensa HiFi3", "4 @ 120 - 400MHz", "38.4MHz", "64KB LP SRAM / 2944KB HP SRAM", "6 x SSP (I2S, PCM), HDA, DMIC, Soundwire" "NXP i.MX8", "Xtensa HiFi4", "1 @ 666MHz", "TBD", "64 KB TCM / 448 KB OCRAM / 8MB SDRAM", "1 x ESAI, 1 x SAI" "NXP i.MX8X", "Xtensa HiFi4", "1 @ 640MHz", "TBD", "64 KB TCM / 448 KB OCRAM / 8MB SDRAM", "1 x ESAI, 1 x SAI" "NXP i.MX8M", "Xtensa HiFi4", "1 @ 800MHz", "TBD", "64 KB TCM / 256 KB OCRAM / 8MB SDRAM", "1 x SAI, MICFIL" @@ -42,14 +42,14 @@ Footprint ========= DSP platforms can vary from vendor to vendor but in general SOF can run on -small platforms like Intel Baytrail DSP with 96kb of instruction RAM and 168kb +small platforms like Intel Bay Trail DSP with 96kb of instruction RAM and 168kb of data RAM. The SOF footprint can be shrunk to approximately 50kb of TEXT and DATA by fine-tuning runtime features via Kconfig. DSP Clock Speed =============== -Required DSP clock speed depends on the DSP processing load, so it can vary greatly depending on pipeline topology and the algorithm design that is running. SOF can run several volume passthrough pipelines on the Intel Baytrail DSP at 50MHz using unoptimized C code (SIMD disabled and compiled with GCC). +Required DSP clock speed depends on the DSP processing load, so it can vary greatly depending on pipeline topology and the algorithm design that is running. SOF can run several volume passthrough pipelines on the Intel Bay Trail DSP at 50MHz using unoptimized C code (SIMD disabled and compiled with GCC). Toolchain ========= diff --git a/platforms/intel-cavs/icelake/icl-memory.rst b/platforms/intel-cavs/icelake/icl-memory.rst index 689a316f..19e3e313 100644 --- a/platforms/intel-cavs/icelake/icl-memory.rst +++ b/platforms/intel-cavs/icelake/icl-memory.rst @@ -3,4 +3,4 @@ ICL Memory ########## -Memory map is the same as on Cannonlake. See :ref:`cnl-memory`. +Memory map is the same as on Cannon Lake. See :ref:`cnl-memory`. diff --git a/platforms/intel-cavs/index.rst b/platforms/intel-cavs/index.rst index 62950e1f..cc2b7bd1 100644 --- a/platforms/intel-cavs/index.rst +++ b/platforms/intel-cavs/index.rst @@ -15,7 +15,7 @@ Intel CAVS platforms supported by the |SOF|. | |ver. 2.5 | Tiger Lake | +---------+----------+-----------------------------------------+ -.. note:: While the Sky Lake and Kaby Lake platforms are also based on the +.. note:: While the Skylake and Kaby Lake platforms are also based on the cAVS 1.5 architecture, they are not supported at this time due to differences in boot flow and memory architecture. diff --git a/platforms/intel-legacy/baytrail/index.rst b/platforms/intel-legacy/baytrail/index.rst index 92bfa102..8b5040ca 100644 --- a/platforms/intel-legacy/baytrail/index.rst +++ b/platforms/intel-legacy/baytrail/index.rst @@ -1,20 +1,20 @@ .. _platform-baytrail: -Intel Baytrail/CherryTrail -########################## +Intel Bay Trail / Cherry Trail +############################## -Intel Baytrail platform is based on an Atom CPU and a Tensilica HiFi2 +Intel Bay Trail platform is based on an Atom CPU and a Tensilica HiFi2 EP DSP. It relies on both internal memory and caches to access DDR -memory. The Baytrail processor relies on a 25 MHz oscillator. +memory. The Bay Trail processor relies on a 25 MHz oscillator. Supported commercially-available platforms include the MinnowBoard Turbot, tablets and laptops built for Windows (SOF requires a Linux installation). -The Cherrytrail platform is similar to Baytrail but it relies on a +The Cherry Trail platform is similar to Bay Trail but it relies on a 19.2 MHz osciilator. Supported commercially-available platforms include the Up board and devices built for Windows (SOF requires a Linux installation). -Baytrail and Cherrytrail Chromebooks can support SOF but the official +Bay Trail and Cherry Trail Chromebooks can support SOF but the official images are still based on the closed-source firmware solution. diff --git a/platforms/intel-legacy/index.rst b/platforms/intel-legacy/index.rst index 0e257ef3..ccc590e8 100644 --- a/platforms/intel-legacy/index.rst +++ b/platforms/intel-legacy/index.rst @@ -8,7 +8,7 @@ Intel platforms based on the Tensilica Hifi2-EP DSP supported by the |SOF|. +------------+--------------------------------------------------+ | Atom/PCI | Merrifield (Edison) | +------------+--------------------------------------------------+ -| Atom/ACPI | Baytrail, Cherrytrail, Braswell | +| Atom/ACPI | Bay Trail, Cherry Trail, Braswell | +------------+--------------------------------------------------+ | Core/ACPI | Broadwell (Chromebook Pixel 2015, Dell XPS) | +------------+--------------------------------------------------+ diff --git a/platforms/intel-legacy/merrifield/index.rst b/platforms/intel-legacy/merrifield/index.rst index 0575d848..b6a7311d 100644 --- a/platforms/intel-legacy/merrifield/index.rst +++ b/platforms/intel-legacy/merrifield/index.rst @@ -4,8 +4,8 @@ Intel Merrifield ################ Intel Merrifield platform is based on an Atom CPU and a Tensilica HiFi2 -EP DSP. It is very similar to Baytrail but uses a PCI-based -enumeration and has a clocking structure similar to Cherrytrail. +EP DSP. It is very similar to Bay Trail but uses a PCI-based +enumeration and has a clocking structure similar to Cherry Trail. This platform is no longer commercially available, but the Edison platform is supported by the open-source community. From 82de566c4b81799c06ff950c59a5e8beaab70ce4 Mon Sep 17 00:00:00 2001 From: Deb Date: Mon, 18 Apr 2022 09:04:49 -0400 Subject: [PATCH 162/290] Updated release page to 2.1.1 Signed-off-by: Deb --- release.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release.rst b/release.rst index 2d1f65d3..8ec14547 100755 --- a/release.rst +++ b/release.rst @@ -26,7 +26,7 @@ kernel, and documentation. Download the source code as a zip or tar.gz file: Source and Binary Releases -------------------------- -The latest SOF release is v2.0 (December 2021). +The latest SOF release is v2.1.1 (April 2022). View new feature information and release downloads for the latest and previous releases on GitHub. Firmware and SDK tool source code and binary From d6ee4f054d43895ec8c929fa6a95c0c1eb352548 Mon Sep 17 00:00:00 2001 From: Marc Herbert Date: Wed, 8 Jun 2022 18:04:55 -0700 Subject: [PATCH 163/290] conf.py: cpp_id_attributes = ["__sparse_cache"] With a recent enough sphinx-build --version, this fixes the gazillion of warnings recently added: ``` /home/runner/work/sof-docs/sof-docs/api/component-api.rst:21: WARNING: Error when parsing function declaration. If the function has no return type: Error in declarator or parameters-and-qualifiers Invalid C++ declaration: Expected identifier in nested name, got keyword: void [error at 18] static inline void comp_underrun (struct comp_dev *dev, struct comp_buffer __sparse_cache *source, uint32_t copy_bytes) ------------------^ If the function has a return type: Error in declarator or parameters-and-qualifiers If pointer to member declarator: Invalid C++ declaration: Expected '::' in pointer to member (function). [error at 33] static inline void comp_underrun (struct comp_dev *dev, struct comp_buffer __sparse_cache *source, uint32_t copy_bytes) ---------------------------------^ If declarator-id: Invalid C++ declaration: Expecting "," or ")" in parameters-and-qualifiers, got "*". [error at 90] static inline void comp_underrun (struct comp_dev *dev, struct comp_buffer __sparse_cache *source, uint32_t copy_bytes) ------------------------------------------------------------------------------------------^ ``` Signed-off-by: Marc Herbert --- conf.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/conf.py b/conf.py index 02794784..e60cb085 100755 --- a/conf.py +++ b/conf.py @@ -52,6 +52,12 @@ # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] +# Fixes "WARNING: Error when parsing function declaration." +c_id_attributes = ["__sparse_cache"] +# Not clear why Sphinx thinks some C files are C++ +cpp_id_attributes = c_id_attributes +# cpp_paren_attributes = ["_ALIAS_OF", "__printf_like"] + # The suffix(es) of source filenames. # You can specify multiple suffix as a list of string: # From 8f4871976fb9528758c5501e39e9ff33e5086bc1 Mon Sep 17 00:00:00 2001 From: Marc Herbert Date: Wed, 8 Jun 2022 18:06:17 -0700 Subject: [PATCH 164/290] conf.py: language = None -> en Fixes Sphinx 5 warning: Running Sphinx v5.0.1 WARNING: Invalid configuration value found: 'language = None'. Update your configuration to a valid langauge code. Falling back to 'en' (English). Signed-off-by: Marc Herbert --- conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf.py b/conf.py index e60cb085..8132100c 100755 --- a/conf.py +++ b/conf.py @@ -89,7 +89,7 @@ # # This is also used if you do content translation via gettext catalogs. # Usually you set "language" from the command line for these cases. -language = None +language = 'en' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. From d334f72a1c699ace7c63971a3499bd6b72f99689 Mon Sep 17 00:00:00 2001 From: Marc Herbert Date: Wed, 8 Jun 2022 18:07:36 -0700 Subject: [PATCH 165/290] conf.py: extlinks: fix captions, from "" to None Fixes Sphinx 5 warning: WARNING: extlinks: Sphinx-6.0 will require a caption string to contain exactly one '%s' and all other '%' need to be escaped as '%%'. Signed-off-by: Marc Herbert --- conf.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/conf.py b/conf.py index 8132100c..0a356391 100755 --- a/conf.py +++ b/conf.py @@ -174,13 +174,13 @@ # as required. extlinks = { 'git-sof-mainline': - (SOF_GIT + '/sof/tree/master/%s', ""), + (SOF_GIT + '/sof/tree/master/%s', None), 'git-sof-docs-mainline': - (SOF_GIT + '/sof-docs/tree/master/%s', ""), + (SOF_GIT + '/sof-docs/tree/master/%s', None), 'git-sof-kconfig': - (SOF_GIT + '/kconfig/tree/master/%s', ""), + (SOF_GIT + '/kconfig/tree/master/%s', None), 'git-alsa': - ('https://git.alsa-project.org/?p=%s.git', ""), + ('https://git.alsa-project.org/?p=%s.git', None), } # Add any paths that contain custom static files (such as style sheets) here, From 99343a2b4105940efe72e5f0e983c2eeb1bde21a Mon Sep 17 00:00:00 2001 From: Marc Herbert Date: Tue, 7 Jun 2022 21:55:25 +0000 Subject: [PATCH 166/290] zephyr: simplify west init command west init knows how to create a directory, no need to ask the user. Signed-off-by: Marc Herbert --- getting_started/build-guide/build-with-zephyr.rst | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/getting_started/build-guide/build-with-zephyr.rst b/getting_started/build-guide/build-with-zephyr.rst index 303282ce..f3bad129 100755 --- a/getting_started/build-guide/build-with-zephyr.rst +++ b/getting_started/build-guide/build-with-zephyr.rst @@ -41,10 +41,9 @@ Check out and build .. code-block:: bash - mkdir $ZEPHYR_WORKSPACE - cd $ZEPHYR_WORKSPACE - west init + west init $ZEPHYR_WORKSPACE # Significantly smaller and faster than a full "west update" + cd $ZEPHYR_WORKSPACE west update hal_xtensa sof #. Build and sign a firmware image: From ab552a3454ed5c1a17cdda9f1e564f336f4bd163 Mon Sep 17 00:00:00 2001 From: Marc Herbert Date: Wed, 8 Jun 2022 23:27:05 +0000 Subject: [PATCH 167/290] build-with-zephyr: fix submodules, get ready for new python script Add missing `git submodule update` as reported by @plbossart (thx!) Also make the documentation ready for `xtensa-build-zephyr.py` which... does not have any hack to automatically download git submodules like the older .sh script has. As a side-effect, this breaks down the process and adds an intermediate `west build` step which removes one layer of indirection in case of some Zephyr environment issue. Cannot fully switch to the Python version yet because of bugs like https://github.com/thesofproject/sof/pull/5906 but do recommend users to start trying it. Signed-off-by: Marc Herbert --- .../build-guide/build-with-zephyr.rst | 45 ++++++++++++++----- 1 file changed, 35 insertions(+), 10 deletions(-) diff --git a/getting_started/build-guide/build-with-zephyr.rst b/getting_started/build-guide/build-with-zephyr.rst index f3bad129..3a54092e 100755 --- a/getting_started/build-guide/build-with-zephyr.rst +++ b/getting_started/build-guide/build-with-zephyr.rst @@ -30,8 +30,8 @@ Check out and build .. note:: If you need a different SOF version than the one that west - automatically checks out, change to ``modules/audio/sof`` and use git - to select your preferred version. You need at least version 1.6 to use + automatically checks out, instructions below show how to change ``modules/audio/sof`` + and select your preferred version. You need at least Zephyr version 1.6 to use it with Zephyr. Make sure you branch or tag your code in git; otherwise, a future ``west update`` may lose it. See the west user guide. @@ -46,15 +46,19 @@ Check out and build cd $ZEPHYR_WORKSPACE west update hal_xtensa sof -#. Build and sign a firmware image: +#. Make sure the appropriate Zephyr SDK or other toolchain of your + choice can be found for your desired ``--board`` and that every + other Zephyr dependency is set up properly: .. code-block:: bash - cd $ZEPHYR_WORKSPACE - ./modules/audio/sof/scripts/xtensa-build-zephyr.sh -h # shows usage - ./modules/audio/sof/scripts/xtensa-build-zephyr.sh $your_platforms - ls build-*/zephyr/zephyr.* - => build-*/zephyr/zephyr.ri ... + ls zephyr/boards/xtensa/ + west build --board intel_adsp_cavs25 ./zephyr/samples/subsys/audio/sof/ + + For now the ``.elf`` file produced by ``west build`` is missing a + manifest and signature. The wrapper script below invokes *both* + ``west build`` and ``west sign`` and produces a complete ``.ri`` + file; you won't need to call ``west build`` again. #. Fetch and switch to the latest SOF code @@ -69,8 +73,29 @@ Check out and build git fetch sof git switch --track sof/main - You can also delete the ``sof`` clone downloaded by ``west`` and - replace it with an older clone; west will automatically adjust. + # If needed, correct submodule URLs in .git/config with latest .gitmodules file. + git submodule sync --recursive + # Download submodules + git submodule update --init --recursive + + Alternatively, feel free to delete the ``sof`` clone downloaded by + ``west`` and replace it with any other ``sof`` clone you already + have; west will automatically adjust. + +#. Build and sign a firmware image: + + .. code-block:: bash + + cd $ZEPHYR_WORKSPACE + ./modules/audio/sof/scripts/xtensa-build-zephyr.sh -h # shows usage + ./modules/audio/sof/scripts/xtensa-build-zephyr.sh $your_platforms + ls build-*/zephyr/zephyr.* + => build-*/zephyr/zephyr.ri ... + + +There is work in progress to substitute ``xtensa-build-zephyr.sh`` with +a Python replacement ``xtensa-build-zephyr.py`` for Windows +compatibility. It can already be used in many cases. Run *** From 5e7a34287206251669ab6a8999bf9bbb14d2aeac Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Thu, 9 Jun 2022 15:45:51 +0300 Subject: [PATCH 168/290] getting_started: setup_linux: intall_locally: Add link to Arch Linux guide Arch users tend to bump into new issues due to the fact that they are using more recent kernels compared to non rolling distro users. Add a link to Arch's manual kernel compilation and installation page as well. Signed-off-by: Peter Ujfalusi --- getting_started/setup_linux/install_locally.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/getting_started/setup_linux/install_locally.rst b/getting_started/setup_linux/install_locally.rst index d4b7f0b6..d70f9774 100644 --- a/getting_started/setup_linux/install_locally.rst +++ b/getting_started/setup_linux/install_locally.rst @@ -10,7 +10,7 @@ Install the Kernel Locally Introduction ************ -Make sure you have `set up your development environment `_ before following these steps. This page will guide you through the process of installing the kernel locally on your machine. It will be installed in addition to your distro's default kernel so that you can always change back to that in case something goes wrong. If you are interested in learning more about this process, there are lots of online guides available, for example `Fedora* Quick Docs `_ or `this wiki page `_. +Make sure you have `set up your development environment `_ before following these steps. This page will guide you through the process of installing the kernel locally on your machine. It will be installed in addition to your distro's default kernel so that you can always change back to that in case something goes wrong. If you are interested in learning more about this process, there are lots of online guides available, for example `Fedora* Quick Docs `_, `Arch Linux documentation `_ or `this wiki page `_. Build and install the kernel From 5f45198666cdfcf05585a94319873fb62c76a535 Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Wed, 15 Jun 2022 14:51:57 +0300 Subject: [PATCH 169/290] developer_guides: debugability: probes: Update for sof client version of probes The probes got converted to sof client mode, update the documentation to be up to date. Signed-off-by: Peter Ujfalusi --- .../debugability/probes/index.rst | 47 ++++++++++++++++--- 1 file changed, 41 insertions(+), 6 deletions(-) diff --git a/developer_guides/debugability/probes/index.rst b/developer_guides/debugability/probes/index.rst index c05bd91a..dc019629 100644 --- a/developer_guides/debugability/probes/index.rst +++ b/developer_guides/debugability/probes/index.rst @@ -17,15 +17,49 @@ Requirements Enabling Probes *************** -- Enable the following Linux kernel configuration options: +Kernel side +=========== + +- The probes support is enabled by Kconfig on supported platforms as a SOF client + driver, check the kernel config for ``SND_SOC_SOF_DEBUG_PROBES``. + The debugfs also needs to be enabled for the probes to be usable. .. code-block:: bash CONFIG_DEBUG_FS=y - CONFIG_SND_SOC_SOF_DEBUG_PROBES=y - CONFIG_SND_SOC_SOF_HDA_PROBES=y -- Enable the Probe module in the SOF firmware ``kconfig`` using this command: +- The probes client needs to be enabled via the 'enable' module parameter (e.g. ``/etc/modprobe.d/sof.conf``): + + .. code-block:: bash + + options snd_sof_probes enable=1 + + To make sure that the sound card for the probes is consistent between boots, a + card slot can be forced for the module. + For example to use card3, this can be added to the sof.conf file: + + .. code-block:: bash + + options snd slots=,,,snd_sof_probes + + Remove and re-load the driver: + + .. code-block:: bash + + rmmod snd_sof_probes + modprobe snd_sof_probes + + Verify that the card is available (if not, try to reboot): + + .. code-block:: bash + + cat /proc/asound/cards | grep sofprobes + +Firmware side +============= + +- The Probe module can be enabled under the 'Probe' menu's 'Probes enabled' prompt (``PROBES``) + To edit the ``kconfig`` use this command: .. code-block:: bash @@ -49,13 +83,14 @@ the last stage of extraction. .. code-block:: bash - crecord -c0 -d23 -b8192 -f4 -FS32_LE -R48000 -C4 /tmp/extract.dat + crecord -c3 -d0 -b8192 -f4 -FS32_LE -R48000 -C4 /tmp/extract.dat Usage: .. code-block:: none - -d : device ID; equals 23 in the above example. + -c : card number; 3 in the above example if a slot is forced + -d : device ID; equals 0 in the above example (probes card only have 1 compressed capture stream). -b : buffer size. For probes, this is part of the probe initialization IPC and denotes the extraction stream buffer size on the host side. -f : fragments is basically number of periods for compress stream. From 1b019895ac40bd77f769caaadeaabd387333a8b7 Mon Sep 17 00:00:00 2001 From: Deb Date: Fri, 1 Jul 2022 09:12:01 -0400 Subject: [PATCH 170/290] Update page to signify 2.2 release --- release.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release.rst b/release.rst index 8ec14547..93fb89d8 100755 --- a/release.rst +++ b/release.rst @@ -26,7 +26,7 @@ kernel, and documentation. Download the source code as a zip or tar.gz file: Source and Binary Releases -------------------------- -The latest SOF release is v2.1.1 (April 2022). +The latest SOF release is v2.2 (July 2022). View new feature information and release downloads for the latest and previous releases on GitHub. Firmware and SDK tool source code and binary From 211a7e0cad9330f562f72fdfd0501e85f1792829 Mon Sep 17 00:00:00 2001 From: Deb Date: Thu, 7 Jul 2022 08:10:22 -0500 Subject: [PATCH 171/290] Update conf.py to reflect 2.2 release Signed-off-by: Deb --- conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf.py b/conf.py index 0a356391..fa9c4429 100755 --- a/conf.py +++ b/conf.py @@ -76,7 +76,7 @@ # |version| and |release|, also used in various other places throughout the # built documents. -version = release = "2.0" +version = release = "2.2" # # The short X.Y version. From 9788c4be32cfbfb7538806ab9a568c23447b365e Mon Sep 17 00:00:00 2001 From: Marc Herbert Date: Thu, 7 Jul 2022 19:19:57 -0700 Subject: [PATCH 172/290] Makefile: stop recommending users to build doxygen in SOF source dir CMake is all about "out of source" build directories which among others make it super easy to clean: just delete the build directory, done. So stop recommending users to build doxygen inside their SOF source tree which pollutes it with many files they have to delete one by one. Before this commit: git -C ../sof/ status --ignored Untracked/Ignored files: (use "git add ..." to include in what will be committed) doc/.ninja_log doc/CMakeCache.txt doc/CMakeFiles/ doc/build.ninja doc/cmake_install.cmake doc/doxygen/ doc/sof.doxygen After this commit: git -C ../sof/ status --ignored Ignored files: (use "git add -f ..." to include in what will be committed) build_doxygen/ Signed-off-by: Marc Herbert --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index f2b63f5a..52fed184 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,7 @@ else Q = @ endif -SOF_DOC_BUILD = ../sof/doc +SOF_DOC_BUILD = ../sof/build_doxygen/ SPHINXBUILD = sphinx-build SPHINXPROJ = "SOF Project" SOURCEDIR = . From 99db6790351116ebe46cb6707d4ce9f6fa6663de Mon Sep 17 00:00:00 2001 From: Pierre-Louis Bossart Date: Wed, 6 Jul 2022 15:40:19 -0500 Subject: [PATCH 173/290] intel_debug: add suggestions for DMIC and ES8336 platforms Instead of repeating the same things on GitHub issues, maybe this documentation will help. Signed-off-by: Pierre-Louis Bossart --- getting_started/intel_debug/suggestions.rst | 136 ++++++++++++++++++++ 1 file changed, 136 insertions(+) diff --git a/getting_started/intel_debug/suggestions.rst b/getting_started/intel_debug/suggestions.rst index 9b9c9b3c..4a24c855 100644 --- a/getting_started/intel_debug/suggestions.rst +++ b/getting_started/intel_debug/suggestions.rst @@ -140,3 +140,139 @@ to snd_sof module: .. code-block:: options snd_sof sof_debug=1 + + +Digital mic issues +****************** + +The SOF driver and firmware have limited information related to the +number of digital microphones and their physical location. + +On devices designed for Windows, the presence of the microphone is +reported as an NHLT endpoint (ACPI table in the BIOS). The SOF Linux +driver will report this information with a 'dmesg' log such as + +.. code-block:: + + [ 4.301490] sof-audio-pci-intel-tgl 0000:00:1f.3: DMICs detected in NHLT tables: 2 + +Recent versions of the ACPICA tools (acpica-tools package) can also be +used to visualize the ACPI tables. + +In some instances the number of DMICs reported by the NHLT does not +match the hardware layout. The SOF driver provides a means to alter +the value with a kernel parameter which can be added in +/etc/modprobe.d/alsa-base.conf (or any other configuration file with +this .conf extension). A reboot is necessary after changing the value + +.. code-block:: + + options snd_sof_intel_hda_common dmic_num=4 + +The following command can then be used to check if the microphones are active at the lowest level + +.. code-block:: bash + + arecord -Dhw:0,6 -c4 -r48000 -sS32_LE -d 10 test.wav + +In 99% of the cases, hardware designers connect the two microphones on +the PDM0 controller. Some platforms use PDM1, which cannot really be +detected by the OS. By capturing in 4ch mode, it's possible that +channel3 and 4 capture data while channel0 and channel1 only show +signs of transitions and DC-removal. Simply talking or recording music +in this 10s test, then visualizing the recorded file with Audacity is +often enough to diagnose the presence of 2 microphones on the 'wrong' +PDM controller. + +In that case, a different topology file needs to be used, typically +sof-hda-generic-2ch-pdm1.tplg. On older distributions, it will be +necessary to override the file installed in +/lib/firmware/intel/sof-tplg/sof-hda-generic-2ch.tplg. On kernels +5.20+ a kernel parameter will be enough with no need to change and +override installed topology files, e.g. + +.. code-block:: + + options snd-sof-pci tplg_filename=sof-hda-generic-2ch-pdm1.tplg + +These PDM1 issues are tracked in GitHub with the label 'DMIC-PDM1' in the +`firmware issues `_ +and in the `Linux issues `_. + +Users running Linux distributions on Chromebooks routinely experience +issues with digital microphones. In the Chrome environment, the +topology always exposes 4 channels, and UCM files for specific +platforms specify which of the 4 channels are valid. A plugin will +then drop the useless/non-populated channels. This capability does not +exist yet in upstream UCM/Linux. Capturing with the 'arecord; command +above will help understand which channels are valid and configure UCM +files. + +ES8336 support +************** + +Since 2021, a number of OEMs relied on the ES8336 codec from Everest +Audio on platforms as varied as AppoloLake, GeminiLake, JasperLake, +CometLake, AlderLake. + +End-users can verify if the hardware uses this configuration by +running the 'alsa-info' command and checking for the presence an ACPI +_HID, e.g. + +.. code-block:: + + /sys/bus/acpi/devices/ESSX8336:00/status 15 + +.. code-block:: + + /sys/bus/acpi/devices/ESSX8326:00/status 15 + +Support for this platform only stated upstream with the kernel +5.19-rc1. Any attempts with earlier kernels will require backports and +experimental patches to be added. In the case of the 8326, the codec +vendor submitted a driver to the ALSA/ASoC maintainers, which was not +merged as of July 2022. In this specific case end-users will be forced +to compile their own kernel. + +The SOF driver implemented an automatic detection of the SSP/I2S port +used by hardware and the presence of digital microphones based on +platform firmware/NHLT. + +There are however a number of hardware configurations that cannot be +detected from platform firmware. To work-around this limitation, the +'sof-es8336' machine driver exposes a 'quirk' kernel parameter which +can be used for modify GPIO and jack detection settings. Existing +quirks are listed in the sound/soc/intel/boards/sof_es8336.c machine +driver: + +.. code-block:: c + + #define SOF_ES8336_SPEAKERS_EN_GPIO1_QUIRK BIT(4) + #define SOF_ES8336_JD_INVERTED BIT(6) + #define SOF_ES8336_HEADPHONE_GPIO BIT(7) + #define SOC_ES8336_HEADSET_MIC1 BIT(8) + + +The default quirk value for the platform can be read from +/sys/module/snd_soc_sof_es8336/parameters/quirk (the value is reported +as plain integer, not hexadecimal). Changes to the default can be +added with the following option in +e.g. /etc/modprobe.d/alsa-base.conf. Only the bits listed above can be +modified, others need to be kept as is. + +.. code-block:: + + options snd_soc_sof_es8336 quirk= + +Changing quirk values is an extremely experimental endeavor that +should only attempted by users with working knowledge of the Linux +audio subsystem and an understanding that playing with hardware +settings MAY DAMAGE HARDWARE or generate extremely loud sounds that +MAY DAMAGE YOUR HEARING. + +In rare cases, some platforms use the MCLK1 signal instead of +MCLK0. As of July 2022, there is no turn-key solution for those +platforms. + +These ES8336 issues are tracked in GitHub with the label 'codec +ES8336' in the `Linux ES8336 issues `_. From d56a799ebe23a3f2ba4ab3bc8eabfbe9700a4bab Mon Sep 17 00:00:00 2001 From: Noah Klayman Date: Fri, 15 Jul 2022 23:23:30 +0000 Subject: [PATCH 174/290] testbench: add note to install runtime deps I've found Valgrind and bc are necessary to run the testbench. Neither are listed in the general dependency list for Ubuntu 20.04 and only Valgrind is listed for other versions. Signed-off-by: Noah Klayman --- developer_guides/testbench/build_testbench.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/developer_guides/testbench/build_testbench.rst b/developer_guides/testbench/build_testbench.rst index b371757d..3f707b10 100644 --- a/developer_guides/testbench/build_testbench.rst +++ b/developer_guides/testbench/build_testbench.rst @@ -3,6 +3,13 @@ Build and Run Testbench ####################### +First, you'll need to install some dependencies to run the testbench: + +.. code-block:: bash + + sudo apt install valgrind bc # For Ubuntu/Debian + sudo dnf install valgrind bc # For Fedora + Retrieve the required firmware from the ``thesofproject`` repository in Github as described in :ref:`build-from-scratch`. Start a shell at the firmware repository top level in the ``$SOF_WORKSPACE/sof`` directory as also described. From d5afee8984daea970c366cfc812001020fa365fc Mon Sep 17 00:00:00 2001 From: Noah Klayman Date: Sat, 16 Jul 2022 22:26:43 +0000 Subject: [PATCH 175/290] getting_started/build-guide: add dep list for Fedora Signed-off-by: Noah Klayman --- .../build-guide/build-from-scratch.rst | 54 ++++++++++--------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/getting_started/build-guide/build-from-scratch.rst b/getting_started/build-guide/build-from-scratch.rst index 1ac50ffc..2cc602e2 100755 --- a/getting_started/build-guide/build-from-scratch.rst +++ b/getting_started/build-guide/build-from-scratch.rst @@ -12,10 +12,9 @@ Intel platforms include: |BYT|, |CHT|, |HSW|, |BDW|, |APL|, |CNL|, |ICL|, |JSL|, Support also exists for NXP i.MX8/i.MX8X/i.MX8M platforms. -The following steps describe how to install the SOF development -environment on Ubuntu 16.04, 18.04, 18.10, and 20.04. They should work on -19.04, 19.10 and other Linux distributions with minor or no -modifications. +The following steps describe how to install the SOF development environment on +Ubuntu 16.04, 18.04, 18.10, and 20.04, and Fedora 36. They should work on Ubuntu +19.04, 19.10 and other Linux distributions with minor or no modifications. .. note:: @@ -50,7 +49,7 @@ Install package dependencies ============================ .. note:: - This guide uses Ubuntu as an example but any modern distribution can be + This guide uses Ubuntu/Fedora as an example but any modern distribution can be used for SOF development. Due to continuous default package updates in distributions, SOF @@ -58,39 +57,42 @@ documentation may not include explicit instructions for possible missing tools and packages. When you encounter missing dependencies, refer to your distribution's documentation on how to install them. -Make sure that ``build-essential`` and ``git`` are installed: +* For Fedora (tested with v36, other recent versions should work fine): -.. code-block:: bash + .. code-block:: bash - sudo apt-get install build-essential git + sudo dnf group install "Development Tools" "C Development Tools and Libraries" + sudo dnf install ncurses-devel gtk3-devel gettext-devel texinfo help2man \ + glibc-static libstdc++-static openssl-devel tree * For Ubuntu 20.04: .. code-block:: bash - sudo apt install autoconf flex bison texinfo help2man gawk libtool-bin \ - libncurses5 libncurses5-dev libssl-dev libgtk-3-dev tree \ - ninja-build gettext libasound2-dev + sudo apt install build-essential git autoconf flex bison texinfo help2man \ + gawk libtool-bin libncurses5 libncurses5-dev libssl-dev libgtk-3-dev \ + tree ninja-build gettext libasound2-dev * For Ubuntu 18.10: .. code-block:: bash - sudo apt-get install libgtk-3-dev libsdl1.2-dev libspice-protocol-dev \ - libspice-server-dev libusb-1.0-0-dev libusbredirhost-dev libtool-bin \ - acpica-tools valgrind texinfo virt-manager qemu-kvm \ - libvirt-daemon-system libvirt-clients virtinst libfdt-dev libssl-dev \ - pkg-config help2man gawk libncurses5 libncurses5-dev + sudo apt-get install build-essential git libgtk-3-dev libsdl1.2-dev \ + libspice-protocol-dev libspice-server-dev libusb-1.0-0-dev \ + libusbredirhost-dev libtool-bin acpica-tools valgrind texinfo \ + virt-manager qemu-kvm libvirt-daemon-system libvirt-clients virtinst \ + libfdt-dev libssl-dev pkg-config help2man gawk libncurses5 \ + libncurses5-dev * For Ubuntu 16.04 and 18.04: .. code-block:: bash - sudo apt-get install libgtk-3-dev libsdl1.2-dev libspice-protocol-dev \ - libspice-server-dev libusb-1.0-0-dev libusbredirhost-dev libtool-bin \ - iasl valgrind texinfo virt-manager qemu-kvm libvirt-bin virtinst \ - libfdt-dev libssl-dev pkg-config help2man gawk libncurses5 \ - libncurses5-dev + sudo apt-get install build-essential git libgtk-3-dev libsdl1.2-dev \ + libspice-protocol-dev libspice-server-dev libusb-1.0-0-dev \ + libusbredirhost-dev libtool-bin iasl valgrind texinfo virt-manager \ + qemu-kvm libvirt-bin virtinst libfdt-dev libssl-dev pkg-config help2man \ + gawk libncurses5 libncurses5-dev If you are using Ubuntu 16.04, the gcc version must be updated to gcc 7.3+ in order for the Advanced Linux Sound Architecture (ALSA) to build. @@ -105,11 +107,12 @@ in order for the Advanced Linux Sound Architecture (ALSA) to build. Install CMake ============= -If you use Ubuntu 18.04+ you can install CMake with apt: +If you use Ubuntu 18.04+ or Fedora you can install CMake with apt/dnf: .. code-block:: bash - sudo apt-get install cmake + sudo apt-get install cmake # Ubuntu + sudo dnf install cmake # Fedora For Ubuntu 16.04, CMake from apt is outdated and you must install CMake from sources. Refer to this short guide: https://cmake.org/install/. @@ -143,7 +146,8 @@ before you configure alsa-utils. .. code-block:: bash - sudo apt-get install libfftw3-dev libfftw3-doc + sudo apt-get install libfftw3-dev libfftw3-doc # Ubuntu + sudo dnf install fftw3-devel # Fedora Clone, build, and install alsa-utils. @@ -234,7 +238,7 @@ download gcc components. .. code-block:: bash unset LD_LIBRARY_PATH - + # Bay Trail / Cherry Trail cp config-byt-gcc10.2-gdb9 .config ./ct-ng build From 81345c613827d1b56c6e24fdd8b86f2931c46b05 Mon Sep 17 00:00:00 2001 From: Andrey Borisovich Date: Tue, 9 Aug 2022 18:44:49 +0200 Subject: [PATCH 176/290] getting_started/build-guide: update Build SOF with zephyr Introduction of west tool to SOF project required to update build guide on how to use python convenience script and west tool. Signed-off-by: Andrey Borisovich --- .../build-guide/build-with-zephyr.rst | 258 +++++++++++++----- 1 file changed, 193 insertions(+), 65 deletions(-) diff --git a/getting_started/build-guide/build-with-zephyr.rst b/getting_started/build-guide/build-with-zephyr.rst index 3a54092e..998b3924 100755 --- a/getting_started/build-guide/build-with-zephyr.rst +++ b/getting_started/build-guide/build-with-zephyr.rst @@ -12,108 +12,217 @@ This guide describes how to build and run |SOF| as a Zephyr application. .. note:: The following example uses ``$ZEPHYR_WORKSPACE`` as the working - directory. + directory for both SOF and Zephyr projects. Prepare ******* -The easiest way to build Zephyr is to use its recommended toolchain. Follow -instructions in `Install a Toolchain `_ for details. +- The easiest way to build Zephyr is to use its recommended toolchain. Follow + instructions in `Install a Toolchain `_ for details. -Check out and build -******************* +- Install **west** - Zephyr uses west as a source management and building system. Follow + the Zephyr `Getting Started `_ guide for dependencies and for the west installation. -#. Install **west**. - Zephyr uses west as a source management and building system. Follow - the Zephyr `Getting Started `_ guide for dependencies and for the west installation. +Clone and initialize SOF project +******************************** - .. note:: +Initialize west manifest ``$ZEPHYR_WORKSPACE/sof/west.yml`` using ``west tool``: - If you need a different SOF version than the one that west - automatically checks out, instructions below show how to change ``modules/audio/sof`` - and select your preferred version. You need at least Zephyr version 1.6 to use - it with Zephyr. Make sure you branch or tag your code in git; - otherwise, a future ``west update`` may lose it. See the west user - guide. + - Clone SOF repository -#. Initialize a new ``west`` repository. This checks out all Zephyr sources, - including SOF: + .. code-block:: bash + + mkdir $ZEPHYR_WORKSPACE && cd $ZEPHYR_WORKSPACE + west init -m https://github.com/thesofproject/sof + + - Or initialize west manifest from existing SOF clone (when using python convenience script this is not mandatory - see below) + + .. code-block:: bash + + cd $ZEPHYR_WORKSPACE + west init -l ./sof + + + .. tip:: + | Zephyr project also uses west manifest. It may happen that your west tool is already initialized to manifest of zephyr. + | During initialization west will issue following error: + | *"FATAL ERROR: already initialized in $ZEPHYR_WORKSPACE, aborting."* + | + | To verify manifest currently used by west tool, in ``$ZEPHYR_WORKSPACE`` directory execute command: + | ``west config -l``. + | + | If command output shows: + | *manifest.path=zephyr* + | *manifest.file=west.yml* + | You need to remove ``$ZEPHYR_WORKSPACE/.west`` directory and reinitialize west in on of two methods described above. + + .. danger:: + | SOF project **must** be cloned to "sof" directory - this name is hardcoded in west manifest file! + | Failure to do so may result in SOF dependencies being cloned to newly created ``$ZEPHYR_WORKSPACE/sof/rimage`` directory + | along with other not desired consequences. + + **All commands described in the guide from this point should be executed in ``$ZEPHYR_WORKSPACE`` directory.** + + +Check out and build using python convenience script +*************************************************** + +| SOF project offers python convenience script: ``./sof/scripts/xtensa-build-zephyr.py`` +| used to provide more friendly build process for end-user. +| It is a wrapper for a **west tool** that performs steps described in `Check out and build using West Tool directly `_ section. +| Script may be used on both Windows and Linux operating systems. +| It will be removed in future as soon as SOF project will have better integration with **west tool** commands. + +Script automates following steps that are required to build a firmware for SOF platform: + - Initializes your west tool to SOFs west manifest + - Clones and checks out SOF and Zephyr dependencies + - Builds a firmware ``.elf`` file for requested platform + - Builds a **rimage tool** + - Uses **rimage tool** and a **private key** to sign the ``.elf`` file producing final firmware image file with ``.ri`` extension. + - Uses **smex tool** to generate a debugging symbols file with ``.ldc`` extension. + +| List of platforms that may be built with the script is shown in the help message: +| ``./sof/scripts/xtensa-build-zephyr.py --help`` + +Usage example 1: + You cloned SOF project and would like to build a firmware for *Tigerlake* platform. .. code-block:: bash - west init $ZEPHYR_WORKSPACE - # Significantly smaller and faster than a full "west update" - cd $ZEPHYR_WORKSPACE - west update hal_xtensa sof + ./sof/scripts/xtensa-build-zephyr.py -u tgl -#. Make sure the appropriate Zephyr SDK or other toolchain of your - choice can be found for your desired ``--board`` and that every - other Zephyr dependency is set up properly: + Running this command will: + + - Initialize west to ``./sof/west.yml`` manifest is not already initialized. + - Clone and checkout projects to revision defined in ``./sof/west.yml`` file: + + - SOFs submodules (Rimage and Tomlc99) + - Zephyr project + - Zephyr project dependencies needed by SOF in ``$ZEPHYR_WORKSPACE/modules`` directory + + - Build a signed firmware image ``./build-tgl/zephyr/zephyr.ri`` and debug symbols file ``./build-sof-staging/sof/sof-tgl.ldc``. + + .. tip:: + You may wish to rebuild all files from scratch. + To do this, add ``-p`` flag to script invocation. + To provide better build verbosity, use ``-v`` flag. + Make sure to check script ``--help`` to see all build options. + +Usage example 2: + You have your environment set up - cloned SOF project and working on your fork/branch of Zephyr and Rimage submodule. + You wish to build *Tigerlake* platform with your changes. .. code-block:: bash - ls zephyr/boards/xtensa/ - west build --board intel_adsp_cavs25 ./zephyr/samples/subsys/audio/sof/ + ./sof/scripts/xtensa-build-zephyr.py tgl + + Running this command will: + - Initialize west to ``./sof/west.yml`` manifest is not already initialized. + - Build a signed firmware image ``./build-tgl/zephyr/zephyr.ri`` and debug symbols file ``./build-sof-staging/sof/sof-tgl.ldc``. + - Skip cloning dependencies and checking them out to revision from ``./sof/west.yml`` manifest. + +Usage example 3: + You have your environment set up - cloned SOF project and working on your fork/branch of Zephyr and Rimage submodule. + You wish to restore default revisions for SOF dependencies from ``./sof/west.yml`` manifest. + + .. code-block:: bash + + ./sof/scripts/xtensa-build-zephyr.py -u + + - Initialize west to ``./sof/west.yml`` manifest is not already initialized. + - Clone and checkout projects to revisions defined in ``./sof/west.yml`` file. + - Skip building firmware image. + +Output directory + For convenience, the ``xtensa-build-zephyr.py`` script copies all + firmware files into a single, "staging" directory: + + .. code-block:: bash - For now the ``.elf`` file produced by ``west build`` is missing a - manifest and signature. The wrapper script below invokes *both* - ``west build`` and ``west sign`` and produces a complete ``.ri`` - file; you won't need to call ``west build`` again. + $ tree build-sof-staging/ -#. Fetch and switch to the latest SOF code + build-sof-staging/ + ├── sof + │   ├── community + │   │   ├── sof-apl.ri + │   │   ├── sof-imx8.ri + │   │   └── sof-tgl-h.ri - By policy, zephyr modules are carefully versioned with west and not - automatically synchronized with the latest code. To switch to the - latest: + +Check out and build using West Tool directly +******************************************** + +#. Clone and check out SOF dependencies - submodules, Zephyr project and some of its modules needed by SOF: .. code-block:: bash - cd modules/audio/sof/ - git remote add sof https://github.com/thesofproject/sof - git fetch sof - git switch --track sof/main + west update - # If needed, correct submodule URLs in .git/config with latest .gitmodules file. - git submodule sync --recursive - # Download submodules - git submodule update --init --recursive + .. warning:: + This command will check out revisions specified in ``$ZEPHYR_WORKSPACE/sof/west.yml`` file for projects: + - Rimage (SOF submodule) + - Tomlc99 (Rimage submodule) + - Zephyr + - projects in ``$ZEPHYR_WORKSPACE/modules`` directory. - Alternatively, feel free to delete the ``sof`` clone downloaded by - ``west`` and replace it with any other ``sof`` clone you already - have; west will automatically adjust. + Make sure to backup your work before changing revisions! + It will not affect your SOF project revision. -#. Build and sign a firmware image: +#. Build a board - make sure the appropriate Zephyr SDK or other toolchain of your + choice. Boards to build are listed in ``$ZEPHYR_WORKSPACE/sof/app/boards`` directory. .. code-block:: bash - cd $ZEPHYR_WORKSPACE - ./modules/audio/sof/scripts/xtensa-build-zephyr.sh -h # shows usage - ./modules/audio/sof/scripts/xtensa-build-zephyr.sh $your_platforms - ls build-*/zephyr/zephyr.* - => build-*/zephyr/zephyr.ri ... + west build --build-dir build-tgl --board intel_adsp_cavs25 ./sof/app + .. hint:: + SOF project defines platform names that have Zephyr board counterpart. + In this example platform *Tigerlake* matches Zephyr board *inteL_adsp_cavs25* + (this is why output directory is named *build-tgl* however you may use any name you wish). -There is work in progress to substitute ``xtensa-build-zephyr.sh`` with -a Python replacement ``xtensa-build-zephyr.py`` for Windows -compatibility. It can already be used in many cases. + .. tip:: + - To add verbosity to the build output use -v -v flags. Example: + ``west -v -v build --build-dir build-tgl --board intel_adsp_cavs25 ./sof/app`` -Run -*** + - To perform complete clean rebuild use --pristine flag. Example: + ``west -v -v build --build-dir build-tgl --pristine always --board intel_adsp_cavs25 ./sof/app`` -For convenience, the ``xtensa-build-zephyr.sh`` script copies all -firmware files into a single, "staging" directory: + ``.elf`` file produced by ``west build`` is missing a + manifest and signature. You need to sign the file using **rimage tool** + and a **private key** to generate final firmware image (``.ri`` file). + +#. Build rimage tool .. code-block:: bash - $ tree build-sof-staging/ + cmake -B ./build-rimage -S ./sof/rimage + cmake --build ./build-rimage + +#. Sign firmware using rimage tool and a private key + + .. code-block:: bash + + west sign --build-dir ./build-tgl -t rimage --tool-path ./build-rimage/rimage --tool-data ./sof/rimage/config -- -k ./sof/keys/otc_private_key_3k.pem + + **Signed output firmware image file is** ``./build-tgl/zephyr/zephyr.ri`` **.** + + .. hint:: + SOF project provides some pre-generated key pairs of different lengths: + - ``./sof/keys/otc_private_key_3k.pem`` + ``./sof/keys/otc_public_key_3k.pem`` + - ``./sof/keys/otc_private_key.pem`` + ``./sof/keys/otc_public_key.pem`` + + You may wish to generate your own set of keys for firmware signing. + +#. (Optional) Generate debug symbols - build-sof-staging/ - ├── sof - │   ├── community - │   │   ├── sof-apl.ri - │   │   ├── sof-imx8.ri - │   │   └── sof-tgl-h.ri + .. code-block::bash + ./build-tgl/zephyr/smex_ep/build/smex -l ./build-tgl/zephyr/zephyr.ldc ./build-tgl/zephyr/zephyr.elf + + Output file ``./build-tgl/zephyr/zephyr.ldc`` may be used for reading firmware logs. + +Run +*** #. Copy the firmware image(s) to the usual location on all your target systems. Example: @@ -155,3 +264,22 @@ For firmware log extraction, use You might also need to build and update your system audio topology file. For details see :ref:`build-from-scratch`. + + +Troubleshooting +*************** + +#. West tool version is older than minimal version requirement defined in ``./sof/west.yml`` manifest. + + | Manifest file defines minimal yaml schema version that sets compatibility with west tool + | according to https://docs.zephyrproject.org/latest/develop/west/manifest.html#version . + | If west tools version is not sufficient to process manifest file, west raises not very user-friendly + | exception (reference to west 0.12.0 for Windows): + + .. code-block:: bash + + west.manifest.ManifestVersionError: ('0.13', WindowsPath('$ZEPHYR_WORKSPACE/.west/manifest-tmp/west.yml')) + + | In this example ``./sof/west.yml`` defines minimal version as ``0.13`` while west tool used has version ``0.12.0``. + | Update your west tool to newer version to proceed. + From 1a699cf0b5e96c85b2d360156b274f21abd00fb8 Mon Sep 17 00:00:00 2001 From: Marc Herbert Date: Tue, 16 Aug 2022 10:46:15 +0000 Subject: [PATCH 177/290] Add missing code-block:: types Fixes many warnings found by sphinx 1.8.5 and likely other versions. Don't forget to "make clean" so see all warnings. Signed-off-by: Marc Herbert --- contribute/doc_guidelines.rst | 2 +- developer_guides/topology/topology.rst | 6 +++--- getting_started/intel_debug/introduction.rst | 4 ++-- getting_started/intel_debug/suggestions.rst | 18 +++++++++--------- .../setup_linux/setup_ktest_environment.rst | 2 +- 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/contribute/doc_guidelines.rst b/contribute/doc_guidelines.rst index f2aa0d96..caee341b 100644 --- a/contribute/doc_guidelines.rst +++ b/contribute/doc_guidelines.rst @@ -386,7 +386,7 @@ the first non-white space in the preceding line. For example: 1. And for numbered list items, the continuation line should align with the text of the line above. - .. code-block:: + .. code-block:: none The text within a directive block should align with the first character of the directive name. diff --git a/developer_guides/topology/topology.rst b/developer_guides/topology/topology.rst index 0f9b04a3..3e2a23af 100644 --- a/developer_guides/topology/topology.rst +++ b/developer_guides/topology/topology.rst @@ -303,7 +303,7 @@ be scheduled. To specify the DSP core for a pipeline, use the SOF_TKN_SCHED_CORE token located in tools/topology/m4/pipeline.m4: -.. code-block:: +.. code-block:: none W_PIPELINE(stream, period, priority, core, initiator, platform) ... @@ -313,14 +313,14 @@ located in tools/topology/m4/pipeline.m4: Then specify this 'core' in your pipeline definition, such as in tools/topology/sof/pipe-dai-playback.m4: -.. code-block:: +.. code-block:: none W_PIPELINE(N_DAI_OUT, SCHEDULE_PERIOD, SCHEDULE_PRIORITY, SCHEDULE_CORE, SCHEDULE_TIME_DOMAIN, pipe_dai_schedule_plat) To specify the DSP core for a component/widget, use the SOF_TKN_COMP_CORE_ID token located in tools/topology/m4/pga.m4: -.. code-block:: +.. code-block:: none dnl W_PGA(name, format, periods_sink, periods_source, core, kcontrol0. kcontrol1...etc) ... diff --git a/getting_started/intel_debug/introduction.rst b/getting_started/intel_debug/introduction.rst index f07807bc..9842ca1c 100644 --- a/getting_started/intel_debug/introduction.rst +++ b/getting_started/intel_debug/introduction.rst @@ -71,7 +71,7 @@ The ``snd-intel-dspcfg`` module introduced in early 2020 exposes an API used by all drivers, and the user can now override default choices by setting the ``dsp_driver`` parameter. For example, setting -.. code-block:: +.. code-block:: cfg options snd-intel-dspcfg dsp_driver=1 @@ -83,7 +83,7 @@ Conversely, when a platform does not require a DSP-based platform, but the DSP is still enabled by the OEM, the user or integration can force the SOF Linux driver to be used. -.. code-block:: +.. code-block:: cfg options snd-intel-dspcfg dsp_driver=3 diff --git a/getting_started/intel_debug/suggestions.rst b/getting_started/intel_debug/suggestions.rst index 4a24c855..68541bc7 100644 --- a/getting_started/intel_debug/suggestions.rst +++ b/getting_started/intel_debug/suggestions.rst @@ -58,7 +58,7 @@ issues are possible. Use the following commands to check if the SOF driver is functional at the hardware device level: -.. code-block:: +.. code-block:: console speaker-test -Dhw:0,0 -c2 -r48000 -f S16_LE arecord -Dhw:0,0 -c2 -r48000 -f S16_LE -d 10 test.wav @@ -95,7 +95,7 @@ may not be enough to debug a specific issue, and the recommendation is to add the following options to the ``/etc/modprobe.d/sof-dyndbg.conf`` file: -.. code-block:: +.. code-block:: cfg options snd_sof_intel_byt dyndbg=+p options snd_sof_intel_bdw dyndbg=+p @@ -137,7 +137,7 @@ Trace support might need to be enabled on distribution kernels in case the ``/sys/kernel/debug/sof/trace`` file is not present by adding sof_debug=1 option to snd_sof module: -.. code-block:: +.. code-block:: cfg options snd_sof sof_debug=1 @@ -152,7 +152,7 @@ On devices designed for Windows, the presence of the microphone is reported as an NHLT endpoint (ACPI table in the BIOS). The SOF Linux driver will report this information with a 'dmesg' log such as -.. code-block:: +.. code-block:: none [ 4.301490] sof-audio-pci-intel-tgl 0000:00:1f.3: DMICs detected in NHLT tables: 2 @@ -165,7 +165,7 @@ the value with a kernel parameter which can be added in /etc/modprobe.d/alsa-base.conf (or any other configuration file with this .conf extension). A reboot is necessary after changing the value -.. code-block:: +.. code-block:: cfg options snd_sof_intel_hda_common dmic_num=4 @@ -191,7 +191,7 @@ necessary to override the file installed in 5.20+ a kernel parameter will be enough with no need to change and override installed topology files, e.g. -.. code-block:: +.. code-block:: cfg options snd-sof-pci tplg_filename=sof-hda-generic-2ch-pdm1.tplg @@ -219,11 +219,11 @@ End-users can verify if the hardware uses this configuration by running the 'alsa-info' command and checking for the presence an ACPI _HID, e.g. -.. code-block:: +.. code-block:: none /sys/bus/acpi/devices/ESSX8336:00/status 15 -.. code-block:: +.. code-block:: none /sys/bus/acpi/devices/ESSX8326:00/status 15 @@ -260,7 +260,7 @@ added with the following option in e.g. /etc/modprobe.d/alsa-base.conf. Only the bits listed above can be modified, others need to be kept as is. -.. code-block:: +.. code-block:: cfg options snd_soc_sof_es8336 quirk= diff --git a/getting_started/setup_linux/setup_ktest_environment.rst b/getting_started/setup_linux/setup_ktest_environment.rst index 37dddda3..4ab236b5 100644 --- a/getting_started/setup_linux/setup_ktest_environment.rst +++ b/getting_started/setup_linux/setup_ktest_environment.rst @@ -65,7 +65,7 @@ Set up a target d) Update the grub configuration. - .. code-block:: + .. code-block:: console sudo update-grub From 285d2d9e42597642ec5b1919333eba9d6f71e7e6 Mon Sep 17 00:00:00 2001 From: Marc Herbert Date: Tue, 16 Aug 2022 10:43:38 +0000 Subject: [PATCH 178/290] Finally document how to achieve instant builds Without instant builds there is no drive-by contributor submitting quick fixes. Also update requirements-lax.txt to request sphinxcontrib.plantuml>=0.11,<0.25 - Version 0.11 is the first version that supports plantuml_output_format=none which makes the build at least 15 times faster. https://pypi.org/project/sphinxcontrib-plantuml/0.11/ - 0.24 is the last version successfully tested with PIP_IGNORE_INSTALLED=0 and Ubuntu 20.04 (see .github/worflows/) Signed-off-by: Marc Herbert --- Makefile | 5 ++++- conf.py | 9 +++++++-- scripts/requirements-lax.txt | 16 +++++++++++++++- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 52fed184..64785f0d 100644 --- a/Makefile +++ b/Makefile @@ -44,8 +44,11 @@ apidocs: ifeq (${APIS_CMAKE},$(wildcard ${APIS_CMAKE})) ninja -C ${SOF_DOC_BUILD} $${VERBOSE:+-v} doc else - # To build doxygen APIs too run this first: + # To include doxygen APIs run this first: # cmake -GNinja -S ../sof/doc -B ${SOF_DOC_BUILD} + # Note this will make the build CONSIDERABLY LONGER! + # Conversely, you can have _instant builds from scratch_ + # by disabling UML diagrams in the conf.py file. endif html: apidocs diff --git a/conf.py b/conf.py index fa9c4429..b57e4291 100755 --- a/conf.py +++ b/conf.py @@ -45,8 +45,13 @@ plantuml = 'java -jar ' + os.path.join(os.path.abspath('.'), 'scripts/plantuml.jar') \ + ' -config ' + os.path.join(os.path.abspath('.'), 'scripts/plantuml.cfg') -# Temporarily set this to "none" for a build without diagrams but ~= 15 -# times faster from scratch. +# More than half of the time building from scratch is consumed by the +# sphinx extension "breathe" that converts doxygen XML. Most of the rest +# is consumed by plantUML here. So you can set the variable below to +# 'none' for an _almost instant_ sphinx build! (with zero UML diagram +# and no doxygen). 'none' requires sphinxcontrib.plantuml>=0.11 but +# pre-0.11 errors can be ignored. (of course don't disable UML when +# you're touching UML stuff) plantuml_output_format = 'svg' # Add any paths that contain templates here, relative to this directory. diff --git a/scripts/requirements-lax.txt b/scripts/requirements-lax.txt index 64c9b91c..b6cb59af 100644 --- a/scripts/requirements-lax.txt +++ b/scripts/requirements-lax.txt @@ -13,7 +13,21 @@ breathe>=4.7.3 sphinx>=1.6.7 docutils>=0.14 sphinx_rtd_theme>=0.2.4 -sphinxcontrib-plantuml + +# - Version 0.11 is the first version that supports +# `plantuml_output_format=none` which is required for instant builds. +# https://pypi.org/project/sphinxcontrib-plantuml/0.11/ +# +# - 0.24 is the last version successfully tested with +# PIP_IGNORE_INSTALLED=0 and Ubuntu 20.04 (see .github/worflows/) +# +# - Note 0.9 is the minimum to fix this fatal import failure: +# +# sphinx.util.compat.Directive class is now deprecated. Please +# use instead docutils.parsers.rst.Directive +# +# https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=896485#12 +sphinxcontrib.plantuml>=0.11,<0.25 # Differences between these "lax" version requirements and the official From 9f42ccbfdc97cbf5675df3d735f833c9b80372dd Mon Sep 17 00:00:00 2001 From: Marc Herbert Date: Thu, 9 Jun 2022 00:01:48 +0000 Subject: [PATCH 179/290] .github: upgrade LAX environment to Ubuntu 22.04 Unlike scripts/requirements.txt, the purpose of scripts/requirements-lax.txt is to run the latest and greatest. Signed-off-by: Marc Herbert --- .github/workflows/pull-request.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index 1437ec59..5ad42d65 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -102,7 +102,7 @@ jobs: lax: name: "PIP_IGNORE_INSTALLED=0 requirements-lax.txt" - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 # Makefile downgrades the Sphinx warnings, they are not errors any more env: {LAX: 1} steps: From 3b65ca297748ad21ff1cc7f25fb7966e12fc16bf Mon Sep 17 00:00:00 2001 From: Marc Herbert Date: Wed, 17 Aug 2022 08:56:23 -0700 Subject: [PATCH 180/290] Toolchains build: replace `cd` with `git -C`; minor simplification No need to change directory to run a single git command. This makes the "script" shorter and "more stateless". Signed-off-by: Marc Herbert --- getting_started/build-guide/build-from-scratch.rst | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/getting_started/build-guide/build-from-scratch.rst b/getting_started/build-guide/build-from-scratch.rst index 2cc602e2..5d2d2103 100755 --- a/getting_started/build-guide/build-from-scratch.rst +++ b/getting_started/build-guide/build-from-scratch.rst @@ -212,15 +212,14 @@ Clone both repos and check out the ``sof-gcc10.2`` and ``sof-gcc10x`` branch. cd "$SOF_WORKSPACE" git clone https://github.com/thesofproject/xtensa-overlay git clone https://github.com/thesofproject/crosstool-ng - cd xtensa-overlay - git checkout sof-gcc10.2 - cd ../crosstool-ng - git checkout sof-gcc10x + git -C xtensa-overlay/ checkout sof-gcc10.2 + git -C crosstool-ng/ checkout sof-gcc10x Build crosstool-ng and install it in its own source directory. .. code-block:: bash + cd crosstool-ng/ ./bootstrap ./configure --prefix=$(pwd) make From f89312a460396770d5ee0bafb4fa4920a1caf4f2 Mon Sep 17 00:00:00 2001 From: Marc Herbert Date: Wed, 17 Aug 2022 09:29:09 -0700 Subject: [PATCH 181/290] Toolchains build: replace ./ct-ng copy/paste with a `for` loop Copy/paste/diverge, still alive and well in 2022. Signed-off-by: Marc Herbert --- .../build-guide/build-from-scratch.rst | 54 ++++++++----------- 1 file changed, 22 insertions(+), 32 deletions(-) diff --git a/getting_started/build-guide/build-from-scratch.rst b/getting_started/build-guide/build-from-scratch.rst index 5d2d2103..aefcbdb8 100755 --- a/getting_started/build-guide/build-from-scratch.rst +++ b/getting_started/build-guide/build-from-scratch.rst @@ -231,31 +231,33 @@ Toolchains The config files provided refer to ``../xtensa-overlay/`` and point at different ``./builds/xtensa-*-elf`` subdirectories. Copy the ones you want to ``.config`` and build the cross-compiler(s) for your target -platform(s). Note that ``./ct-ng build`` requires an network connection to -download gcc components. +platform(s). Note that ``./ct-ng build`` requires an network connection +to download gcc components. While other steps take minutes at most, +building all toolchains may last about an hour depending on your network +connection and the performance of your system. .. code-block:: bash unset LD_LIBRARY_PATH - # Bay Trail / Cherry Trail - cp config-byt-gcc10.2-gdb9 .config - ./ct-ng build - # Haswell/Broadwell - cp config-hsw-gcc10.2-gdb9 .config - ./ct-ng build - # Apollo Lake - cp config-apl-gcc10.2-gdb9 .config - ./ct-ng build - # Cannon Lake, Ice Lake, Jasper Lake, and Tiger Lake - cp config-cnl-gcc10.2-gdb9 .config - ./ct-ng build - # i.MX8/i.MX8X - cp config-imx-gcc10.2-gdb9 .config - ./ct-ng build - # i.MX8M - cp config-imx8m-gcc10.2-gdb9 .config - ./ct-ng build + # byt = Bay Trail / Cherry Trail + # hsw = Haswell/Broadwell + # apl = Apollo Lake + # cnl = Cannon Lake, Ice Lake, Jasper Lake, and Tiger Lake + # imx = i.MX8/i.MX8X + # imx8m = i.MX8M + + # Omit the toolchains you don't want to save (a lot of) time + time for i in byt hsw apl cnl imx imx8m; do + cp config-$i-gcc10.2-gdb9 .config && + time ./ct-ng build || break + done + + # ... or just build all toolchains + time for i in config*gcc10.2-gdb9; do + cp "$i" .config && time ./ct-ng build || break + done + ``./ct-ng`` is a Linux kernel style Makefile; so the sample commands below can be used to fix some out of date ``config-*-gcc10.2-gdb9`` file or find @@ -268,18 +270,6 @@ default values missing from it: ./ct-ng oldconfig V=1 diff -u config-apl-gcc10.2-gdb9 .config -While other steps take minutes at most, building all toolchains may last -about an hour depending on the performance of your system. Run this loop -to build all toolchains without interruption: - -.. code-block:: bash - - unset LD_LIBRARY_PATH; - time for i in config*gcc10.2-gdb9; do - cp "$i" .config && ./ct-ng build || break ; - done - - "Install" toolchains in the expected location by linking from ``$SOF_WORKSPACE`` to them: From 5fc9896a751d8b06417d15f8db74c1e085928eca Mon Sep 17 00:00:00 2001 From: Marc Herbert Date: Wed, 17 Aug 2022 09:56:49 -0700 Subject: [PATCH 182/290] Toolchains build: rephrase optional PATH addition Fixes commit c4f0b1a067d4e ("Grammatical edits to build from scratch; small conf.py edit") Signed-off-by: Marc Herbert --- getting_started/build-guide/build-from-scratch.rst | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/getting_started/build-guide/build-from-scratch.rst b/getting_started/build-guide/build-from-scratch.rst index aefcbdb8..55080327 100755 --- a/getting_started/build-guide/build-from-scratch.rst +++ b/getting_started/build-guide/build-from-scratch.rst @@ -311,9 +311,11 @@ switch to the `xtensa` branch. git checkout -b xtensa origin/xtensa Temporarily add toolchains to your PATH variable. This is *not* required -when using high-level scripts described below; it's only required here or -when invoking CMake manually. In other words, you don't need to adjust your -PATH permanently because no risk of interfere with non-SOF tasks exists. +when using the high-level, "every day" build scripts described in the +next sections. It's only required for this once-off ``newlib`` headers +step or when invoking CMake manually. In other words, you don't need to +change your PATH permanently which would interfere with other, non-SOF +work. .. code-block:: bash @@ -324,6 +326,7 @@ Build and install the newlib headers for each toolchain: .. code-block:: bash XTENSA_ROOT="${SOF_WORKSPACE}"/xtensa-root + cd "${SOF_WORKSPACE}"/newlib-xtensa time for toolchain in ../xtensa-*-elf; do ./configure --target="${toolchain#../}" --prefix="$XTENSA_ROOT" && make && make install || break; From 07f723d24ed4a41c29f06c95da0b964943f68ae3 Mon Sep 17 00:00:00 2001 From: Marc Herbert Date: Wed, 17 Aug 2022 12:43:57 -0700 Subject: [PATCH 183/290] git clone --recursive submodule https://github.com/thesofproject/sof Now that the Zephyr build has been migrated to west by PR #6005, we should remove the recursive cloning hack in CMake. Downloading and building must be kept separate. Signed-off-by: Marc Herbert --- getting_started/build-guide/build-from-scratch.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/getting_started/build-guide/build-from-scratch.rst b/getting_started/build-guide/build-from-scratch.rst index 55080327..fa49ef08 100755 --- a/getting_started/build-guide/build-from-scratch.rst +++ b/getting_started/build-guide/build-from-scratch.rst @@ -355,7 +355,7 @@ After the SOF environment is set up, clone the *sof* repo: .. code-block:: bash cd "$SOF_WORKSPACE" - git clone https://github.com/thesofproject/sof + git clone --recursive https://github.com/thesofproject/sof cd sof From ebf3f1b0bd33a17f575ee81342ee27119a298648 Mon Sep 17 00:00:00 2001 From: Marc Herbert Date: Wed, 17 Aug 2022 12:54:47 -0700 Subject: [PATCH 184/290] Add -j 4 example to "make -C installer" example The test says the build is parallel and fast but the example was not. Signed-off-by: Marc Herbert --- getting_started/build-guide/build-from-scratch.rst | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/getting_started/build-guide/build-from-scratch.rst b/getting_started/build-guide/build-from-scratch.rst index fa49ef08..4c0519af 100755 --- a/getting_started/build-guide/build-from-scratch.rst +++ b/getting_started/build-guide/build-from-scratch.rst @@ -365,7 +365,10 @@ optional target hostname in the latter file. Then run the installer: .. code-block:: bash - make -C installer/ + make -C installer/ [ -j 4 ] + +Adjust the ``-j 4`` example to your number of CPU cores or remove it +when the build fails. This builds multiple platforms in parallel and deploys firmware and topologies to ``/lib/firmware/intel/`` on the local or remote From 2eb8aa7bcc364a7907daec17f886d277db8a9112 Mon Sep 17 00:00:00 2001 From: Deb Date: Fri, 19 Aug 2022 09:27:26 -0600 Subject: [PATCH 185/290] Grammar and style updates to SOF-Zephyr file Signed-off-by: Deb --- .../build-guide/build-with-zephyr.rst | 168 ++++++++---------- 1 file changed, 75 insertions(+), 93 deletions(-) diff --git a/getting_started/build-guide/build-with-zephyr.rst b/getting_started/build-guide/build-with-zephyr.rst index 998b3924..781dc920 100755 --- a/getting_started/build-guide/build-with-zephyr.rst +++ b/getting_started/build-guide/build-with-zephyr.rst @@ -17,25 +17,24 @@ This guide describes how to build and run |SOF| as a Zephyr application. Prepare ******* -- The easiest way to build Zephyr is to use its recommended toolchain. Follow - instructions in `Install a Toolchain `_ for details. +- The easiest way to build Zephyr is to use its recommended toolchain which is included in its SDK. Refer to `Install Zephyr SDK `_ for details. -- Install **west** - Zephyr uses west as a source management and building system. Follow +- Install **west**. Zephyr uses west as a source management and building system. Follow the Zephyr `Getting Started `_ guide for dependencies and for the west installation. Clone and initialize SOF project ******************************** -Initialize west manifest ``$ZEPHYR_WORKSPACE/sof/west.yml`` using ``west tool``: +Initialize the west manifest ``$ZEPHYR_WORKSPACE/sof/west.yml`` using the ``west tool``: - - Clone SOF repository + - Clone the SOF repository: .. code-block:: bash mkdir $ZEPHYR_WORKSPACE && cd $ZEPHYR_WORKSPACE west init -m https://github.com/thesofproject/sof - - Or initialize west manifest from existing SOF clone (when using python convenience script this is not mandatory - see below) + - Or initialize the west manifest from the existing SOF clone. Note that when using the Python convenience script, as described in the next section, this is not mandatory. .. code-block:: bash @@ -43,49 +42,43 @@ Initialize west manifest ``$ZEPHYR_WORKSPACE/sof/west.yml`` using ``west tool``: west init -l ./sof - .. tip:: - | Zephyr project also uses west manifest. It may happen that your west tool is already initialized to manifest of zephyr. - | During initialization west will issue following error: + .. note:: + | Since the Zephyr project also uses the west manifest, your west tool might already be initialized to manifest Zephyr. In this case, west issues the following error during initialization: | *"FATAL ERROR: already initialized in $ZEPHYR_WORKSPACE, aborting."* | - | To verify manifest currently used by west tool, in ``$ZEPHYR_WORKSPACE`` directory execute command: + | To verify that the manifest is currently used by the west tool, execute the following command from the ``$ZEPHYR_WORKSPACE`` directory: | ``west config -l``. | - | If command output shows: + | If command output shows the following, remove the ``$ZEPHYR_WORKSPACE/.west`` directory and reinitialize the west manifest using one of the two methods described above: | *manifest.path=zephyr* | *manifest.file=west.yml* - | You need to remove ``$ZEPHYR_WORKSPACE/.west`` directory and reinitialize west in on of two methods described above. - .. danger:: - | SOF project **must** be cloned to "sof" directory - this name is hardcoded in west manifest file! - | Failure to do so may result in SOF dependencies being cloned to newly created ``$ZEPHYR_WORKSPACE/sof/rimage`` directory - | along with other not desired consequences. + .. important:: + The SOF project **must** be cloned to the ``sof`` directory because this name is hardcoded in the west manifest file. Failure to do so may result in SOF dependencies being cloned into a newly created ``$ZEPHYR_WORKSPACE/sof/rimage`` directory along with other undesirable consequences. - **All commands described in the guide from this point should be executed in ``$ZEPHYR_WORKSPACE`` directory.** + **All commands described in the guide from this point should be executed from the $ZEPHYR_WORKSPACE directory.** -Check out and build using python convenience script +Check out and build using Python convenience script *************************************************** -| SOF project offers python convenience script: ``./sof/scripts/xtensa-build-zephyr.py`` -| used to provide more friendly build process for end-user. -| It is a wrapper for a **west tool** that performs steps described in `Check out and build using West Tool directly `_ section. -| Script may be used on both Windows and Linux operating systems. -| It will be removed in future as soon as SOF project will have better integration with **west tool** commands. - -Script automates following steps that are required to build a firmware for SOF platform: - - Initializes your west tool to SOFs west manifest - - Clones and checks out SOF and Zephyr dependencies - - Builds a firmware ``.elf`` file for requested platform - - Builds a **rimage tool** - - Uses **rimage tool** and a **private key** to sign the ``.elf`` file producing final firmware image file with ``.ri`` extension. - - Uses **smex tool** to generate a debugging symbols file with ``.ldc`` extension. - -| List of platforms that may be built with the script is shown in the help message: +The SOF project offers a Python convenience script, ``./sof/scripts/xtensa-build-zephyr.py``, that provides a friendly build process for the end user. It is a wrapper for a **west tool** that performs steps described in the `Check out and build using west tool directly`_ section below. + +This script can be used on both Windows and Linux operating systems. Note that it will be removed when the SOF project creates better integration with west tool commands. + +The script automates the following steps that are required to build firmware for the SOF platform: + - Initializes your west tool to SOF's west manifest. + - Clones and checks out SOF and Zephyr dependencies. + - Builds a firmware ``.elf`` file for the requested platform. + - Builds a **rimage tool**. + - Uses the **rimage tool** and a **private key** to sign the ``.elf`` file. It produces a final firmware image file with the ``.ri`` extension. + - Uses the **smex tool** to generate debugging symbols file with the ``.ldc`` extension. + +| A list of platforms that can be built with the script is shown in this help message: | ``./sof/scripts/xtensa-build-zephyr.py --help`` Usage example 1: - You cloned SOF project and would like to build a firmware for *Tigerlake* platform. + You cloned the SOF project and you want to build firmware for the *Tigerlake* platform. .. code-block:: bash @@ -93,8 +86,8 @@ Usage example 1: Running this command will: - - Initialize west to ``./sof/west.yml`` manifest is not already initialized. - - Clone and checkout projects to revision defined in ``./sof/west.yml`` file: + - Initialize west to the ``./sof/west.yml`` manifest if it is not already initialized. + - Clone and check out projects to the revision defined in the ``./sof/west.yml`` file: - SOFs submodules (Rimage and Tomlc99) - Zephyr project @@ -102,40 +95,38 @@ Usage example 1: - Build a signed firmware image ``./build-tgl/zephyr/zephyr.ri`` and debug symbols file ``./build-sof-staging/sof/sof-tgl.ldc``. - .. tip:: - You may wish to rebuild all files from scratch. - To do this, add ``-p`` flag to script invocation. - To provide better build verbosity, use ``-v`` flag. - Make sure to check script ``--help`` to see all build options. + .. note:: + You may wish to rebuild all files from scratch. To do this, add a ``-p`` flag to the script invocation. To provide better build verbosity, use the ``-v`` flag. Make sure to check ``--help`` to see all build options. Usage example 2: - You have your environment set up - cloned SOF project and working on your fork/branch of Zephyr and Rimage submodule. - You wish to build *Tigerlake* platform with your changes. + Your environment is set up as a cloned SOF project and you are working on a fork/branch of the Zephyr and Rimage submodules. You want to build a *Tigerlake* platform with your changes. .. code-block:: bash ./sof/scripts/xtensa-build-zephyr.py tgl Running this command will: - - Initialize west to ``./sof/west.yml`` manifest is not already initialized. + + - Initialize west to the ``./sof/west.yml`` manifest if it is not already initialized. - Build a signed firmware image ``./build-tgl/zephyr/zephyr.ri`` and debug symbols file ``./build-sof-staging/sof/sof-tgl.ldc``. - - Skip cloning dependencies and checking them out to revision from ``./sof/west.yml`` manifest. + - Skip cloning dependencies and check them out to revisions from the ``./sof/west.yml`` manifest. Usage example 3: - You have your environment set up - cloned SOF project and working on your fork/branch of Zephyr and Rimage submodule. - You wish to restore default revisions for SOF dependencies from ``./sof/west.yml`` manifest. + Your environment is set up as a cloned SOF project and you are working on a fork/branch of the Zephyr and Rimage submodules. You want to restore default revisions for SOF dependencies from the ``./sof/west.yml`` manifest. .. code-block:: bash ./sof/scripts/xtensa-build-zephyr.py -u - - Initialize west to ``./sof/west.yml`` manifest is not already initialized. - - Clone and checkout projects to revisions defined in ``./sof/west.yml`` file. - - Skip building firmware image. + Running this command will: + + - Initialize west to the ``./sof/west.yml`` manifest if it is not already initialized. + - Clone and checkout projects to revisions defined in the ``./sof/west.yml`` file. + - Skip building the firmware image. Output directory For convenience, the ``xtensa-build-zephyr.py`` script copies all - firmware files into a single, "staging" directory: + firmware files into a single, staging directory: .. code-block:: bash @@ -149,77 +140,74 @@ Output directory │   │   └── sof-tgl-h.ri -Check out and build using West Tool directly +Check out and build using west tool directly ******************************************** -#. Clone and check out SOF dependencies - submodules, Zephyr project and some of its modules needed by SOF: +#. Clone and check out SOF dependencies such as submodules, the Zephyr project, and some of its modules needed by SOF: .. code-block:: bash west update - .. warning:: - This command will check out revisions specified in ``$ZEPHYR_WORKSPACE/sof/west.yml`` file for projects: + .. important:: + This command will check out revisions specified in the ``$ZEPHYR_WORKSPACE/sof/west.yml`` file for the following projects: - Rimage (SOF submodule) - Tomlc99 (Rimage submodule) - Zephyr - projects in ``$ZEPHYR_WORKSPACE/modules`` directory. - Make sure to backup your work before changing revisions! - It will not affect your SOF project revision. + **Make sure you back up your work before changing revisions!** + This will not affect your SOF project revision. -#. Build a board - make sure the appropriate Zephyr SDK or other toolchain of your - choice. Boards to build are listed in ``$ZEPHYR_WORKSPACE/sof/app/boards`` directory. +#. Build a board. Make sure to use the appropriate Zephyr SDK or other toolchain of your choice. Boards to build are listed in the ``$ZEPHYR_WORKSPACE/sof/app/boards`` directory. .. code-block:: bash west build --build-dir build-tgl --board intel_adsp_cavs25 ./sof/app - .. hint:: - SOF project defines platform names that have Zephyr board counterpart. - In this example platform *Tigerlake* matches Zephyr board *inteL_adsp_cavs25* - (this is why output directory is named *build-tgl* however you may use any name you wish). + + Note that the SOF project defines platform names that have Zephyr board counterparts. In the above example, the *Tigerlake* platform matches the ``inteL_adsp_cavs25`` Zephyr board. This is why the output directory is named ``build-tgl``; however, you may use any name you wish. - .. tip:: - - To add verbosity to the build output use -v -v flags. Example: + .. note:: + To add verbosity to the build output use the -v -v flags. Example: ``west -v -v build --build-dir build-tgl --board intel_adsp_cavs25 ./sof/app`` - - To perform complete clean rebuild use --pristine flag. Example: + To perform a complete clean rebuild, use the --pristine flag. Example: ``west -v -v build --build-dir build-tgl --pristine always --board intel_adsp_cavs25 ./sof/app`` - ``.elf`` file produced by ``west build`` is missing a - manifest and signature. You need to sign the file using **rimage tool** - and a **private key** to generate final firmware image (``.ri`` file). + The ``.elf`` file produced by the ``west build`` is missing a + manifest and signature. A a result, you must sign the file using the **rimage tool** + and a **private key** to generate the final firmware image (``.ri`` file). -#. Build rimage tool +#. Build the rimage tool by running the following: .. code-block:: bash cmake -B ./build-rimage -S ./sof/rimage cmake --build ./build-rimage -#. Sign firmware using rimage tool and a private key +#. Sign the firmware using the rimage tool and a private key by running the following: .. code-block:: bash west sign --build-dir ./build-tgl -t rimage --tool-path ./build-rimage/rimage --tool-data ./sof/rimage/config -- -k ./sof/keys/otc_private_key_3k.pem - **Signed output firmware image file is** ``./build-tgl/zephyr/zephyr.ri`` **.** + **The signed output firmware image file is** ``./build-tgl/zephyr/zephyr.ri`` **.** - .. hint:: - SOF project provides some pre-generated key pairs of different lengths: + .. note:: + The SOF project provides some pre-generated key pairs of different lengths: - ``./sof/keys/otc_private_key_3k.pem`` + ``./sof/keys/otc_public_key_3k.pem`` - ``./sof/keys/otc_private_key.pem`` + ``./sof/keys/otc_public_key.pem`` You may wish to generate your own set of keys for firmware signing. -#. (Optional) Generate debug symbols +#. (Optional) Generate debug symbols. .. code-block::bash ./build-tgl/zephyr/smex_ep/build/smex -l ./build-tgl/zephyr/zephyr.ldc ./build-tgl/zephyr/zephyr.elf - Output file ``./build-tgl/zephyr/zephyr.ldc`` may be used for reading firmware logs. + The output file ``./build-tgl/zephyr/zephyr.ldc`` may be used for reading firmware logs. Run *** @@ -231,16 +219,14 @@ Run sudo rsync -a build-sof-staging/sof/ testsystemN.local:/lib/firmware/intel/sof/ - ``rsync`` also works locally and unlike ``cp -R`` it is always - idempotent. You may want to use the ``rsync -a --delete`` option to - make absolutely sure you're not running some older version but only - after backing up your original ``sof/`` directory first. The - ``--delete`` option is dangerous, use it only in very well tested + Note that ``rsync`` also works locally and, unlike ``cp -R``, it is always + idempotent. You may want to use the ``rsync -a --delete`` option to + make absolutely sure you're not running some older version, **but do so + only after first backing up your original sof/ directory**. The + ``--delete`` option is dangerous; use it only in very well-tested scripts. - Also make sure nothing in ``/lib/firmware/updates`` takes precedence, - see - https://www.kernel.org/doc/html/v5.5/driver-api/firmware/fw_search_path.html + Also make sure nothing in ``/lib/firmware/updates`` takes precedence. Refer to `Firmware search paths `_. #. Reboot the system. Note that the location and name of your SOF firmware image may vary by system. Search your kernel logs with @@ -266,20 +252,16 @@ You might also need to build and update your system audio topology file. For details see :ref:`build-from-scratch`. -Troubleshooting -*************** +Troubleshoot +************ -#. West tool version is older than minimal version requirement defined in ``./sof/west.yml`` manifest. +#. The west tool version is older than the minimal version requirement defined in the ``./sof/west.yml`` manifest. - | Manifest file defines minimal yaml schema version that sets compatibility with west tool - | according to https://docs.zephyrproject.org/latest/develop/west/manifest.html#version . - | If west tools version is not sufficient to process manifest file, west raises not very user-friendly - | exception (reference to west 0.12.0 for Windows): + | The manifest file defines the minimal yaml schema version that sets compatibility with west tool according to `Zephyr documentation `_. If your west tools version is not sufficient to process the manifest file, west raises an exception (reference to west 0.12.0 for Windows): .. code-block:: bash west.manifest.ManifestVersionError: ('0.13', WindowsPath('$ZEPHYR_WORKSPACE/.west/manifest-tmp/west.yml')) - | In this example ``./sof/west.yml`` defines minimal version as ``0.13`` while west tool used has version ``0.12.0``. - | Update your west tool to newer version to proceed. + | In this example, ``./sof/west.yml`` defines minimal version as ``0.13`` while the west tool used has version ``0.12.0``. Update your west tool to a newer version. From 1a9ab3a32a290fc9a96f0b4d7747f515e8174d7f Mon Sep 17 00:00:00 2001 From: bhiregoudar <87515748+bhiregoudar@users.noreply.github.com> Date: Tue, 23 Aug 2022 18:56:17 +0530 Subject: [PATCH 186/290] Update index.rst Updated with AMD Rembrandt platform specs --- platforms/index.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platforms/index.rst b/platforms/index.rst index 585e1e00..9d80e0f7 100644 --- a/platforms/index.rst +++ b/platforms/index.rst @@ -28,7 +28,8 @@ Platform and board specific support is continually added to the SOF project as d "NXP i.MX8X", "Xtensa HiFi4", "1 @ 640MHz", "TBD", "64 KB TCM / 448 KB OCRAM / 8MB SDRAM", "1 x ESAI, 1 x SAI" "NXP i.MX8M", "Xtensa HiFi4", "1 @ 800MHz", "TBD", "64 KB TCM / 256 KB OCRAM / 8MB SDRAM", "1 x SAI, MICFIL" "NXP i.MX8ULP", "Xtensa HiFi4", "1 @ 520MHz", "TBD", "64 KB TCM / 256 KB OCRAM / 8MB SDRAM", "1 x SAI" - "AMD Renoir", "Xtensa HiFi3", "1 @ 600MHz", "TBD", "20 KB LP SRAM / 1152 KB IRAM/DRAM", "1 x SP (I2S, PCM), 1 x BT (I2S, PCM), DMIC" + "AMD Renoir", "Xtensa HiFi3", "1 @ 200-600MHz", "TBD", "20 KB LP SRAM / 1152 KB IRAM/DRAM", "1 x SP (I2S, PCM), 1 x BT (I2S, PCM), DMIC" + "AMD Rembrandt", "Xtensa HiFi5", "1 @ 200-800MHz", "TBD", "1.75 MB HP SRAM / 512 KB IRAM/DRAM", "1 x SP (I2S, PCM), 1 x BT (I2S, PCM), 1 x HS(I2S, PCM), DMIC" "Mediatek mt8195", "Xtensa HiFi4", "1 @ 220 - 720MHz", "TBD", "256 KB SRAM / 16 MB DRAM", "2 x TDM Out, 1 x TDM In, DMIC" When support for a new platform is being added, certain interfaces required by From 73de46eb6d6004118a41fef511f17640de08965e Mon Sep 17 00:00:00 2001 From: Michal Wasko Date: Thu, 17 Feb 2022 09:43:27 +0100 Subject: [PATCH 187/290] arch: fw: intel: move cavs arch to sub-folder Group Intel cAVS vendor specific architecture chapters in one folder. Signed-off-by: Michal Wasko --- architectures/firmware/index.rst | 5 +---- .../{ => cavs}/cavs-boot/apollolake/apl-boot-ldr.rst | 0 .../{ => cavs}/cavs-boot/apollolake/apl-boot-rom.rst | 0 .../cavs-boot/apollolake/images/apl-rom-flow.pu | 0 .../intel/{ => cavs}/cavs-boot/apollolake/index.rst | 0 .../{ => cavs}/cavs-boot/cavs-dsp-boot-overview.rst | 0 .../intel/{ => cavs}/cavs-boot/images/boot-dsp.pu | 0 .../intel/{ => cavs}/cavs-boot/images/boot-ldr-flow.pu | 0 .../intel/{ => cavs}/cavs-boot/images/loading-bins.pu | 0 .../intel/{ => cavs}/cavs-boot/images/write-bin.pu | 0 .../firmware/intel/{ => cavs}/cavs-boot/index.rst | 0 .../firmware/intel/{ => cavs}/images/idc-send-message.pu | 0 architectures/firmware/intel/{ => cavs}/index.rst | 9 +++++---- architectures/firmware/intel/{ => cavs}/smp/index.rst | 4 ++-- 14 files changed, 8 insertions(+), 10 deletions(-) rename architectures/firmware/intel/{ => cavs}/cavs-boot/apollolake/apl-boot-ldr.rst (100%) rename architectures/firmware/intel/{ => cavs}/cavs-boot/apollolake/apl-boot-rom.rst (100%) rename architectures/firmware/intel/{ => cavs}/cavs-boot/apollolake/images/apl-rom-flow.pu (100%) rename architectures/firmware/intel/{ => cavs}/cavs-boot/apollolake/index.rst (100%) rename architectures/firmware/intel/{ => cavs}/cavs-boot/cavs-dsp-boot-overview.rst (100%) rename architectures/firmware/intel/{ => cavs}/cavs-boot/images/boot-dsp.pu (100%) rename architectures/firmware/intel/{ => cavs}/cavs-boot/images/boot-ldr-flow.pu (100%) rename architectures/firmware/intel/{ => cavs}/cavs-boot/images/loading-bins.pu (100%) rename architectures/firmware/intel/{ => cavs}/cavs-boot/images/write-bin.pu (100%) rename architectures/firmware/intel/{ => cavs}/cavs-boot/index.rst (100%) rename architectures/firmware/intel/{ => cavs}/images/idc-send-message.pu (100%) rename architectures/firmware/intel/{ => cavs}/index.rst (54%) rename architectures/firmware/intel/{ => cavs}/smp/index.rst (98%) diff --git a/architectures/firmware/index.rst b/architectures/firmware/index.rst index 2e50cf73..92160766 100644 --- a/architectures/firmware/index.rst +++ b/architectures/firmware/index.rst @@ -22,10 +22,7 @@ Architecture details of any vendor specific code and flows. This is architecture specific to a single vendor that falls outside the scope of the high level generic SOF architecture. -Intel ------ - .. toctree:: :maxdepth: 1 - intel/index \ No newline at end of file + intel/cavs/index \ No newline at end of file diff --git a/architectures/firmware/intel/cavs-boot/apollolake/apl-boot-ldr.rst b/architectures/firmware/intel/cavs/cavs-boot/apollolake/apl-boot-ldr.rst similarity index 100% rename from architectures/firmware/intel/cavs-boot/apollolake/apl-boot-ldr.rst rename to architectures/firmware/intel/cavs/cavs-boot/apollolake/apl-boot-ldr.rst diff --git a/architectures/firmware/intel/cavs-boot/apollolake/apl-boot-rom.rst b/architectures/firmware/intel/cavs/cavs-boot/apollolake/apl-boot-rom.rst similarity index 100% rename from architectures/firmware/intel/cavs-boot/apollolake/apl-boot-rom.rst rename to architectures/firmware/intel/cavs/cavs-boot/apollolake/apl-boot-rom.rst diff --git a/architectures/firmware/intel/cavs-boot/apollolake/images/apl-rom-flow.pu b/architectures/firmware/intel/cavs/cavs-boot/apollolake/images/apl-rom-flow.pu similarity index 100% rename from architectures/firmware/intel/cavs-boot/apollolake/images/apl-rom-flow.pu rename to architectures/firmware/intel/cavs/cavs-boot/apollolake/images/apl-rom-flow.pu diff --git a/architectures/firmware/intel/cavs-boot/apollolake/index.rst b/architectures/firmware/intel/cavs/cavs-boot/apollolake/index.rst similarity index 100% rename from architectures/firmware/intel/cavs-boot/apollolake/index.rst rename to architectures/firmware/intel/cavs/cavs-boot/apollolake/index.rst diff --git a/architectures/firmware/intel/cavs-boot/cavs-dsp-boot-overview.rst b/architectures/firmware/intel/cavs/cavs-boot/cavs-dsp-boot-overview.rst similarity index 100% rename from architectures/firmware/intel/cavs-boot/cavs-dsp-boot-overview.rst rename to architectures/firmware/intel/cavs/cavs-boot/cavs-dsp-boot-overview.rst diff --git a/architectures/firmware/intel/cavs-boot/images/boot-dsp.pu b/architectures/firmware/intel/cavs/cavs-boot/images/boot-dsp.pu similarity index 100% rename from architectures/firmware/intel/cavs-boot/images/boot-dsp.pu rename to architectures/firmware/intel/cavs/cavs-boot/images/boot-dsp.pu diff --git a/architectures/firmware/intel/cavs-boot/images/boot-ldr-flow.pu b/architectures/firmware/intel/cavs/cavs-boot/images/boot-ldr-flow.pu similarity index 100% rename from architectures/firmware/intel/cavs-boot/images/boot-ldr-flow.pu rename to architectures/firmware/intel/cavs/cavs-boot/images/boot-ldr-flow.pu diff --git a/architectures/firmware/intel/cavs-boot/images/loading-bins.pu b/architectures/firmware/intel/cavs/cavs-boot/images/loading-bins.pu similarity index 100% rename from architectures/firmware/intel/cavs-boot/images/loading-bins.pu rename to architectures/firmware/intel/cavs/cavs-boot/images/loading-bins.pu diff --git a/architectures/firmware/intel/cavs-boot/images/write-bin.pu b/architectures/firmware/intel/cavs/cavs-boot/images/write-bin.pu similarity index 100% rename from architectures/firmware/intel/cavs-boot/images/write-bin.pu rename to architectures/firmware/intel/cavs/cavs-boot/images/write-bin.pu diff --git a/architectures/firmware/intel/cavs-boot/index.rst b/architectures/firmware/intel/cavs/cavs-boot/index.rst similarity index 100% rename from architectures/firmware/intel/cavs-boot/index.rst rename to architectures/firmware/intel/cavs/cavs-boot/index.rst diff --git a/architectures/firmware/intel/images/idc-send-message.pu b/architectures/firmware/intel/cavs/images/idc-send-message.pu similarity index 100% rename from architectures/firmware/intel/images/idc-send-message.pu rename to architectures/firmware/intel/cavs/images/idc-send-message.pu diff --git a/architectures/firmware/intel/index.rst b/architectures/firmware/intel/cavs/index.rst similarity index 54% rename from architectures/firmware/intel/index.rst rename to architectures/firmware/intel/cavs/index.rst index cd96cc5a..4f3ac9a7 100644 --- a/architectures/firmware/intel/index.rst +++ b/architectures/firmware/intel/cavs/index.rst @@ -1,9 +1,10 @@ -.. _architecture-intel: +.. _cavs-architecture-intel: -Intel DSP Architecture -###################### +Intel cAVS Architecture +####################### -The details below are specific to Intel products with an audio DSP using SOF. +The details below are specific to Intel products with an audio DSP cAVS +architecture using SOF. .. toctree:: :maxdepth: 1 diff --git a/architectures/firmware/intel/smp/index.rst b/architectures/firmware/intel/cavs/smp/index.rst similarity index 98% rename from architectures/firmware/intel/smp/index.rst rename to architectures/firmware/intel/cavs/smp/index.rst index b3893da3..5aff7fc0 100644 --- a/architectures/firmware/intel/smp/index.rst +++ b/architectures/firmware/intel/cavs/smp/index.rst @@ -1,7 +1,7 @@ .. _architecture-intel-smp: -Intel Architecture -################## +Intel SMP Architecture +###################### Description *********** From ef566722dfc2a90cc489c9813fb757b303d1f30a Mon Sep 17 00:00:00 2001 From: Michal Wasko Date: Fri, 11 Mar 2022 15:53:58 +0100 Subject: [PATCH 188/290] arch: fw: define sof-xtos arch section Move existing FW architecture to sof-xtos section to separate from Zephyr variant. Signed-off-by: Michal Wasko --- architectures/firmware/index.rst | 9 +-------- .../components/component-mgmt-api.rst | 0 .../components/component-overview.rst | 0 .../components/images/comp-dev-states.pu | 0 .../components/images/comp-driver.pu | 0 .../components/images/comp-new-flow.pu | 0 .../components/images/component-mgmt-api.pu | 0 .../{ => sof-xtos}/components/index.rst | 0 .../drivers/dai/images/dai-ops.pu | 0 .../drivers/dai/images/dai-set-config.pu | 0 .../{ => sof-xtos}/drivers/dai/index.rst | 0 .../drivers/dma/images/dma-ops.pu | 0 .../drivers/dma/images/dma-transfer.pu | 0 .../{ => sof-xtos}/drivers/dma/index.rst | 0 .../drivers/dma/intel/hda-dma.rst | 0 .../drivers/dma/intel/images/hda-host-output.pu | 0 .../drivers/dma/intel/images/hda-link.pu | 0 .../drivers/dma/intel/images/hda-start-flow.pu | 0 .../drivers/dma/intel/images/hda-stop-flow.pu | 0 .../{ => sof-xtos}/drivers/dma/intel/index.rst | 0 .../drivers/images/device-disco.pu | 0 .../drivers/images/device-probe.pu | 0 .../drivers/images/device-remove.pu | 0 .../firmware/{ => sof-xtos}/drivers/index.rst | 0 .../{ => sof-xtos}/images/edf-scheduler-deps.pu | 0 .../{ => sof-xtos}/images/edf-scheduler-flow.pu | 0 .../sof-xtos}/images/fw-arch-diag.png | Bin .../{ => sof-xtos}/images/ll-scheduler-deps.pu | 0 .../{ => sof-xtos}/images/ll-scheduler-flow.pu | 0 .../{ => sof-xtos}/images/memory-zones.dot | 0 .../{ => sof-xtos}/images/runtime-zone.dot | 0 .../{ => sof-xtos}/images/scheduler-ops.pu | 0 .../{ => sof-xtos}/images/system-zone.dot | 0 architectures/firmware/sof-xtos/index.rst | 16 ++++++++++++++++ .../images/kd-component-diagram.pu | 0 .../images/kd-e2e-sequence-diagram.pu | 0 .../kd_integration/images/kd-state-diagram.pu | 0 .../kd_integration/images/kd-timing-diagram.pu | 0 .../{ => sof-xtos}/kd_integration/index.rst | 0 .../kd_integration/kd-integration.rst | 0 .../firmware/{ => sof-xtos}/mem-mgmt.rst | 0 .../firmware/{ => sof-xtos}/overview.rst | 2 +- .../{ => sof-xtos}/pipelines/images/ppl-new.pu | 0 .../pipelines/images/ppl-op-downstream.pu | 0 .../pipelines/images/ppl-operations.pu | 0 .../pipelines/images/ppl-params.pu | 0 .../pipelines/images/ppl-reset.pu | 0 .../pipelines/images/ppl-struct.pu | 0 .../{ => sof-xtos}/pipelines/images/ppl-task.pu | 0 .../firmware/{ => sof-xtos}/pipelines/index.rst | 0 .../pm-runtime/images/pm-dsp-core-idle.pu | 0 .../pm-runtime/images/pm-dsp-core-init.pu | 0 .../{ => sof-xtos}/pm-runtime/index.rst | 0 .../images/dsp-core-lps-cavs-d0-d0i3-d0.pu | 0 .../pm-runtime/intel/pm-dsp-core-cavs.rst | 0 .../{ => sof-xtos}/pm-runtime/pm-dsp-core.rst | 0 .../firmware/{ => sof-xtos}/schedulers.rst | 0 57 files changed, 18 insertions(+), 9 deletions(-) rename architectures/firmware/{ => sof-xtos}/components/component-mgmt-api.rst (100%) rename architectures/firmware/{ => sof-xtos}/components/component-overview.rst (100%) rename architectures/firmware/{ => sof-xtos}/components/images/comp-dev-states.pu (100%) rename architectures/firmware/{ => sof-xtos}/components/images/comp-driver.pu (100%) rename architectures/firmware/{ => sof-xtos}/components/images/comp-new-flow.pu (100%) rename architectures/firmware/{ => sof-xtos}/components/images/component-mgmt-api.pu (100%) rename architectures/firmware/{ => sof-xtos}/components/index.rst (100%) rename architectures/firmware/{ => sof-xtos}/drivers/dai/images/dai-ops.pu (100%) rename architectures/firmware/{ => sof-xtos}/drivers/dai/images/dai-set-config.pu (100%) rename architectures/firmware/{ => sof-xtos}/drivers/dai/index.rst (100%) rename architectures/firmware/{ => sof-xtos}/drivers/dma/images/dma-ops.pu (100%) rename architectures/firmware/{ => sof-xtos}/drivers/dma/images/dma-transfer.pu (100%) rename architectures/firmware/{ => sof-xtos}/drivers/dma/index.rst (100%) rename architectures/firmware/{ => sof-xtos}/drivers/dma/intel/hda-dma.rst (100%) rename architectures/firmware/{ => sof-xtos}/drivers/dma/intel/images/hda-host-output.pu (100%) rename architectures/firmware/{ => sof-xtos}/drivers/dma/intel/images/hda-link.pu (100%) rename architectures/firmware/{ => sof-xtos}/drivers/dma/intel/images/hda-start-flow.pu (100%) rename architectures/firmware/{ => sof-xtos}/drivers/dma/intel/images/hda-stop-flow.pu (100%) rename architectures/firmware/{ => sof-xtos}/drivers/dma/intel/index.rst (100%) rename architectures/firmware/{ => sof-xtos}/drivers/images/device-disco.pu (100%) rename architectures/firmware/{ => sof-xtos}/drivers/images/device-probe.pu (100%) rename architectures/firmware/{ => sof-xtos}/drivers/images/device-remove.pu (100%) rename architectures/firmware/{ => sof-xtos}/drivers/index.rst (100%) rename architectures/firmware/{ => sof-xtos}/images/edf-scheduler-deps.pu (100%) rename architectures/firmware/{ => sof-xtos}/images/edf-scheduler-flow.pu (100%) rename architectures/{ => firmware/sof-xtos}/images/fw-arch-diag.png (100%) rename architectures/firmware/{ => sof-xtos}/images/ll-scheduler-deps.pu (100%) rename architectures/firmware/{ => sof-xtos}/images/ll-scheduler-flow.pu (100%) rename architectures/firmware/{ => sof-xtos}/images/memory-zones.dot (100%) rename architectures/firmware/{ => sof-xtos}/images/runtime-zone.dot (100%) rename architectures/firmware/{ => sof-xtos}/images/scheduler-ops.pu (100%) rename architectures/firmware/{ => sof-xtos}/images/system-zone.dot (100%) create mode 100644 architectures/firmware/sof-xtos/index.rst rename architectures/firmware/{ => sof-xtos}/kd_integration/images/kd-component-diagram.pu (100%) rename architectures/firmware/{ => sof-xtos}/kd_integration/images/kd-e2e-sequence-diagram.pu (100%) rename architectures/firmware/{ => sof-xtos}/kd_integration/images/kd-state-diagram.pu (100%) rename architectures/firmware/{ => sof-xtos}/kd_integration/images/kd-timing-diagram.pu (100%) rename architectures/firmware/{ => sof-xtos}/kd_integration/index.rst (100%) rename architectures/firmware/{ => sof-xtos}/kd_integration/kd-integration.rst (100%) rename architectures/firmware/{ => sof-xtos}/mem-mgmt.rst (100%) rename architectures/firmware/{ => sof-xtos}/overview.rst (97%) rename architectures/firmware/{ => sof-xtos}/pipelines/images/ppl-new.pu (100%) rename architectures/firmware/{ => sof-xtos}/pipelines/images/ppl-op-downstream.pu (100%) rename architectures/firmware/{ => sof-xtos}/pipelines/images/ppl-operations.pu (100%) rename architectures/firmware/{ => sof-xtos}/pipelines/images/ppl-params.pu (100%) rename architectures/firmware/{ => sof-xtos}/pipelines/images/ppl-reset.pu (100%) rename architectures/firmware/{ => sof-xtos}/pipelines/images/ppl-struct.pu (100%) rename architectures/firmware/{ => sof-xtos}/pipelines/images/ppl-task.pu (100%) rename architectures/firmware/{ => sof-xtos}/pipelines/index.rst (100%) rename architectures/firmware/{ => sof-xtos}/pm-runtime/images/pm-dsp-core-idle.pu (100%) rename architectures/firmware/{ => sof-xtos}/pm-runtime/images/pm-dsp-core-init.pu (100%) rename architectures/firmware/{ => sof-xtos}/pm-runtime/index.rst (100%) rename architectures/firmware/{ => sof-xtos}/pm-runtime/intel/images/dsp-core-lps-cavs-d0-d0i3-d0.pu (100%) rename architectures/firmware/{ => sof-xtos}/pm-runtime/intel/pm-dsp-core-cavs.rst (100%) rename architectures/firmware/{ => sof-xtos}/pm-runtime/pm-dsp-core.rst (100%) rename architectures/firmware/{ => sof-xtos}/schedulers.rst (100%) diff --git a/architectures/firmware/index.rst b/architectures/firmware/index.rst index 92160766..80f8c91b 100644 --- a/architectures/firmware/index.rst +++ b/architectures/firmware/index.rst @@ -6,14 +6,7 @@ Firmware Architecture .. toctree:: :maxdepth: 1 - overview - mem-mgmt - pm-runtime/index - schedulers - drivers/index - components/index - pipelines/index - kd_integration/index + sof-xtos/index Vendor Specific Architecture Information ======================================== diff --git a/architectures/firmware/components/component-mgmt-api.rst b/architectures/firmware/sof-xtos/components/component-mgmt-api.rst similarity index 100% rename from architectures/firmware/components/component-mgmt-api.rst rename to architectures/firmware/sof-xtos/components/component-mgmt-api.rst diff --git a/architectures/firmware/components/component-overview.rst b/architectures/firmware/sof-xtos/components/component-overview.rst similarity index 100% rename from architectures/firmware/components/component-overview.rst rename to architectures/firmware/sof-xtos/components/component-overview.rst diff --git a/architectures/firmware/components/images/comp-dev-states.pu b/architectures/firmware/sof-xtos/components/images/comp-dev-states.pu similarity index 100% rename from architectures/firmware/components/images/comp-dev-states.pu rename to architectures/firmware/sof-xtos/components/images/comp-dev-states.pu diff --git a/architectures/firmware/components/images/comp-driver.pu b/architectures/firmware/sof-xtos/components/images/comp-driver.pu similarity index 100% rename from architectures/firmware/components/images/comp-driver.pu rename to architectures/firmware/sof-xtos/components/images/comp-driver.pu diff --git a/architectures/firmware/components/images/comp-new-flow.pu b/architectures/firmware/sof-xtos/components/images/comp-new-flow.pu similarity index 100% rename from architectures/firmware/components/images/comp-new-flow.pu rename to architectures/firmware/sof-xtos/components/images/comp-new-flow.pu diff --git a/architectures/firmware/components/images/component-mgmt-api.pu b/architectures/firmware/sof-xtos/components/images/component-mgmt-api.pu similarity index 100% rename from architectures/firmware/components/images/component-mgmt-api.pu rename to architectures/firmware/sof-xtos/components/images/component-mgmt-api.pu diff --git a/architectures/firmware/components/index.rst b/architectures/firmware/sof-xtos/components/index.rst similarity index 100% rename from architectures/firmware/components/index.rst rename to architectures/firmware/sof-xtos/components/index.rst diff --git a/architectures/firmware/drivers/dai/images/dai-ops.pu b/architectures/firmware/sof-xtos/drivers/dai/images/dai-ops.pu similarity index 100% rename from architectures/firmware/drivers/dai/images/dai-ops.pu rename to architectures/firmware/sof-xtos/drivers/dai/images/dai-ops.pu diff --git a/architectures/firmware/drivers/dai/images/dai-set-config.pu b/architectures/firmware/sof-xtos/drivers/dai/images/dai-set-config.pu similarity index 100% rename from architectures/firmware/drivers/dai/images/dai-set-config.pu rename to architectures/firmware/sof-xtos/drivers/dai/images/dai-set-config.pu diff --git a/architectures/firmware/drivers/dai/index.rst b/architectures/firmware/sof-xtos/drivers/dai/index.rst similarity index 100% rename from architectures/firmware/drivers/dai/index.rst rename to architectures/firmware/sof-xtos/drivers/dai/index.rst diff --git a/architectures/firmware/drivers/dma/images/dma-ops.pu b/architectures/firmware/sof-xtos/drivers/dma/images/dma-ops.pu similarity index 100% rename from architectures/firmware/drivers/dma/images/dma-ops.pu rename to architectures/firmware/sof-xtos/drivers/dma/images/dma-ops.pu diff --git a/architectures/firmware/drivers/dma/images/dma-transfer.pu b/architectures/firmware/sof-xtos/drivers/dma/images/dma-transfer.pu similarity index 100% rename from architectures/firmware/drivers/dma/images/dma-transfer.pu rename to architectures/firmware/sof-xtos/drivers/dma/images/dma-transfer.pu diff --git a/architectures/firmware/drivers/dma/index.rst b/architectures/firmware/sof-xtos/drivers/dma/index.rst similarity index 100% rename from architectures/firmware/drivers/dma/index.rst rename to architectures/firmware/sof-xtos/drivers/dma/index.rst diff --git a/architectures/firmware/drivers/dma/intel/hda-dma.rst b/architectures/firmware/sof-xtos/drivers/dma/intel/hda-dma.rst similarity index 100% rename from architectures/firmware/drivers/dma/intel/hda-dma.rst rename to architectures/firmware/sof-xtos/drivers/dma/intel/hda-dma.rst diff --git a/architectures/firmware/drivers/dma/intel/images/hda-host-output.pu b/architectures/firmware/sof-xtos/drivers/dma/intel/images/hda-host-output.pu similarity index 100% rename from architectures/firmware/drivers/dma/intel/images/hda-host-output.pu rename to architectures/firmware/sof-xtos/drivers/dma/intel/images/hda-host-output.pu diff --git a/architectures/firmware/drivers/dma/intel/images/hda-link.pu b/architectures/firmware/sof-xtos/drivers/dma/intel/images/hda-link.pu similarity index 100% rename from architectures/firmware/drivers/dma/intel/images/hda-link.pu rename to architectures/firmware/sof-xtos/drivers/dma/intel/images/hda-link.pu diff --git a/architectures/firmware/drivers/dma/intel/images/hda-start-flow.pu b/architectures/firmware/sof-xtos/drivers/dma/intel/images/hda-start-flow.pu similarity index 100% rename from architectures/firmware/drivers/dma/intel/images/hda-start-flow.pu rename to architectures/firmware/sof-xtos/drivers/dma/intel/images/hda-start-flow.pu diff --git a/architectures/firmware/drivers/dma/intel/images/hda-stop-flow.pu b/architectures/firmware/sof-xtos/drivers/dma/intel/images/hda-stop-flow.pu similarity index 100% rename from architectures/firmware/drivers/dma/intel/images/hda-stop-flow.pu rename to architectures/firmware/sof-xtos/drivers/dma/intel/images/hda-stop-flow.pu diff --git a/architectures/firmware/drivers/dma/intel/index.rst b/architectures/firmware/sof-xtos/drivers/dma/intel/index.rst similarity index 100% rename from architectures/firmware/drivers/dma/intel/index.rst rename to architectures/firmware/sof-xtos/drivers/dma/intel/index.rst diff --git a/architectures/firmware/drivers/images/device-disco.pu b/architectures/firmware/sof-xtos/drivers/images/device-disco.pu similarity index 100% rename from architectures/firmware/drivers/images/device-disco.pu rename to architectures/firmware/sof-xtos/drivers/images/device-disco.pu diff --git a/architectures/firmware/drivers/images/device-probe.pu b/architectures/firmware/sof-xtos/drivers/images/device-probe.pu similarity index 100% rename from architectures/firmware/drivers/images/device-probe.pu rename to architectures/firmware/sof-xtos/drivers/images/device-probe.pu diff --git a/architectures/firmware/drivers/images/device-remove.pu b/architectures/firmware/sof-xtos/drivers/images/device-remove.pu similarity index 100% rename from architectures/firmware/drivers/images/device-remove.pu rename to architectures/firmware/sof-xtos/drivers/images/device-remove.pu diff --git a/architectures/firmware/drivers/index.rst b/architectures/firmware/sof-xtos/drivers/index.rst similarity index 100% rename from architectures/firmware/drivers/index.rst rename to architectures/firmware/sof-xtos/drivers/index.rst diff --git a/architectures/firmware/images/edf-scheduler-deps.pu b/architectures/firmware/sof-xtos/images/edf-scheduler-deps.pu similarity index 100% rename from architectures/firmware/images/edf-scheduler-deps.pu rename to architectures/firmware/sof-xtos/images/edf-scheduler-deps.pu diff --git a/architectures/firmware/images/edf-scheduler-flow.pu b/architectures/firmware/sof-xtos/images/edf-scheduler-flow.pu similarity index 100% rename from architectures/firmware/images/edf-scheduler-flow.pu rename to architectures/firmware/sof-xtos/images/edf-scheduler-flow.pu diff --git a/architectures/images/fw-arch-diag.png b/architectures/firmware/sof-xtos/images/fw-arch-diag.png similarity index 100% rename from architectures/images/fw-arch-diag.png rename to architectures/firmware/sof-xtos/images/fw-arch-diag.png diff --git a/architectures/firmware/images/ll-scheduler-deps.pu b/architectures/firmware/sof-xtos/images/ll-scheduler-deps.pu similarity index 100% rename from architectures/firmware/images/ll-scheduler-deps.pu rename to architectures/firmware/sof-xtos/images/ll-scheduler-deps.pu diff --git a/architectures/firmware/images/ll-scheduler-flow.pu b/architectures/firmware/sof-xtos/images/ll-scheduler-flow.pu similarity index 100% rename from architectures/firmware/images/ll-scheduler-flow.pu rename to architectures/firmware/sof-xtos/images/ll-scheduler-flow.pu diff --git a/architectures/firmware/images/memory-zones.dot b/architectures/firmware/sof-xtos/images/memory-zones.dot similarity index 100% rename from architectures/firmware/images/memory-zones.dot rename to architectures/firmware/sof-xtos/images/memory-zones.dot diff --git a/architectures/firmware/images/runtime-zone.dot b/architectures/firmware/sof-xtos/images/runtime-zone.dot similarity index 100% rename from architectures/firmware/images/runtime-zone.dot rename to architectures/firmware/sof-xtos/images/runtime-zone.dot diff --git a/architectures/firmware/images/scheduler-ops.pu b/architectures/firmware/sof-xtos/images/scheduler-ops.pu similarity index 100% rename from architectures/firmware/images/scheduler-ops.pu rename to architectures/firmware/sof-xtos/images/scheduler-ops.pu diff --git a/architectures/firmware/images/system-zone.dot b/architectures/firmware/sof-xtos/images/system-zone.dot similarity index 100% rename from architectures/firmware/images/system-zone.dot rename to architectures/firmware/sof-xtos/images/system-zone.dot diff --git a/architectures/firmware/sof-xtos/index.rst b/architectures/firmware/sof-xtos/index.rst new file mode 100644 index 00000000..2909242d --- /dev/null +++ b/architectures/firmware/sof-xtos/index.rst @@ -0,0 +1,16 @@ +.. _sof-xtos: + +SOF with XTOS Architecture +########################## + +.. toctree:: + :maxdepth: 1 + + overview + mem-mgmt + pm-runtime/index + schedulers + drivers/index + components/index + pipelines/index + kd_integration/index diff --git a/architectures/firmware/kd_integration/images/kd-component-diagram.pu b/architectures/firmware/sof-xtos/kd_integration/images/kd-component-diagram.pu similarity index 100% rename from architectures/firmware/kd_integration/images/kd-component-diagram.pu rename to architectures/firmware/sof-xtos/kd_integration/images/kd-component-diagram.pu diff --git a/architectures/firmware/kd_integration/images/kd-e2e-sequence-diagram.pu b/architectures/firmware/sof-xtos/kd_integration/images/kd-e2e-sequence-diagram.pu similarity index 100% rename from architectures/firmware/kd_integration/images/kd-e2e-sequence-diagram.pu rename to architectures/firmware/sof-xtos/kd_integration/images/kd-e2e-sequence-diagram.pu diff --git a/architectures/firmware/kd_integration/images/kd-state-diagram.pu b/architectures/firmware/sof-xtos/kd_integration/images/kd-state-diagram.pu similarity index 100% rename from architectures/firmware/kd_integration/images/kd-state-diagram.pu rename to architectures/firmware/sof-xtos/kd_integration/images/kd-state-diagram.pu diff --git a/architectures/firmware/kd_integration/images/kd-timing-diagram.pu b/architectures/firmware/sof-xtos/kd_integration/images/kd-timing-diagram.pu similarity index 100% rename from architectures/firmware/kd_integration/images/kd-timing-diagram.pu rename to architectures/firmware/sof-xtos/kd_integration/images/kd-timing-diagram.pu diff --git a/architectures/firmware/kd_integration/index.rst b/architectures/firmware/sof-xtos/kd_integration/index.rst similarity index 100% rename from architectures/firmware/kd_integration/index.rst rename to architectures/firmware/sof-xtos/kd_integration/index.rst diff --git a/architectures/firmware/kd_integration/kd-integration.rst b/architectures/firmware/sof-xtos/kd_integration/kd-integration.rst similarity index 100% rename from architectures/firmware/kd_integration/kd-integration.rst rename to architectures/firmware/sof-xtos/kd_integration/kd-integration.rst diff --git a/architectures/firmware/mem-mgmt.rst b/architectures/firmware/sof-xtos/mem-mgmt.rst similarity index 100% rename from architectures/firmware/mem-mgmt.rst rename to architectures/firmware/sof-xtos/mem-mgmt.rst diff --git a/architectures/firmware/overview.rst b/architectures/firmware/sof-xtos/overview.rst similarity index 97% rename from architectures/firmware/overview.rst rename to architectures/firmware/sof-xtos/overview.rst index 4cbe26b5..a01dc1f0 100644 --- a/architectures/firmware/overview.rst +++ b/architectures/firmware/sof-xtos/overview.rst @@ -33,7 +33,7 @@ main sections: the audio components and pipelines to send/receive data to/from the host and external codecs. - .. figure:: ../images/fw-arch-diag.png + .. figure:: ./images/fw-arch-diag.png :align: center :alt: SOF Architecture :width: 800px diff --git a/architectures/firmware/pipelines/images/ppl-new.pu b/architectures/firmware/sof-xtos/pipelines/images/ppl-new.pu similarity index 100% rename from architectures/firmware/pipelines/images/ppl-new.pu rename to architectures/firmware/sof-xtos/pipelines/images/ppl-new.pu diff --git a/architectures/firmware/pipelines/images/ppl-op-downstream.pu b/architectures/firmware/sof-xtos/pipelines/images/ppl-op-downstream.pu similarity index 100% rename from architectures/firmware/pipelines/images/ppl-op-downstream.pu rename to architectures/firmware/sof-xtos/pipelines/images/ppl-op-downstream.pu diff --git a/architectures/firmware/pipelines/images/ppl-operations.pu b/architectures/firmware/sof-xtos/pipelines/images/ppl-operations.pu similarity index 100% rename from architectures/firmware/pipelines/images/ppl-operations.pu rename to architectures/firmware/sof-xtos/pipelines/images/ppl-operations.pu diff --git a/architectures/firmware/pipelines/images/ppl-params.pu b/architectures/firmware/sof-xtos/pipelines/images/ppl-params.pu similarity index 100% rename from architectures/firmware/pipelines/images/ppl-params.pu rename to architectures/firmware/sof-xtos/pipelines/images/ppl-params.pu diff --git a/architectures/firmware/pipelines/images/ppl-reset.pu b/architectures/firmware/sof-xtos/pipelines/images/ppl-reset.pu similarity index 100% rename from architectures/firmware/pipelines/images/ppl-reset.pu rename to architectures/firmware/sof-xtos/pipelines/images/ppl-reset.pu diff --git a/architectures/firmware/pipelines/images/ppl-struct.pu b/architectures/firmware/sof-xtos/pipelines/images/ppl-struct.pu similarity index 100% rename from architectures/firmware/pipelines/images/ppl-struct.pu rename to architectures/firmware/sof-xtos/pipelines/images/ppl-struct.pu diff --git a/architectures/firmware/pipelines/images/ppl-task.pu b/architectures/firmware/sof-xtos/pipelines/images/ppl-task.pu similarity index 100% rename from architectures/firmware/pipelines/images/ppl-task.pu rename to architectures/firmware/sof-xtos/pipelines/images/ppl-task.pu diff --git a/architectures/firmware/pipelines/index.rst b/architectures/firmware/sof-xtos/pipelines/index.rst similarity index 100% rename from architectures/firmware/pipelines/index.rst rename to architectures/firmware/sof-xtos/pipelines/index.rst diff --git a/architectures/firmware/pm-runtime/images/pm-dsp-core-idle.pu b/architectures/firmware/sof-xtos/pm-runtime/images/pm-dsp-core-idle.pu similarity index 100% rename from architectures/firmware/pm-runtime/images/pm-dsp-core-idle.pu rename to architectures/firmware/sof-xtos/pm-runtime/images/pm-dsp-core-idle.pu diff --git a/architectures/firmware/pm-runtime/images/pm-dsp-core-init.pu b/architectures/firmware/sof-xtos/pm-runtime/images/pm-dsp-core-init.pu similarity index 100% rename from architectures/firmware/pm-runtime/images/pm-dsp-core-init.pu rename to architectures/firmware/sof-xtos/pm-runtime/images/pm-dsp-core-init.pu diff --git a/architectures/firmware/pm-runtime/index.rst b/architectures/firmware/sof-xtos/pm-runtime/index.rst similarity index 100% rename from architectures/firmware/pm-runtime/index.rst rename to architectures/firmware/sof-xtos/pm-runtime/index.rst diff --git a/architectures/firmware/pm-runtime/intel/images/dsp-core-lps-cavs-d0-d0i3-d0.pu b/architectures/firmware/sof-xtos/pm-runtime/intel/images/dsp-core-lps-cavs-d0-d0i3-d0.pu similarity index 100% rename from architectures/firmware/pm-runtime/intel/images/dsp-core-lps-cavs-d0-d0i3-d0.pu rename to architectures/firmware/sof-xtos/pm-runtime/intel/images/dsp-core-lps-cavs-d0-d0i3-d0.pu diff --git a/architectures/firmware/pm-runtime/intel/pm-dsp-core-cavs.rst b/architectures/firmware/sof-xtos/pm-runtime/intel/pm-dsp-core-cavs.rst similarity index 100% rename from architectures/firmware/pm-runtime/intel/pm-dsp-core-cavs.rst rename to architectures/firmware/sof-xtos/pm-runtime/intel/pm-dsp-core-cavs.rst diff --git a/architectures/firmware/pm-runtime/pm-dsp-core.rst b/architectures/firmware/sof-xtos/pm-runtime/pm-dsp-core.rst similarity index 100% rename from architectures/firmware/pm-runtime/pm-dsp-core.rst rename to architectures/firmware/sof-xtos/pm-runtime/pm-dsp-core.rst diff --git a/architectures/firmware/schedulers.rst b/architectures/firmware/sof-xtos/schedulers.rst similarity index 100% rename from architectures/firmware/schedulers.rst rename to architectures/firmware/sof-xtos/schedulers.rst From f195f55a055f5ac6bc6b494f8654ff4998f6fbe1 Mon Sep 17 00:00:00 2001 From: Michal Wasko Date: Mon, 14 Mar 2022 13:48:16 +0100 Subject: [PATCH 189/290] arch: fw: sof-zephyr overview Add overview chapter with architecture diagram that present SOF-Zephyr integration Signed-off-by: Michal Wasko --- architectures/firmware/index.rst | 1 + architectures/firmware/sof-xtos/overview.rst | 8 ++-- .../sof-zephyr/images/overview_diagram.pu | 42 +++++++++++++++++++ architectures/firmware/sof-zephyr/index.rst | 9 ++++ .../firmware/sof-zephyr/overview.rst | 12 ++++++ 5 files changed, 68 insertions(+), 4 deletions(-) create mode 100644 architectures/firmware/sof-zephyr/images/overview_diagram.pu create mode 100644 architectures/firmware/sof-zephyr/index.rst create mode 100644 architectures/firmware/sof-zephyr/overview.rst diff --git a/architectures/firmware/index.rst b/architectures/firmware/index.rst index 80f8c91b..ba64102a 100644 --- a/architectures/firmware/index.rst +++ b/architectures/firmware/index.rst @@ -7,6 +7,7 @@ Firmware Architecture :maxdepth: 1 sof-xtos/index + sof-zephyr/index Vendor Specific Architecture Information ======================================== diff --git a/architectures/firmware/sof-xtos/overview.rst b/architectures/firmware/sof-xtos/overview.rst index a01dc1f0..94b44a8a 100644 --- a/architectures/firmware/sof-xtos/overview.rst +++ b/architectures/firmware/sof-xtos/overview.rst @@ -1,9 +1,9 @@ -.. _overview: +.. _sof-legacy-overview: Overview ########## -Currently SOF has support for the Cadence Xtensa DSP architecture in UP and SMP +Currently SOF has support for the Cadence Xtensa DSP architecture in UP and SMP modes in the upstream code base. The diagram below shows the high-level firmware architecture with the @@ -41,6 +41,6 @@ main sections: `Sound Open Firmware Architecture using Intel Bay Trail Platform` -Each section above is well insulated from the other sections by partitioning -code into separate directories and by using DSP and platform agnostic generic +Each section above is well insulated from the other sections by partitioning +code into separate directories and by using DSP and platform agnostic generic APIs for orchestration between the sections. diff --git a/architectures/firmware/sof-zephyr/images/overview_diagram.pu b/architectures/firmware/sof-zephyr/images/overview_diagram.pu new file mode 100644 index 00000000..8ee7f089 --- /dev/null +++ b/architectures/firmware/sof-zephyr/images/overview_diagram.pu @@ -0,0 +1,42 @@ +@startuml +allowmixing + +scale max 1280 width + +package "SOF" { + + package "Application layer - user space" as APPLICATION_LAYER { + component "3rd party algorithms" - private" as 3RD_PARTY_ALGOS + component "Loadable libraries" as LOADABLE_COMPONENTS + component "Built-in Processing components" as BUILTIN_COMPONENTS + + BUILTIN_COMPONENTS -[hidden]right- LOADABLE_COMPONENTS + LOADABLE_COMPONENTS -[hidden]right- 3RD_PARTY_ALGOS + } + + package "Kernel space" { + + package "Media Processing Pipelines layer - kernel extension" as KERNEL_EXTENSION { + component "Communication" as COMMUNICATION + component "Pipelines and Component Infrastructure" as PIPELINE_COMPONENT_INFRASTRUCTURE + component "AVS Scheduling" as AVS_SCHEDULERS + + COMMUNICATION -[hidden]right- PIPELINE_COMPONENT_INFRASTRUCTURE + PIPELINE_COMPONENT_INFRASTRUCTURE -[hidden]right- AVS_SCHEDULERS + } + + package "Zephyr RTOS layer" as RTOS { + component "Services" as SERVICES + component "SoC HAL" as SOC + component "Drivers" as DRIVERS + + SERVICES --[hidden]right-- SOC + SOC --[hidden]right-- DRIVERS + } + + APPLICATION_LAYER -[hidden]down- KERNEL_EXTENSION + KERNEL_EXTENSION -[hidden]down- RTOS + } +} + +@enduml diff --git a/architectures/firmware/sof-zephyr/index.rst b/architectures/firmware/sof-zephyr/index.rst new file mode 100644 index 00000000..66e2132e --- /dev/null +++ b/architectures/firmware/sof-zephyr/index.rst @@ -0,0 +1,9 @@ +.. _sof-zephyr: + +SOF with Zephyr Architecture +############################ + +.. toctree:: + :maxdepth: 1 + + overview diff --git a/architectures/firmware/sof-zephyr/overview.rst b/architectures/firmware/sof-zephyr/overview.rst new file mode 100644 index 00000000..e9969e29 --- /dev/null +++ b/architectures/firmware/sof-zephyr/overview.rst @@ -0,0 +1,12 @@ +.. _sof-zephyr-overview: + +Overview +######## + +New SOF firmware architecture is based on Zephyr RTOS and introduce new IPC4 +Host protocol ABI. In result FW has been re-organized into layers. The +interaction between the components across the layers is limited to the +internally defined interfaces. + +.. uml:: images/overview_diagram.pu + :caption: SOF with Zephyr Architecture overview From de1a1222c09e080bf70cc560a8a70c4583f7745d Mon Sep 17 00:00:00 2001 From: Michal Wasko Date: Tue, 15 Mar 2022 14:54:43 +0100 Subject: [PATCH 190/290] arch: fw: app layer description Application layer components description in SOF with Zephyr architecture Signed-off-by: Michal Wasko --- .../app_layer/images/app_layer_diagram.pu | 68 +++++++++++++++++++ .../firmware/sof-zephyr/app_layer/index.rst | 40 +++++++++++ architectures/firmware/sof-zephyr/index.rst | 1 + 3 files changed, 109 insertions(+) create mode 100644 architectures/firmware/sof-zephyr/app_layer/images/app_layer_diagram.pu create mode 100644 architectures/firmware/sof-zephyr/app_layer/index.rst diff --git a/architectures/firmware/sof-zephyr/app_layer/images/app_layer_diagram.pu b/architectures/firmware/sof-zephyr/app_layer/images/app_layer_diagram.pu new file mode 100644 index 00000000..a3581f25 --- /dev/null +++ b/architectures/firmware/sof-zephyr/app_layer/images/app_layer_diagram.pu @@ -0,0 +1,68 @@ +@startuml +allowmixing + +scale max 1280 width + +package "SOF" { + + package "Application layer" as APP_CUSTOMIZATION { + + package "Example Loadable Components" as LOADABLE_COMPONENTS { + component "3rd Party Post-Processing" as PROCESSING_3RD_PARTY + component "WoV" as WOV_MODULE + component "ACA" as ACA_MODULE + component "Other modules" as OTHER_MODULES + + PROCESSING_3RD_PARTY -[hidden]right- WOV_MODULE + WOV_MODULE -[hidden]right- ACA_MODULE + ACA_MODULE -[hidden]right- OTHER_MODULES + } + + package "Built-in Components" as BUILTIN_COMPONENTS { + component "Copier" as COPIER + component "SRC" as SRC + component "Mixers" as MIXERS + component "History Buffer/KPB" as HISTORY_BUFFER + component "Probe" as PROBE + + COPIER -[hidden]right- SRC + SRC -[hidden]right- MIXERS + MIXERS -[hidden]right- HISTORY_BUFFER + HISTORY_BUFFER -[hidden]right- PROBE + } + + BUILTIN_COMPONENTS -[hidden]down- LOADABLE_COMPONENTS + } + + package "System Services" as SYS_SERVICES { + + interface "System Services" as SS + + package "Media Processing Pipelines Services extension" as KERNEL_EXTENSION { + component "Communication" as COMMUNICATION + component "Pipelines and Component Infrastructure" as PIPELINE_COMPONENT_INFRASTRUCTURE + component "AVS Scheduling" as AVS_SCHEDULERS + + COMMUNICATION -[hidden]right- PIPELINE_COMPONENT_INFRASTRUCTURE + PIPELINE_COMPONENT_INFRASTRUCTURE -[hidden]right- AVS_SCHEDULERS + } + + package "Zephyr" as ZEPHYR { + component "Services" as SERVICES + } + + SS -[hidden]down- KERNEL_EXTENSION + SS -[hidden]down- ZEPHYR + + KERNEL_EXTENSION -[hidden]right- ZEPHYR + } + + APP_CUSTOMIZATION -[hidden]down- SYS_SERVICES + BUILTIN_COMPONENTS .down. SS + PROCESSING_3RD_PARTY .down. SS + WOV_MODULE .down. SS + ACA_MODULE .down. SS + OTHER_MODULES .down. SS +} + +@enduml \ No newline at end of file diff --git a/architectures/firmware/sof-zephyr/app_layer/index.rst b/architectures/firmware/sof-zephyr/app_layer/index.rst new file mode 100644 index 00000000..0ee0f56e --- /dev/null +++ b/architectures/firmware/sof-zephyr/app_layer/index.rst @@ -0,0 +1,40 @@ +.. _app_layer: + +Application Layer +################# + +Application Layer represents the built-in FW processing components, loadable FW +components and example templates with application libraries required for +components integration. Application layer content is assumed to be open source +and only proprietary 3rd party components should remain private. + +.. uml:: images/app_layer_diagram.pu + :caption: Application Layer + +Components in Application Layer +******************************* + +The built-in components are built together with base firmware and they have +direct access to all firmware drivers and service APIs. When built-in module +is enabled in configuration, it is guaranteed to exist in firmware binary. + +The loadable components are built separately from base firmware and they are +loaded dynamically as a separate binary, depending on the host audio +configuration. + +All the application layer components access base firmware services via System +Services ABI. + +**NOTE:** The built-in components are utility components provided by base +firmware/kernel. + +Examples of built-in components: + +* Audio built-in components: Copiers, Mixers, Volume, SRC, etc. + +Probe +===== + +The probe module is special module in FW infrastructure that allows to inject +or extract data from a specified probe point. The traditional client +platforms use HDA DMAs to transfer data in and out of such module. diff --git a/architectures/firmware/sof-zephyr/index.rst b/architectures/firmware/sof-zephyr/index.rst index 66e2132e..390e50ba 100644 --- a/architectures/firmware/sof-zephyr/index.rst +++ b/architectures/firmware/sof-zephyr/index.rst @@ -7,3 +7,4 @@ SOF with Zephyr Architecture :maxdepth: 1 overview + app_layer/index From 0d0516199dfa327c6c8302f52683b6ad8f7529e4 Mon Sep 17 00:00:00 2001 From: Michal Wasko Date: Mon, 21 Mar 2022 16:32:18 +0100 Subject: [PATCH 191/290] arch: fw: mpp layer description Media Processing Pipelines layer diagram and descripion. Signed-off-by: Michal Wasko --- architectures/firmware/sof-zephyr/index.rst | 1 + .../mpp_layer/images/mpp_layer_diagram.pu | 55 +++++++++++ .../firmware/sof-zephyr/mpp_layer/index.rst | 13 +++ .../sof-zephyr/mpp_layer/mpp_overview.rst | 94 +++++++++++++++++++ 4 files changed, 163 insertions(+) create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/images/mpp_layer_diagram.pu create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/index.rst create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/mpp_overview.rst diff --git a/architectures/firmware/sof-zephyr/index.rst b/architectures/firmware/sof-zephyr/index.rst index 390e50ba..e4b3f29c 100644 --- a/architectures/firmware/sof-zephyr/index.rst +++ b/architectures/firmware/sof-zephyr/index.rst @@ -8,3 +8,4 @@ SOF with Zephyr Architecture overview app_layer/index + mpp_layer/index diff --git a/architectures/firmware/sof-zephyr/mpp_layer/images/mpp_layer_diagram.pu b/architectures/firmware/sof-zephyr/mpp_layer/images/mpp_layer_diagram.pu new file mode 100644 index 00000000..24f8c175 --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/images/mpp_layer_diagram.pu @@ -0,0 +1,55 @@ +@startuml + +allowmixing + +scale max 1024 width + +package "SOF" { + + package "Media Processing Pipelines layer" as MEDIA_PROCESSING_PIPELINES { + package "MPP Scheduling" as MPP_SCHEDULING { + component "LL Tasks" as LL_TASKS + component "DP Tasks" as DP_TASKS + + DP_TASKS -[hidden]down- LL_TASKS + } + + package "Communication" as COMMUNICATION { + component "IPC Message Processing and common command definitions" as IPC_MESSAGE_PROCESSING + component "Async Messaging" as ASYNC_MESSAGING + + IPC_MESSAGE_PROCESSING -[hidden]right- ASYNC_MESSAGING + } + + package "Pipeline/Component Infrastructure" as PIPELINE_COMPONENT_INFRASTRUCTURE { + component "Pipeline Management" as PIPELINE_MANAGEMENT + component "Host/DAI Gateways" as HOST_DAI_GATEWAYS + component "Processing Component Management" as PROCESSING_COMPONENT_MANAGEMENT + + PIPELINE_MANAGEMENT -[hidden]right- HOST_DAI_GATEWAYS + HOST_DAI_GATEWAYS -[hidden]right- PROCESSING_COMPONENT_MANAGEMENT + } + + COMMUNICATION -[hidden]down- PIPELINE_COMPONENT_INFRASTRUCTURE + COMMUNICATION -[hidden]right- MPP_SCHEDULING + } + + package "Zephyr" as ZEPHYR { + interface "Zephyr Services, SoC HAL and Driver Interfaces" as SS + + component "SoC HAL" as SOC + component "Drivers" as DRIVERS + component "XTHAL" as XTHAL + component "Services" as SERVICES + + SS -[hidden]down- SERVICES + SERVICES -[hidden]right- SOC + SOC -[hidden]right- DRIVERS + DRIVERS -[hidden]right- XTHAL + } + + MEDIA_PROCESSING_PIPELINES -[hidden]down- ZEPHYR + PIPELINE_COMPONENT_INFRASTRUCTURE -[hidden]down- ZEPHYR +} + +@enduml diff --git a/architectures/firmware/sof-zephyr/mpp_layer/index.rst b/architectures/firmware/sof-zephyr/mpp_layer/index.rst new file mode 100644 index 00000000..ddcd77f2 --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/index.rst @@ -0,0 +1,13 @@ +.. _mpp_layer: + +Media Processing Pipelines Layer +################################ + +The Media Processing Pipelines (MPP) is a FW infrastructure layer independent to +the HW. The MPP components serve as kernel services extension that is available +to the Application layer. + +.. toctree:: + :maxdepth: 1 + + mpp_overview diff --git a/architectures/firmware/sof-zephyr/mpp_layer/mpp_overview.rst b/architectures/firmware/sof-zephyr/mpp_layer/mpp_overview.rst new file mode 100644 index 00000000..955a3781 --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/mpp_overview.rst @@ -0,0 +1,94 @@ +.. _mpp_layer_overview: + +Media Processing Pipelines Overview +################################### + +The Media Processing Pipelines (MPP) layer role is to enable SOF specific use +cases that are not supported directly by Zephyr. The MPP is responsible for host +communication, tasks scheduling, pipeline and component management. + +.. uml:: images/mpp_layer_diagram.pu + :caption: Media Processing Pipelines Layer diagram + +Services in Media Processing Pipelines Layer +******************************************** + +Gateways +======== + +The gateways are a key element in SOF data exchange with host, external audio +peripherals and internally between firmware components. They serve as an +abstraction layer for multiple data protocols. + +The typical audio stream (chain of pipelines) starts and ends with I/O gateway. +I/O gateway represents a sink or a source interface that can be read or written +via DMA operations on I/O FIFO (i.e. DMIC, SNDW, etc.) or directly via memory +operations (i.e. memory buffers of IPC Gateway). Host Gateway is unique as it +exposes interface endpoint to the Host driver. + +The stream audio gateways are created as a part of Copier component +configuration. + +.. TODO: Add link to Copier detailed description + +Examples of gateways: + +- DMIC Gateway, +- SoundWire Gateway, +- I2S Gateway, +- HD/A Gateway, +- IPC Gateway, + +.. TODO: Add link to Gateways detailed specification. + +*NOTE:* Not all I/O gateways must be available in all configurations. + +Pipeline Management +=================== + +The Pipeline Management is a host IPC driven service that is used to: + +- create / delete pipeline +- switch pipeline state +- create pipeline processing tasks +- allocate pipeline buffers memory + +.. TODO: Add link to Pipeline Management IPC interface. + +Processing Component Management +=============================== + +Processing Component Management is driven by host IPC requests. It is used to: + +- instantiate / delete components +- configure components +- bind / unbind components into processing paths +- load components into ADSP memory + +.. TODO: Add link to Component Management IPC interface. + +Asynchronous Messaging +====================== + +Asynchronous Messaging Service (AMS) provides functionality to: + +- send asynchronous messages to firmware components or host, +- broadcast messages to multiple consumers, +- asynchronous message exchange between components running on different cores + +.. TODO: Add link to Asynchronous Messaging Service detailed description + +MPP Scheduling +============== + +MPP Scheduling is dedicated to support Media Processing Pipelines services tasks +scheduling. It exposes SOF specific interface that is implemented on top of +Zephyr scheduling API. + +MPP Scheduling features: + +- Low Latency tasks scheduling, +- Data Processing tasks scheduling, +- Tasks with budget scheduling + +.. TODO: Add link to MPP Scheduling detailed description From c84d15fe41d6abf1b46a4a2cc37251e2e799252c Mon Sep 17 00:00:00 2001 From: Michal Wasko Date: Tue, 22 Mar 2022 17:06:56 +0100 Subject: [PATCH 192/290] arch: fw: zephyr based kernel description Add RTOS layer chapter with kernel description that include low level drivers, services, SoC HAL, and overview diagrams. Signed-off-by: Michal Wasko --- architectures/firmware/sof-zephyr/index.rst | 1 + .../rtos_layer/images/kernel_services.pu | 57 +++ .../images/zephyr_kernel_diagram.pu | 124 ++++++ .../firmware/sof-zephyr/rtos_layer/index.rst | 13 + .../rtos_layer/zephyr_kernel_overview.rst | 372 ++++++++++++++++++ 5 files changed, 567 insertions(+) create mode 100644 architectures/firmware/sof-zephyr/rtos_layer/images/kernel_services.pu create mode 100644 architectures/firmware/sof-zephyr/rtos_layer/images/zephyr_kernel_diagram.pu create mode 100644 architectures/firmware/sof-zephyr/rtos_layer/index.rst create mode 100644 architectures/firmware/sof-zephyr/rtos_layer/zephyr_kernel_overview.rst diff --git a/architectures/firmware/sof-zephyr/index.rst b/architectures/firmware/sof-zephyr/index.rst index e4b3f29c..c3f5df01 100644 --- a/architectures/firmware/sof-zephyr/index.rst +++ b/architectures/firmware/sof-zephyr/index.rst @@ -9,3 +9,4 @@ SOF with Zephyr Architecture overview app_layer/index mpp_layer/index + rtos_layer/index diff --git a/architectures/firmware/sof-zephyr/rtos_layer/images/kernel_services.pu b/architectures/firmware/sof-zephyr/rtos_layer/images/kernel_services.pu new file mode 100644 index 00000000..f1d19987 --- /dev/null +++ b/architectures/firmware/sof-zephyr/rtos_layer/images/kernel_services.pu @@ -0,0 +1,57 @@ +@startuml +allowmixing + +scale max 1280 width + +package "SOF" { + package "Kernel Infrastructure" { + interface "Zephyr System Services" as SS + + package "Services" { + component "Memory Manager" as MEMORY_MANAGER + component "Power Manager" as POWER_MANAGER + component "IPC/IDC" as IXC + component "Logging" as LOGGING + component "Debug" as DEBUG + component "Interrupt Handler" as INTERRUPT_HANDLER + } + + SS .down. MEMORY_MANAGER + SS .down. POWER_MANAGER + SS .down. IXC + SS .down. LOGGING + SS .down. DEBUG + SS .down. INTERRUPT_HANDLER + } + + package "Kernel Extension" { + interface "Extended System Services" as ESS + + component "AVS Scheduling" as AVS_Scheduling + + package "Extended Services" as EXTENDED_SERVICES { + component "Firmware Manager" as FIRMWARE_MANAGEMENT + component "Pipeline Management" as PIPELINE_MANAGEMENT + component "Async Messaging" as ASYNC_MESSAGING + component "Processing Component Management" as COMPONENT_MANAGEMENT + component "IPC Message Processing" as IPC_MESSAGE_PROCESSING + } + + ESS .down. FIRMWARE_MANAGEMENT + ESS .down. PIPELINE_MANAGEMENT + ESS .down. ASYNC_MESSAGING + ESS .down. IPC_MESSAGE_PROCESSING + ESS .down. COMPONENT_MANAGEMENT + + AVS_Scheduling -[hidden]down- EXTENDED_SERVICES + } + + package "Loadable modules" { + component "WoV" as WOV + + WOV .down. SS + WOV .down. ESS + } +} + +@enduml \ No newline at end of file diff --git a/architectures/firmware/sof-zephyr/rtos_layer/images/zephyr_kernel_diagram.pu b/architectures/firmware/sof-zephyr/rtos_layer/images/zephyr_kernel_diagram.pu new file mode 100644 index 00000000..f7bf622a --- /dev/null +++ b/architectures/firmware/sof-zephyr/rtos_layer/images/zephyr_kernel_diagram.pu @@ -0,0 +1,124 @@ +@startuml +allowmixing + +scale max 1280 width + +package "Kernel space" { + + package "Media Processing Pipelines - kernel extension" as MPP_KERNEL_EXTENSION { + interface "Extended System Services" as ESS + + component "Firmware Manager" as FIRMWARE_MANAGER + + package "Communication" as COMMUNICATION { + component "IPC Message Processing" as IPC_MESSAGE_PROCESSING + component "Async Messaging" as ASYNC_MESSAGING + + IPC_MESSAGE_PROCESSING -[hidden]right- ASYNC_MESSAGING + } + + package "Pipeline/Component Infrastructure" as PIPELINE_COMPONENT_INFRASTRUCTURE { + component "Pipeline Management" as PIPELINE_MANAGEMENT + component "Host/DAI Gateways" as HOST_DAI_GATEWAYS + component "Processing Component Management" as PROCESSING_COMPONENT_MANAGEMENT + + PIPELINE_MANAGEMENT -[hidden]right- HOST_DAI_GATEWAYS + HOST_DAI_GATEWAYS -[hidden]right- PROCESSING_COMPONENT_MANAGEMENT + } + + package "AVS Scheduling" as AVS_SCHEDULING { + component "Data Processing (DP) Tasks (EDF based)" as DP_TASKS + component "Low Latency (LL) Tasks" as LL_TASKS + + DP_TASKS -[hidden]right- LL_TASKS + } + + FIRMWARE_MANAGER -[hidden]right- PIPELINE_COMPONENT_INFRASTRUCTURE + FIRMWARE_MANAGER -[hidden]down- COMMUNICATION + COMMUNICATION -[hidden]right- AVS_SCHEDULING + + ESS -[hidden]down- FIRMWARE_MANAGER + ESS -[hidden]down- PIPELINE_COMPONENT_INFRASTRUCTURE + } + + package "Zephyr" as Zephyr_RTOS { + interface "Zephyr System Services" as SS + + package "Schedulers" as SCHEDULERS { + component "RTOS Scheduling" as RTOS_SCHEDULER + } + + package "Services" as SERVICES { + component "Memory Manager" as MEMORY_MANAGER + component "Power Manager" as POWER_MANAGER + component "IPC/IDC" as IXC + component "Logging" as LOGGING + component "Debug" as DEBUG + component "Timer Manager" as TIMER_MANAGER + component "Interrupt Handler" as INTERRUPT_HANDLER + + MEMORY_MANAGER -[hidden]right- POWER_MANAGER + POWER_MANAGER -[hidden]right- IXC + IXC -[hidden]down- LOGGING + LOGGING -[hidden]right- TIMER_MANAGER + TIMER_MANAGER -[hidden]right- INTERRUPT_HANDLER + } + + package "SoC HAL" as SOC { + component "OEM SoC 1" as SOC_1 + component "OEM SoC 2" as SOC_2 + component "Other SoCs" as OTHER_SOCS + + SOC_1 -[hidden]right- SOC_2 + SOC_2 -[hidden]right- OTHER_SOCS + } + + package "Drivers" as DRIVERS { + package "Common Drivers" as COMMON_DRIVERS { + component "GPDMA" as GPDMA + component "Timer" as TIMER + component "SHA-384" as SHA384 + component "Watchdog" as WATCHDOG + component "IPC" as IPC + component "IDC" as IDC + } + + package "Audio Drivers" as AUDIO_DRIVERS{ + component "DMIC" as DMIC + component "I2S" as I2S + component "SDW" as SDW + component "HDA" as HDA + + DMIC -[hidden]right- I2S + I2S -[hidden]right- SDW + SDW -[hidden]right- HDA + } + + package "Sensing Drivers" as SENSING_DRIVERS { + component "I2C" as I2C + component "GPIO" as GPIO + component "I3C" as I3C + component "SPI" as SPI + component "UART" as UART + + I2C -[hidden]right- GPIO + GPIO -[hidden]right- I3C + I3C -[hidden]right- SPI + SPI -[hidden]right- UART + } + } + + component "XTHAL" as XTHAL + + SS -[hidden]down- SCHEDULERS + SS -[hidden]down- SERVICES + SCHEDULERS -[hidden]right- SERVICES + SERVICES -[hidden]right- SOC + SERVICES --[hidden]down-- DRIVERS + DRIVERS -[hidden]down- XTHAL + } + + MPP_KERNEL_EXTENSION --[hidden]down-- Zephyr_RTOS +} + +@enduml diff --git a/architectures/firmware/sof-zephyr/rtos_layer/index.rst b/architectures/firmware/sof-zephyr/rtos_layer/index.rst new file mode 100644 index 00000000..80efe77c --- /dev/null +++ b/architectures/firmware/sof-zephyr/rtos_layer/index.rst @@ -0,0 +1,13 @@ +.. _rtos_layer: + +RTOS Layer Infrastructure +######################### + +The RTOS layer is based on Zephyr that provide generic and scalable open source +solution with options for SW partitioning of product subsystems to run audio +workloads. + +.. toctree:: + :maxdepth: 1 + + zephyr_kernel_overview diff --git a/architectures/firmware/sof-zephyr/rtos_layer/zephyr_kernel_overview.rst b/architectures/firmware/sof-zephyr/rtos_layer/zephyr_kernel_overview.rst new file mode 100644 index 00000000..b6d0e3fb --- /dev/null +++ b/architectures/firmware/sof-zephyr/rtos_layer/zephyr_kernel_overview.rst @@ -0,0 +1,372 @@ +.. _kernel_overview: + +Zephyr based kernel +################### + +Zephyr has been introduced as an IP agnostic solution that replaced existing SOF +audio specific kernel. The Zephyr base kernel has been complemented with SOF Low +Level Drivers, SoC HAL and kernel extensions. The new solution continues +scalable kernel concept and it serves as a generic part of infrastructure that +can be statically and dynamically customized based on usage, compute, and memory +constrains, HW configuration etc. + +As a result of the kernel customization, a firmware infrastructure is produced. +This firmware infrastructure can run on a given processor type and it is tuned +for specified usage. + +For more Zephyr kernel details, see `Zephyr Introduction +documentation `__ + +The Zephyr based kernel consists of the following components: + +- Hardware integration layer: XTHAL, +- Low Level Drivers, + + - DMIC, + - I2S, + - SNDW, + - GPIO, + - I2C, + - I3C, + - timers, + - GPDMA, + - IDC, + - IPC, + - watchdog, + - etc. + +- SoC HAL, + + - OEM SoC specific code, + +- Services: shared resource services, communication services, memory manager, + power manager, interrupt manager, system service, etc. +- Kernel extensions: + + - AVS schedulers, + - Firmware Manager, + - Media Processing Pipeline Components, + +The Zephyr base kernel expectations: + +- it can scale down to meet all KPIs via static and dynamic scaling options, +- Zephyr itself is IP agnostic and shared across other SW and FW projects, +- it is available and maintain under open source license, + +.. uml:: images/zephyr_kernel_diagram.pu + :caption: Zephyr Kernel diagram + +Scaling Options +''''''''''''''' + +Zephyr kernel offers scaling options to adjust to selected HW configuration, +scale down to meet aggressive KPIs on a given platform, scale up to meet +functional requirements. + +The scaling is achieved in two ways: + +- static, kernel components can be selectively enabled in the build process + + - Drivers selected depending on SoC Configuration + - Services and execution frameworks chosen in Zephyr + +- dynamic, not used parts can be unloaded and saved in "backup storage" memory, + that typically has large capacity and high access latency. They will be + loaded again once a specific event will happen + + - It is only applicable to SoCs that support it. + - It is achieved via one of the following mechanisms: + + - Firmware Paging (if present) - Only currently executing modules are in + SRAM. + - Split Firmware into modules - Modules are loaded from "backup storage" + or unloaded on explicit request. No runtime dynamism. + +Handling Project Configuration +'''''''''''''''''''''''''''''' + +Zephyr is prepared to be configured via device tree that describe given SoC +board audio hardware configuration. + +A SoC board device tree allows configuring: + +* HW configuration + + * number of HP DSP cores, + * types of memories available per cores, + * supported clocks, + * number of I/Os, + * number of IPC and IDC interfaces for DSP cores, + * etc. + + * DSP memory space, + * IPC mailbox address, + * etc. + +Low Level Drivers +''''''''''''''''' + +SOF is capable to support hardware with several audio I/Os, sensor I/Os, DSP +accelerators and DMAs which count can be customized per architcture. + +HW resources with low level drivers: + +* Audio I/Os: I2S, DMIC, SNDW, HD/A, +* Sensor I/Os: I2C, I3C, GPIO, UART, SPI, ADC, PWM, +* Common resources: HP GPDMA, IPC, IDC, Timers, SHA-384, Watchdog + +**NOTE:** Not all I/Os are supported in each SoC board. + +.. TODO: add link to supported audio architectures + +Zephyr based firmware provides low level drivers for all these resources. A +specific driver can be enabled during build process. + +SoC HAL +''''''' + +The SoC HAL include implementation and configuration details specific for +selected SoC architecture. The SoC HAL abstraction allow to seamlesly switch +between target SoC configuration builds. + +More details can be found in Zephyr documentation: + +* `Zephyr Board Porting Guide `__ +* `Zephyr Architecture Porting Guide `__ + +Services +'''''''' + +.. uml:: images/kernel_services.pu + :caption: Example of kernel services + +The base Zephyr services provide generic system management functionality for +memory, interrupts, autonomous power control (clock and power gating, clock +management). + +The SOF specific functionality is exposed in a form of an extended kernel +services. The extended services utilize Zephyr base services infrastructure and +low level drivers to supply user space interface for the firmware application +layer components. The user space separation from hardware and low level drivers +significantly increase the firmware security and stability. + +Firmware Management +------------------- + +The firmware manager is a core service that is responsible for: + +- reading HW capabilities (number of cores, memory available, etc.), +- firmware initialization, +- instantiation and initialization of Low Level drivers for the existing HW + components, + + - memory type drivers initialization with size read form capability + registers + - audio drivers for supported interfaces + +- instantiate and initialize Extended Kernel Services + + - component manager + - pipeline manager + - IPC/IDC communication service + - async messaging service + - debug service + +.. TODO: add other components that require initialization by the firmware manager + +Interrupt Management +-------------------- + +The interrupt handler service allows to: + +- enable and disable an interrupt for DSP core, +- register a callback that will be called once a specified interrupt occur, + +For more details, see `Zephyr Interrupts +documentation `__ + +Memory Management +----------------- + +The Memory Manager provides a service to other FW components to allocate a block +out of available memory pools, it provides high level API, scans for unused +memory areas, handles physical memory defragmentation, prefetch and cache +policies. Most of the memory is expected to be paged. + +All allocation requests refer to virtual memory address space, which shall be +continuous. This also applies to DMA buffer allocations, where continuous memory +is guaranteed by either continuous physical memory or VA/PA translation. + +The map of available memory resources is passed to the Memory Manager during +initialization of Memory Manager via firmware infrastructure. + +For more details, see `Zephyr Memory Management +documentation `__. + +Power Management +---------------- + +The power management behavior highly depends on platform that firmware runs on, +and it can be configured during build time. There are platforms that only allow +clock gating and power gating is not applicable. + +The power management interface provides the following functionality: + +- allow and prevent power gating, +- allow and prevent clock gating, +- allow and prevent slower clock, +- allow and prevent XTAL shutdown, + +In all cases, the implementation relies on atomic counter which is incremented +every time when prevent function is called and decremented when allow function +is called. + +.. TODO: Add link to SOF Power Management detailed description with flows + +`Zephyr Power Management documentation +`__. + +IPC and IDC Service +------------------- + +The IPC and IDC Service provides communication channel over IPC or IDC. IPCs are +used for the external communication with Host, other processors within SoC or +other subsystems within PCH. IDCs are used for the internal communication +between processors within SOF subsystem. + +The introduction of SOF with Zephyr is followed with new IPC4 interface and +message formats that replaced IPC3. + +The following types of sequences are supported: + +- request-response initiated by Host, + + - it is synchronous sequence, + - long-running operations shall queue request and send response immediately. + The actual completion information should be sent via one-way asynchronous + notification, + +- one-way asynchronous notification, + +.. TODO: Add link to Communication section (when ready) + +Debugging +--------- + +The Zephyr based kernel provides a few services that helps with debugging FW. + +Logging +~~~~~~~ + +The Logger Service provides a lightweight mechanism to push log entries to all +firmware modules that are based on Zephyr logging infrastructure. + +It is a very useful mechanism to do a first level of debugging. + +.. TODO: Add link to Logger Service section (when ready) +.. TODO: Add link to SOF Enable Logs interface +.. TODO: Add link to SOF status and error codes registers + +Zephyr related documentation: + +- `Zephyr + Logging `__ + +Probes +~~~~~~ + +SOF supports injection and extraction probes. The probes are mainly used to +extract audio data from queues between components. + +The other probe use cases include: + +- injection of audio data to a component input queue - useful during testing + and debugging, +- injection of data to internal probes, +- extraction of data from internal probes i.e. internal component states, + intermediate data, debug information, +- logging - probes can be used as transport for firmware logs, + +.. TODO: Add link to Probe configuration interface (when ready) + +Performance Measurements +~~~~~~~~~~~~~~~~~~~~~~~~ + +The firmware infrastructures support performance measurements to collect +information about DSP cycles or amount of data moved via interfaces. + +.. TODO: Add link to Performance Measurements State firmware interface +.. TODO: Add link to firmware Global Performance Data description + + +Telemetry +~~~~~~~~~ + +Firmware infrastructure supports collection of telemetry events which then can +be read by the Host Software. The modules running in FW infrastructure can push +telemetry events via System Services. + +If the telemetry collection is started, the telemetry events will be written to +a common circular buffer. + +If the telemetry collection is stopped/disabled, the telemetry events will be +dropped at telemetry service level and they will not be written to the telemetry +circular buffer. During transition from started to stopped state, the telemetry +events that are already in the circular buffer will be dropped. + +.. TODO: Add link to SOF Telemetry interface documentation + +.. _Schedulers: + +Schedulers +---------- + +The scheduling method depends on compute and memory available for firmware +running on processor as well as type of workloads executed on given domain. + +There are following types of schedulers supported in SOF + +- AVS scheduling, + +.. TODO: Add link to Scheduling detailed section + +Async Messaging Service +----------------------- + +Asynchronous Messaging Service (AMS) is mechanism to exchange asynchronous +events between components running in the same firmware infrastructure or running +on the another processor (e.g. between HiFi and Fusion cores). + +The Async Messages can be also injected and extracted via Host Async Message +Gateway module by Host SW. + +.. TODO: Add link to Asynchronous Messaging detailed section + +System Services +--------------- + +The FW components do not know location of driver and service functions in base +firmware library, so they need to access base firmware services via System +Services. + +In SOF with Zephyr the `Zephyr interfaces for +drivers `__ +were adopted. All newly developed drivers must be compliant to this standard and +the legacy ones must be ported to it. + +In Zephyr based firmware, a driver instance is obtained via +``device_get_binding`` function call with a name of a driver instance. There is +no explicit driver initialization call as a driver instance is initialized with +the first call. + +A driver implementation must be ready for using the same hardware instance from +many modules and from many cores (it must be thread-safe implementation). There +can be more than one device instance if there is more than 1 instance of a +hardware (i.e. 2 I2C owner controllers). + +The example functionalities that should be exposed via system services: + +- IPC and IDC, +- Logger Service, +- RTOS scheduler functionalities, like yield, +- Async Messaging Service, From 6fff403d28c032c0fc3384f8d8ff25dcaa752d2f Mon Sep 17 00:00:00 2001 From: Deb Date: Mon, 3 Oct 2022 17:08:26 -0600 Subject: [PATCH 193/290] Edit vendor-specific toc for better navigation Signed-off-by: Deb --- architectures/firmware/index.rst | 13 +- architectures/firmware/intel/cavs/index.rst | 0 .../firmware/vendor-specific/index.rst | 13 ++ .../cavs-boot/apollolake/apl-boot-ldr.rst | 20 +++ .../cavs-boot/apollolake/apl-boot-rom.rst | 163 ++++++++++++++++++ .../apollolake/images/apl-rom-flow.pu | 59 +++++++ .../vend-intel/cavs-boot/apollolake/index.rst | 10 ++ .../cavs-boot/cavs-dsp-boot-overview.rst | 127 ++++++++++++++ .../vend-intel/cavs-boot/images/boot-dsp.pu | 21 +++ .../cavs-boot/images/boot-ldr-flow.pu | 28 +++ .../cavs-boot/images/loading-bins.pu | 41 +++++ .../vend-intel/cavs-boot/images/write-bin.pu | 10 ++ .../vend-intel/cavs-boot/index.rst | 17 ++ .../vend-intel/images/idc-send-message.pu | 30 ++++ .../vendor-specific/vend-intel/index.rst | 13 ++ .../vendor-specific/vend-intel/smp/index.rst | 64 +++++++ architectures/index.rst | 4 +- 17 files changed, 620 insertions(+), 13 deletions(-) mode change 100644 => 100755 architectures/firmware/index.rst mode change 100644 => 100755 architectures/firmware/intel/cavs/index.rst create mode 100755 architectures/firmware/vendor-specific/index.rst create mode 100644 architectures/firmware/vendor-specific/vend-intel/cavs-boot/apollolake/apl-boot-ldr.rst create mode 100644 architectures/firmware/vendor-specific/vend-intel/cavs-boot/apollolake/apl-boot-rom.rst create mode 100644 architectures/firmware/vendor-specific/vend-intel/cavs-boot/apollolake/images/apl-rom-flow.pu create mode 100755 architectures/firmware/vendor-specific/vend-intel/cavs-boot/apollolake/index.rst create mode 100755 architectures/firmware/vendor-specific/vend-intel/cavs-boot/cavs-dsp-boot-overview.rst create mode 100644 architectures/firmware/vendor-specific/vend-intel/cavs-boot/images/boot-dsp.pu create mode 100644 architectures/firmware/vendor-specific/vend-intel/cavs-boot/images/boot-ldr-flow.pu create mode 100644 architectures/firmware/vendor-specific/vend-intel/cavs-boot/images/loading-bins.pu create mode 100644 architectures/firmware/vendor-specific/vend-intel/cavs-boot/images/write-bin.pu create mode 100644 architectures/firmware/vendor-specific/vend-intel/cavs-boot/index.rst create mode 100644 architectures/firmware/vendor-specific/vend-intel/images/idc-send-message.pu create mode 100755 architectures/firmware/vendor-specific/vend-intel/index.rst create mode 100644 architectures/firmware/vendor-specific/vend-intel/smp/index.rst mode change 100644 => 100755 architectures/index.rst diff --git a/architectures/firmware/index.rst b/architectures/firmware/index.rst old mode 100644 new mode 100755 index ba64102a..f44e7ae3 --- a/architectures/firmware/index.rst +++ b/architectures/firmware/index.rst @@ -8,15 +8,4 @@ Firmware Architecture sof-xtos/index sof-zephyr/index - -Vendor Specific Architecture Information -======================================== - -Architecture details of any vendor specific code and flows. This is architecture -specific to a single vendor that falls outside the scope of the high level -generic SOF architecture. - -.. toctree:: - :maxdepth: 1 - - intel/cavs/index \ No newline at end of file + vendor-specific/index \ No newline at end of file diff --git a/architectures/firmware/intel/cavs/index.rst b/architectures/firmware/intel/cavs/index.rst old mode 100644 new mode 100755 diff --git a/architectures/firmware/vendor-specific/index.rst b/architectures/firmware/vendor-specific/index.rst new file mode 100755 index 00000000..6a4e56ee --- /dev/null +++ b/architectures/firmware/vendor-specific/index.rst @@ -0,0 +1,13 @@ +.. _vendor-specific: + +Vendor-Specific Architecture Information +######################################## + +Architecture details of any vendor specific code and flows. This is architecture +specific to a single vendor that falls outside the scope of the high level +generic SOF architecture. + +.. toctree:: + :maxdepth: 1 + + vend-intel/index \ No newline at end of file diff --git a/architectures/firmware/vendor-specific/vend-intel/cavs-boot/apollolake/apl-boot-ldr.rst b/architectures/firmware/vendor-specific/vend-intel/cavs-boot/apollolake/apl-boot-ldr.rst new file mode 100644 index 00000000..04fd5d0e --- /dev/null +++ b/architectures/firmware/vendor-specific/vend-intel/cavs-boot/apollolake/apl-boot-ldr.rst @@ -0,0 +1,20 @@ +.. _apl-boot-ldr: + +Apollo Lake Boot Loader +####################### + +* Additional HPSRAM memory initialization. +* L2 cache disabled in ``boot_entry`` (enabled by default by APL ROM). + +Example list of sections in the APL boot_ldr:: + + Idx Name Size VMA LMA File off Algn + 0 .boot_entry.text 00000036 b000a000 b000a000 000000d4 2**2 + CONTENTS, ALLOC, LOAD, READONLY, CODE + 1 .boot_entry.literal 0000000c b000a040 b000a040 0000010c 2**2 + CONTENTS, ALLOC, LOAD, READONLY, CODE + 2 .text 000007d2 b000a0b0 b000a0b0 00000120 2**4 + CONTENTS, ALLOC, LOAD, READONLY, CODE + 3 .rodata 00000008 b0002000 b0002000 000008f4 2**2 + CONTENTS, ALLOC, LOAD, DATA + ... more debug sections ... diff --git a/architectures/firmware/vendor-specific/vend-intel/cavs-boot/apollolake/apl-boot-rom.rst b/architectures/firmware/vendor-specific/vend-intel/cavs-boot/apollolake/apl-boot-rom.rst new file mode 100644 index 00000000..5070e745 --- /dev/null +++ b/architectures/firmware/vendor-specific/vend-intel/cavs-boot/apollolake/apl-boot-rom.rst @@ -0,0 +1,163 @@ +.. _apl-boot-rom: + +Apollo Lake Boot ROM +#################### + +Progress of the boot process is reflected by the status information updated by +the ROM in an SRAM area called *FW Registers*. It is available to the host +driver through a memory window. + +ROM FW Registers +**************** + +This SRAM area updated by the ROM during the boot process is available via +memory window #0, the limit is set to 4K. + +Offset 0x00 + FwStatus - Current ROM status + +Offset 0x04 + ErrorCode - Last ROM error code + +Offset 0x08 + FwPwrStatus - Current DSP clock status (ToBeVerified on APL/CNL) + +FwStatus +======== + +The FwStatus register contains current FW status, initialized to 0 on the DSP +startup. + +The ErrorCode register is updated by ROM when *FwStatus* ``running`` bit is +set to “halted on critical error”, initialized to 0 (`ADSP_SUCCESS`) on the +DSP startup. + +Once Base FW is being executed, *ErrorCode* is updated every time some error is +detected while calling internal API components. Some of the error codes might be +helpful for driver writers hence documented in this specification. + +.. code-block:: c + + union fw_status_reg + { + int32_t full; + struct Bits + { + uint32_t state : 24; + uint32_t wait_state : 4; + uint32_t module : 3; + uint32_t running : 1; + } bits; + }; + +running + This field is used to report current FW running state. + 0 – running, + 1 – halted. + When FW reports halted state, ErrorCode register contains error + code. + +module + This field is used to report FW module (that indicates boot phase + component/module in this context, not a processing module) that is being + executed. + +wait_state + This field is updated to non-zero code of operation when ROM is waiting + for completion of that operation. + +state + This field is used to report phase of the FW module that is being executed. + When FW switches to another module (reported by Module field) this value + may get started again from 0, so it is Module context sensitive. + +.. uml:: images/apl-rom-flow.pu + :caption: APL ROM Boot Sequence + +.. code-block:: c + :caption: APL ROM Wait States + + // Waiting for IPC busy bit to be set + #define WAIT_FOR_IPC_BUSY 0x1 + // Waiting for IPC done bit to be set + #define WAIT_FOR_IPC_DONE 0x2 + // Waiting for L2$ invalidation to be ack'ed + #define WAIT_FOR_CACHE_INVALIDATION 0x3 + // Waiting for DMA buffer to be filled + #define WAIT_FOR_DMA_BUFFER_FULL 0x5 + +.. code-block:: c + :caption: APL ROM Status Codes + + #define FSR_ROM_INIT 0x0 + #define FSR_ROM_INIT_DONE 0x1 + #define FSR_ROM_CSE_MANIFEST_LOADED 0x2 + #define FSR_ROM_FW_MANIFEST_LOADED 0x3 + #define FSR_ROM_FW_FW_LOADED 0x4 + #define FSR_ROM_FW_ENTERED 0x5 + #define FSR_ROM_VERIFY_FEATURE_MASK 0x6 + #define FSR_ROM_GET_LOAD_OFFSET 0x7 + #define FSR_ROM_BASEFW_CSE_IMR_REQUEST 0x10 + #define FSR_ROM_BASEFW_CSE_IMR_GRANTED 0x11 + #define FSR_ROM_BASEFW_CSE_VALIDATE_IMAGE_REQUEST 0x12 + #define FSR_ROM_BASEFW_CSE_IMAGE_VALIDATED 0x13 + +.. code-block:: c + :caption: APL ROM Error Codes + + #define ADSP_UNHANDLED_INTERRUPT 0xBEE00000 + + // Memory hole/ECC error + // Status bits are provided: + // [0] - L2 SRAM ECC error + // [1] - L2 memory hole error + #define ADSP_MEMORY_HOLE_ECC 0xECC00000 + #define ADSP_USER_EXCEPTION 0xBEEF0000 + #define ADSP_KERNEL_EXCEPTION 0xCAFE0000 + + // Other critical error + #define ADSP_FAILURE 6 + // FW image does not match the feature mask read from HW register. + #define ADSP_INVALID_FEAT_MASK 20 + // Invalid parameter + #define ADSP_INVALID_PARAM 21 + // CSE responded with error on an IPC request + #define ADSP_CSE_ERROR 40 + // Invalid IPC response sent back by CSE. + #define ADSP_CSE_WRONG_RESPONSE 41 + // Size of IMR assigned by CSE is too small to load FW Image. + #define ADSP_IMR_TOO_SMALL 42 + // Base FW module not found in FW Image. + #define ADSP_BASE_FW_NOT_FOUND 43 + // CSE responded with error on FW image validation request. + #define ADSP_CSE_VALIDATION_FAILED 44 + // IPC communication failed with fatal error. + #define ADSP_IPC_FATAL_ERROR 45 + // L2 cache command failed. + #define ADSP_L2_CACHE_ERROR 46 + // Load offset set in FW Image Manifest is too small. + #define ADSP_LOAD_OFFSET_TOO_SMALL 47 + +ROM -> FW Transition +==================== + +Once APL ROM jumps to the entry point of the first module in the main binary, +the memory and caches are in the following state: + +* L2$ is turned on, so the FW boot procedure may either execute via L2 + cacheable address space or directly via L2 uncacheable alias. + +* HPSRAM areas allocated by the ROM listed in the next table. + +APL ROM HPSRAM Allocation +========================= + ++---------------------+------------+--------------+ +| Area | Base Addr | Size | ++=====================+============+==============+ +| Code load buffer | 0xBE008000 | 0x8000 (32K) | ++---------------------+------------+--------------+ +| BSS (inc. stack) | 0xBE010000 | 0x8000 (32K) | ++---------------------+------------+--------------+ +| FW Registers | 0xBE01E000 | 0x800 (2K) | ++---------------------+------------+--------------+ diff --git a/architectures/firmware/vendor-specific/vend-intel/cavs-boot/apollolake/images/apl-rom-flow.pu b/architectures/firmware/vendor-specific/vend-intel/cavs-boot/apollolake/images/apl-rom-flow.pu new file mode 100644 index 00000000..4624b4d1 --- /dev/null +++ b/architectures/firmware/vendor-specific/vend-intel/cavs-boot/apollolake/images/apl-rom-flow.pu @@ -0,0 +1,59 @@ +participant "State" as st +participant "Error" as err +participant "Host\nDriver" as host +participant "APL\nROM" as rom +participant "CSE" as cse + +host -> rom : <> RomControl (purge=1, dma_id) + +== Initialization == +rom -> rom : Boot + err <[#red]- rom : ADSP_UNHANDLED_INTERRUPT [anytime unhandled int reported] + err <[#red]- rom : ADSP_MEMORY_HOLE_ECC [anytime memory hole int reported] + err <[#red]- rom : ADSP_USER_EXCEPTION [anytime unhandled user mode exception happens] + err <[#red]- rom : ADSP_KERNEL_EXCEPTION [anytime unhandled kernel mode exception happens] + +rom -> rom : L2Cache Initialization + err <[#red]- rom : ADSP_L2_CACHE_ERROR [Failed to init L2$] + +rom -> rom : Requesting IMR + st <[#green]- rom : FSR_ROM_BASEFW_CSE_IMR_REQUEST + rom -> cse : <> IPC_ADSP2CSE_REQUEST_IMR + rom <- cse : <> IPC_CSE2ADSP_REQUEST_IMR_RESPONSE + st <[#green]- rom : FSR_ROM_BASEFW_CSE_IMR_GRANTED + +rom -> rom : Initializing Code Load DMA + err <[#red]- rom : ADSP_INVALID_PARAM [dma_id out of range] + +st <[#green]- rom : FSR_ROM_INIT_DONE + +== Loading Image == + rom -> rom : Loading Firmware + ' First fw image block is loaded and feature mask is verified + st <[#green]- rom : FSR_ROM_VERIFY_FEATURE_MASK + err <[#red]- rom : ADSP_INVALID_FEAT_MASK [mft mask does not match SKUID] + ' Load offset is verified + st <[#green]- rom : FSR_ROM_GET_LOAD_OFFSET + err <[#red]- rom : ADSP_LOAD_OFFSET_TOO_SMALL [load offset less then Rsvd space] + err <[#red]- rom : ADSP_IMR_TOO_SMALL [load offset greater than assigned IMR size] + ' CSE Manifest if loaded + rom -> rom : Loading CSE Manifest + err <[#red]- rom : ADSP_IMR_TOO_SMALL [CSE manifest > IMR size] + st <[#green]- rom : FSR_ROM_CSE_MANIFEST_LOADED + ' FW Manifest is loaded + rom -> rom : Loading ADSP FW Manifest + err <[#red]- rom : ADSP_IMR_TOO_SMALL [ADSP FW manifest > IMR size] + st <[#green]- rom : FSR_ROM_FW_MANIFEST_LOADED + err <[#red]- rom : ADSP_BASE_FW_NOT_FOUND [module entry not found in manifest] + ' Loading rest of FW + rom -> rom : Loading FW + st <[#green]- rom : FSR_ROM_FW_FW_LOADED + +== Authenticating Image == + st <[#green]- rom : FSR_ROM_BASEFW_CSE_VALIDATE_IMAGE_REQUEST + rom -> cse : <> IPC_CSE2ADSP_START_FW_AUTH + rom <- cse : <> IPC_CSE2ADSP_START_FW_AUTH_RESPONSE + err <[#red]- rom : ADSP_CSE_VALIDATION_FAILED [invalid image signature] + st <[#green]- rom : FSR_ROM_BASEFW_CSE_IMAGE_VALIDATED +== Booting FW == + st <[#green]- rom : FSR_ROM_FW_ENTERED diff --git a/architectures/firmware/vendor-specific/vend-intel/cavs-boot/apollolake/index.rst b/architectures/firmware/vendor-specific/vend-intel/cavs-boot/apollolake/index.rst new file mode 100755 index 00000000..21ee69cb --- /dev/null +++ b/architectures/firmware/vendor-specific/vend-intel/cavs-boot/apollolake/index.rst @@ -0,0 +1,10 @@ +.. _cavs-boot-apl: + +Apollo Lake Boot Process +######################## + +.. toctree:: + :maxdepth: 1 + + apl-boot-rom + apl-boot-ldr diff --git a/architectures/firmware/vendor-specific/vend-intel/cavs-boot/cavs-dsp-boot-overview.rst b/architectures/firmware/vendor-specific/vend-intel/cavs-boot/cavs-dsp-boot-overview.rst new file mode 100755 index 00000000..24fde842 --- /dev/null +++ b/architectures/firmware/vendor-specific/vend-intel/cavs-boot/cavs-dsp-boot-overview.rst @@ -0,0 +1,127 @@ +.. _cavs-dsp-boot-overview: + +Overview +######## + +There are two main DSP boot flows: + +* **Cold boot** performed when the host CPU exits an Sx state. FW binaries are + loaded into DSP memory and full state re-initialization is required. This + flow is also referred as *Purge Flow* in the figures below. + +* **RTD3 boot** when the DSP state is restored from the DSP internal memory. + This flow is available on platforms with access to Isolated Memory Region + (IMR) allocated for the DSP. + +IPC Communication with DSP ROM +****************************** + +Once the primary DSP core (#0) is powered up and reset by the host driver, an +IPC communication with the DSP ROM is required in order to set the boot +options (see Boot Path Control Messages for details and list of platforms that +require this step). It is a one-way message that does not require a response +from the DSP. + +There may be some specific requirements about the order of the DSP core reset, +sending IPC message, and the DSP core unstall operations. It is assumed that +the following order is required unless specified otherwise by Boot Path +Control Message in case of a specific platform: + +1. Power up and reset the DSP Core 0, +#. Send ROM Control IPC, +#. Unstall DSP Core 0. + +The ROM Control IPC message includes “purge” parameter that should be set to 1 +in case of the cold boot. Otherwise it may be set to 0 after coming out of +RTD3 to attempt quicker state restore flow. In the latter case, the driver +just waits for FW Ready notification (no library loading is needed). + +The flow is illustrated in the next figure. + +.. uml:: images/boot-dsp.pu + +Loading Binaries to ADSP Memory +******************************* + +The ADSP FW binary code may be divided into: + +* The Base FW binary file, which contains FW infrastructure code (Base FW + module) required by all the platforms, optionally followed by other modules, + +* Set of libraries (modules) containing additional processing modules code + that may be optionally loaded into ADSP FW memory based on the platform’s + requirements and configuration. + +.. note:: This section contains general information about the structure of + binaries necessary to understand the loading process. For a complete + documentation refer to FW Binaries documentation. + +There are two main parts of the main binary: + +* Manifest, +* Modules binary code. + +Determining Part of Binary to be Loaded +======================================= + +The binary begins with the Manifest that is loaded into the DSP memory. The +Manifest contains ``preload_page_count`` parameter that determines part of the +binary to be loaded by the driver during the boot process. The preload size is +expressed in pages, where size of the page is 4096 bytes for all platforms. If +IMR is available and allocated for the DSP on the platform, the preload size +includes the entire binary. Otherwise it includes only the critical part of +the binary while other parts (so called loadable modules) may be loaded on +demand when needed (see Load Multiple Modules IPC) to limit SRAM usage and +save the power. + +For example, the Base FW binary file may be setup in a way that +``preload_page_count`` includes size of the Manifest as well as size of the +following Base FW module (it is always module 0 in the Base FW binary) since +its presence in the DSP memory is absolutely necessary for the boot to +complete. If the Base FW module is followed by other modules code, they may be +either included in the preload or not, depending on the platform memory +availability. + +The ``preload_page_count`` is one of the ``AdspFwBinaryHeader`` parameters. +The header starts with “$AM1” tag (0x314D4124) and is located at offset 0x2000 +of the binary file. + +.. note:: All the binary file offsets specified by the Manifest are computed + relatively to the beginning of the Manifest. + +Preparing DMA to Transfer Binaries +================================== + +The driver programs the DMA engine that is used to transfer the binaries into +the DSP memory. It is either dedicated Code Load DMA if available, or one of +the HD/A host output DMAs otherwise. In the latter case the ROM Control IPC is +required since the DMA identifier must be passed to the DSP ROM in order to +program the DMA on the DSP side. + +Note that the DMA buffers are managed independently on the host side and the +DSP side. + +Loading Binaries +================ + +Once the DMA is ready, the driver loads the Base FW binary, waits for the FW +Ready IPC notification and then loads additional binaries (libraries/modules). + +.. note:: Loading additional modules must be finished before any stream is + opened for the first time and the DMA is reclaimed for HD/A streaming. + +The complete flow is illustrated in the next figure. + +.. uml:: images/loading-bins.pu + :caption: Loading FW Binaries to ADSP Memory + +The details of *_write(....binary)* step are illustrated in the next figure. + +.. uml:: images/write-bin.pu + :caption: Writing a Binary + +Booting with Boot Loader +************************ + +.. uml:: images/boot-ldr-flow.pu + :caption: SOF Boot Loader Flow diff --git a/architectures/firmware/vendor-specific/vend-intel/cavs-boot/images/boot-dsp.pu b/architectures/firmware/vendor-specific/vend-intel/cavs-boot/images/boot-dsp.pu new file mode 100644 index 00000000..59acf2df --- /dev/null +++ b/architectures/firmware/vendor-specific/vend-intel/cavs-boot/images/boot-dsp.pu @@ -0,0 +1,21 @@ +actor Host +participant mw0 as "MemWnd0" +participant core0 as "DSP Core0" +participant rom as "DSP ROM" + +Host -> core0 : power up and reset + +Host -> rom : <> ROM Control(set_boot_config) +Host -> core0 : unstall + core0 -> rom : ResetVector() + activate rom + +Host -> mw0 : wait for(FSR_ROM_INIT_DONE) + + rom -> rom : Process ROM Control + + mw0 <- rom : FwRegsSetState(FSR_ROM_INIT_DONE) + +Host <-- mw0 + +Host -> Host : binaries loading diff --git a/architectures/firmware/vendor-specific/vend-intel/cavs-boot/images/boot-ldr-flow.pu b/architectures/firmware/vendor-specific/vend-intel/cavs-boot/images/boot-ldr-flow.pu new file mode 100644 index 00000000..643cca70 --- /dev/null +++ b/architectures/firmware/vendor-specific/vend-intel/cavs-boot/images/boot-ldr-flow.pu @@ -0,0 +1,28 @@ +actor "ROM" as rom +box "boot_ldr @IMR" #6fccdd + participant ".boot_entry.text" as bup_be + participant ".text" as bup +end box +participant "sof" as fw + +rom -> bup_be : boot_entry() @boot_ldr.ep (boot_entry.S) + activate bup_be + bup_be -> bup_be : j boot_init: + note right: Platform specific actions (compilation flags)\n\ +- reset MHE\n\ +- disable L2$ + bup_be -> bup : call8 boot_pri_core() (boot_loader.c) + activate bup + bup -> bup : hp_sram_init() + opt defined(CONFIG_BOOT_LOADER) + bup -> bup : parse_manifest() + note right: copying of FW IMR -> SRAM done here + end + + bup -> bup : _ResetVector() + activate bup + bup -> fw : _MainEntry() @SOF_TEXT_START + fw -> fw : call0 _start + activate fw + fw -> fw : call main + activate fw diff --git a/architectures/firmware/vendor-specific/vend-intel/cavs-boot/images/loading-bins.pu b/architectures/firmware/vendor-specific/vend-intel/cavs-boot/images/loading-bins.pu new file mode 100644 index 00000000..0c0dedb6 --- /dev/null +++ b/architectures/firmware/vendor-specific/vend-intel/cavs-boot/images/loading-bins.pu @@ -0,0 +1,41 @@ +actor host as "Host" +participant cldma as "CodeLoadDMA" +participant mw0 as "MemWnd0" +participant core0 as "DSP Core0" +participant rom as "DSP ROM" +participant fw as "DSP FW" + +activate rom +activate host +host -> cldma : init_host_side() + +rom -> cldma : init_dsp_side() +note right: Unified cAVS1.5+ flow + +host -> mw0 : wait for (FSR_ROM_INIT_DONE) + mw0 <- rom : FSR_ROM_INIT_DONE +host <-- mw0 + +host -> cldma : write(base fw binary) + cldma <- rom : read() : base fw manifest + rom -> rom : veirfy(base fw manifest) + cldma <- rom : read() : base fw code + mw0 <- rom : FSR_ROM_FW_ENTERED + + create fw + rom -> fw : start() + activate fw + fw -> fw : initialization() + host <- fw : <> FW Ready + deactivate fw + +loop libraries loading + host -> cldma : write(library binary) + host -> fw : <> Load Library + activate fw + cldma <- fw : read() : library manifest + fw -> fw : verify(library manifest) + cldma <- fw : read() : library code + host <-- fw + deactivate fw +end loop diff --git a/architectures/firmware/vendor-specific/vend-intel/cavs-boot/images/write-bin.pu b/architectures/firmware/vendor-specific/vend-intel/cavs-boot/images/write-bin.pu new file mode 100644 index 00000000..451ca627 --- /dev/null +++ b/architectures/firmware/vendor-specific/vend-intel/cavs-boot/images/write-bin.pu @@ -0,0 +1,10 @@ +actor host as "Host" +participant cldma as "CodeLoadDMA" + +activate host +host -> host : read(): binary +host -> host : detect and strip Extended Manifest : binary_mft_code +host -> host : retrieve preload size (binary_mft_code) : preload_size + +host -> cldma : write (binary_mft_code, mft_size) +host -> cldma : write (binary_mft_code+mft_size, preload_size-mft_size) diff --git a/architectures/firmware/vendor-specific/vend-intel/cavs-boot/index.rst b/architectures/firmware/vendor-specific/vend-intel/cavs-boot/index.rst new file mode 100644 index 00000000..54ba2ef6 --- /dev/null +++ b/architectures/firmware/vendor-specific/vend-intel/cavs-boot/index.rst @@ -0,0 +1,17 @@ +.. _architecture-intel-cavs-boot: + +Booting up CAVS ADSP +#################### + +Intel has several generations of audio DSP. "CAVS" versions relate to the audio +DSP in Skylake Core and Apollo Lake Atom platforms onwards. + +Bay Trail, Cherry Trail, Braswell, Haswell, and Broadwell audio DSPs have a simpler +boot flow using memory copy and not authentication. + + +.. toctree:: + :maxdepth: 2 + + cavs-dsp-boot-overview + apollolake/index diff --git a/architectures/firmware/vendor-specific/vend-intel/images/idc-send-message.pu b/architectures/firmware/vendor-specific/vend-intel/images/idc-send-message.pu new file mode 100644 index 00000000..f19d027e --- /dev/null +++ b/architectures/firmware/vendor-specific/vend-intel/images/idc-send-message.pu @@ -0,0 +1,30 @@ +participant core0 +participant core1 +participant idc +participant platform + +core0 -> idc : idc_init() + activate idc + + idc -> platform : interrupt_register(irq, auto_unmask, irq_handler, idc) + activate platform + idc <-- platform + deactivate platform + +core0 <-- idc +deactivate idc + +core0 -> idc : idc_send_msg(idc_msg, mode) + activate idc + + idc -> core1 : irq_handler() + activate core1 + idc <-- core1 + deactivate core1 +core0 <-- idc +deactivate idc + +core1 -> idc : idc_do_cmd(data) + activate idc +idc <-- core1 +deactivate idc diff --git a/architectures/firmware/vendor-specific/vend-intel/index.rst b/architectures/firmware/vendor-specific/vend-intel/index.rst new file mode 100755 index 00000000..4f3ac9a7 --- /dev/null +++ b/architectures/firmware/vendor-specific/vend-intel/index.rst @@ -0,0 +1,13 @@ +.. _cavs-architecture-intel: + +Intel cAVS Architecture +####################### + +The details below are specific to Intel products with an audio DSP cAVS +architecture using SOF. + +.. toctree:: + :maxdepth: 1 + + cavs-boot/index + smp/index \ No newline at end of file diff --git a/architectures/firmware/vendor-specific/vend-intel/smp/index.rst b/architectures/firmware/vendor-specific/vend-intel/smp/index.rst new file mode 100644 index 00000000..5aff7fc0 --- /dev/null +++ b/architectures/firmware/vendor-specific/vend-intel/smp/index.rst @@ -0,0 +1,64 @@ +.. _architecture-intel-smp: + +Intel SMP Architecture +###################### + +Description +*********** + +SMP architecture is used in the environment, where multiple processors are +connected to a single shared memory, have access to all input and output +interfaces, and are controlled by a single operating system. In our case, +we have multiple Xtensa DSP cores, which use the same Firmware binary loaded +to the shared L2 SRAM, and are controlled by the same instance of the XTOS. + +Using SMP architecture +********************** + +|SOF| implementation of SMP architecture involves separate and modified XTOS, +which can be chosen by selecting appropriate arch flag during configuration +step of building FW binary. + +.. code-block:: bash + + ./configure --with-arch=xtensa-smp --with-platform= --with-dsp-core= --with-root-dir= --host= + +Implementation details +********************** + +The data structures critical to core execution need to be instantiated +per core, instead of being accessed using static pointers. +SMP implementation creates ``struct core_context`` to meet those demands. +This structure contains pointers to the XTOS data along with +``struct irq_task``, ``struct schedule_data``, ``struct work_queue`` etc. + +.. code-block:: c + + struct core_context { + struct thread_data td; + struct irq_task *irq_low_task; + struct irq_task *irq_med_task; + struct irq_task *irq_high_task; + struct schedule_data *sch; + struct work_queue *queue; + struct idc *idc; + }; + +``struct core_context`` is allocated by primary core for secondary cores before +secondary core boot. Address of the ``struct core_context`` is written into +``THREADPTR`` processor register, which can later be retrieved by the secondary core +after boot. Every core has its own instance of ``THREADPTR``, +so ``struct core_context`` address can be read anytime at any place of the code. + +Communication between cores +*************************** + +Primary core can communicate with secondary cores by sending messages using +the IDC mechanism. This mechanism is pretty much the same as IPC. +Important data can be sent in two 32-bit IDC registers. Cores use interrupts +to register for the incoming messages. + +.. uml:: ../images/idc-send-message.pu + +.. comment "master" has been replaced with "primary" +.. comment "slave" has been replaced with "secondary" \ No newline at end of file diff --git a/architectures/index.rst b/architectures/index.rst old mode 100644 new mode 100755 index b16f224b..a82a0be0 --- a/architectures/index.rst +++ b/architectures/index.rst @@ -8,7 +8,7 @@ not coupled to any particular DSP or host hardware architecture. The SOF |TSC| ensures that any DSP or host architecture specific code is partitioned to reside in architecture-specific directories with generic APIs to common code. -This section outlines the architecture at a high level, however the source code +This section outlines the architecture at a high level; however, the source code should always be consulted for the low level details. .. toctree:: @@ -16,3 +16,5 @@ should always be consulted for the low level details. host/index firmware/index + + From 618eed37e7a979c60b2d13283729be68a81b04bd Mon Sep 17 00:00:00 2001 From: Deb Taylor Date: Tue, 4 Oct 2022 17:41:58 -0600 Subject: [PATCH 194/290] Edit vendor-specific toc for better navigation; fix build breaks 4 (#434) Signed-off-by: Deb Signed-off-by: Deb --- .../cavs-boot/apollolake/apl-boot-ldr.rst | 20 --- .../cavs-boot/apollolake/apl-boot-rom.rst | 163 ------------------ .../apollolake/images/apl-rom-flow.pu | 59 ------- .../intel/cavs/cavs-boot/apollolake/index.rst | 10 -- .../cavs/cavs-boot/cavs-dsp-boot-overview.rst | 127 -------------- .../intel/cavs/cavs-boot/images/boot-dsp.pu | 21 --- .../cavs/cavs-boot/images/boot-ldr-flow.pu | 28 --- .../cavs/cavs-boot/images/loading-bins.pu | 41 ----- .../intel/cavs/cavs-boot/images/write-bin.pu | 10 -- .../firmware/intel/cavs/cavs-boot/index.rst | 17 -- .../intel/cavs/images/idc-send-message.pu | 30 ---- .../firmware/intel/cavs/smp/index.rst | 64 ------- .../firmware/sof-xtos/schedulers.rst | 2 +- .../rtos_layer/zephyr_kernel_overview.rst | 2 +- 14 files changed, 2 insertions(+), 592 deletions(-) delete mode 100644 architectures/firmware/intel/cavs/cavs-boot/apollolake/apl-boot-ldr.rst delete mode 100644 architectures/firmware/intel/cavs/cavs-boot/apollolake/apl-boot-rom.rst delete mode 100644 architectures/firmware/intel/cavs/cavs-boot/apollolake/images/apl-rom-flow.pu delete mode 100644 architectures/firmware/intel/cavs/cavs-boot/apollolake/index.rst delete mode 100755 architectures/firmware/intel/cavs/cavs-boot/cavs-dsp-boot-overview.rst delete mode 100644 architectures/firmware/intel/cavs/cavs-boot/images/boot-dsp.pu delete mode 100644 architectures/firmware/intel/cavs/cavs-boot/images/boot-ldr-flow.pu delete mode 100644 architectures/firmware/intel/cavs/cavs-boot/images/loading-bins.pu delete mode 100644 architectures/firmware/intel/cavs/cavs-boot/images/write-bin.pu delete mode 100644 architectures/firmware/intel/cavs/cavs-boot/index.rst delete mode 100644 architectures/firmware/intel/cavs/images/idc-send-message.pu delete mode 100644 architectures/firmware/intel/cavs/smp/index.rst mode change 100644 => 100755 architectures/firmware/sof-xtos/schedulers.rst mode change 100644 => 100755 architectures/firmware/sof-zephyr/rtos_layer/zephyr_kernel_overview.rst diff --git a/architectures/firmware/intel/cavs/cavs-boot/apollolake/apl-boot-ldr.rst b/architectures/firmware/intel/cavs/cavs-boot/apollolake/apl-boot-ldr.rst deleted file mode 100644 index 04fd5d0e..00000000 --- a/architectures/firmware/intel/cavs/cavs-boot/apollolake/apl-boot-ldr.rst +++ /dev/null @@ -1,20 +0,0 @@ -.. _apl-boot-ldr: - -Apollo Lake Boot Loader -####################### - -* Additional HPSRAM memory initialization. -* L2 cache disabled in ``boot_entry`` (enabled by default by APL ROM). - -Example list of sections in the APL boot_ldr:: - - Idx Name Size VMA LMA File off Algn - 0 .boot_entry.text 00000036 b000a000 b000a000 000000d4 2**2 - CONTENTS, ALLOC, LOAD, READONLY, CODE - 1 .boot_entry.literal 0000000c b000a040 b000a040 0000010c 2**2 - CONTENTS, ALLOC, LOAD, READONLY, CODE - 2 .text 000007d2 b000a0b0 b000a0b0 00000120 2**4 - CONTENTS, ALLOC, LOAD, READONLY, CODE - 3 .rodata 00000008 b0002000 b0002000 000008f4 2**2 - CONTENTS, ALLOC, LOAD, DATA - ... more debug sections ... diff --git a/architectures/firmware/intel/cavs/cavs-boot/apollolake/apl-boot-rom.rst b/architectures/firmware/intel/cavs/cavs-boot/apollolake/apl-boot-rom.rst deleted file mode 100644 index 5070e745..00000000 --- a/architectures/firmware/intel/cavs/cavs-boot/apollolake/apl-boot-rom.rst +++ /dev/null @@ -1,163 +0,0 @@ -.. _apl-boot-rom: - -Apollo Lake Boot ROM -#################### - -Progress of the boot process is reflected by the status information updated by -the ROM in an SRAM area called *FW Registers*. It is available to the host -driver through a memory window. - -ROM FW Registers -**************** - -This SRAM area updated by the ROM during the boot process is available via -memory window #0, the limit is set to 4K. - -Offset 0x00 - FwStatus - Current ROM status - -Offset 0x04 - ErrorCode - Last ROM error code - -Offset 0x08 - FwPwrStatus - Current DSP clock status (ToBeVerified on APL/CNL) - -FwStatus -======== - -The FwStatus register contains current FW status, initialized to 0 on the DSP -startup. - -The ErrorCode register is updated by ROM when *FwStatus* ``running`` bit is -set to “halted on critical error”, initialized to 0 (`ADSP_SUCCESS`) on the -DSP startup. - -Once Base FW is being executed, *ErrorCode* is updated every time some error is -detected while calling internal API components. Some of the error codes might be -helpful for driver writers hence documented in this specification. - -.. code-block:: c - - union fw_status_reg - { - int32_t full; - struct Bits - { - uint32_t state : 24; - uint32_t wait_state : 4; - uint32_t module : 3; - uint32_t running : 1; - } bits; - }; - -running - This field is used to report current FW running state. - 0 – running, - 1 – halted. - When FW reports halted state, ErrorCode register contains error - code. - -module - This field is used to report FW module (that indicates boot phase - component/module in this context, not a processing module) that is being - executed. - -wait_state - This field is updated to non-zero code of operation when ROM is waiting - for completion of that operation. - -state - This field is used to report phase of the FW module that is being executed. - When FW switches to another module (reported by Module field) this value - may get started again from 0, so it is Module context sensitive. - -.. uml:: images/apl-rom-flow.pu - :caption: APL ROM Boot Sequence - -.. code-block:: c - :caption: APL ROM Wait States - - // Waiting for IPC busy bit to be set - #define WAIT_FOR_IPC_BUSY 0x1 - // Waiting for IPC done bit to be set - #define WAIT_FOR_IPC_DONE 0x2 - // Waiting for L2$ invalidation to be ack'ed - #define WAIT_FOR_CACHE_INVALIDATION 0x3 - // Waiting for DMA buffer to be filled - #define WAIT_FOR_DMA_BUFFER_FULL 0x5 - -.. code-block:: c - :caption: APL ROM Status Codes - - #define FSR_ROM_INIT 0x0 - #define FSR_ROM_INIT_DONE 0x1 - #define FSR_ROM_CSE_MANIFEST_LOADED 0x2 - #define FSR_ROM_FW_MANIFEST_LOADED 0x3 - #define FSR_ROM_FW_FW_LOADED 0x4 - #define FSR_ROM_FW_ENTERED 0x5 - #define FSR_ROM_VERIFY_FEATURE_MASK 0x6 - #define FSR_ROM_GET_LOAD_OFFSET 0x7 - #define FSR_ROM_BASEFW_CSE_IMR_REQUEST 0x10 - #define FSR_ROM_BASEFW_CSE_IMR_GRANTED 0x11 - #define FSR_ROM_BASEFW_CSE_VALIDATE_IMAGE_REQUEST 0x12 - #define FSR_ROM_BASEFW_CSE_IMAGE_VALIDATED 0x13 - -.. code-block:: c - :caption: APL ROM Error Codes - - #define ADSP_UNHANDLED_INTERRUPT 0xBEE00000 - - // Memory hole/ECC error - // Status bits are provided: - // [0] - L2 SRAM ECC error - // [1] - L2 memory hole error - #define ADSP_MEMORY_HOLE_ECC 0xECC00000 - #define ADSP_USER_EXCEPTION 0xBEEF0000 - #define ADSP_KERNEL_EXCEPTION 0xCAFE0000 - - // Other critical error - #define ADSP_FAILURE 6 - // FW image does not match the feature mask read from HW register. - #define ADSP_INVALID_FEAT_MASK 20 - // Invalid parameter - #define ADSP_INVALID_PARAM 21 - // CSE responded with error on an IPC request - #define ADSP_CSE_ERROR 40 - // Invalid IPC response sent back by CSE. - #define ADSP_CSE_WRONG_RESPONSE 41 - // Size of IMR assigned by CSE is too small to load FW Image. - #define ADSP_IMR_TOO_SMALL 42 - // Base FW module not found in FW Image. - #define ADSP_BASE_FW_NOT_FOUND 43 - // CSE responded with error on FW image validation request. - #define ADSP_CSE_VALIDATION_FAILED 44 - // IPC communication failed with fatal error. - #define ADSP_IPC_FATAL_ERROR 45 - // L2 cache command failed. - #define ADSP_L2_CACHE_ERROR 46 - // Load offset set in FW Image Manifest is too small. - #define ADSP_LOAD_OFFSET_TOO_SMALL 47 - -ROM -> FW Transition -==================== - -Once APL ROM jumps to the entry point of the first module in the main binary, -the memory and caches are in the following state: - -* L2$ is turned on, so the FW boot procedure may either execute via L2 - cacheable address space or directly via L2 uncacheable alias. - -* HPSRAM areas allocated by the ROM listed in the next table. - -APL ROM HPSRAM Allocation -========================= - -+---------------------+------------+--------------+ -| Area | Base Addr | Size | -+=====================+============+==============+ -| Code load buffer | 0xBE008000 | 0x8000 (32K) | -+---------------------+------------+--------------+ -| BSS (inc. stack) | 0xBE010000 | 0x8000 (32K) | -+---------------------+------------+--------------+ -| FW Registers | 0xBE01E000 | 0x800 (2K) | -+---------------------+------------+--------------+ diff --git a/architectures/firmware/intel/cavs/cavs-boot/apollolake/images/apl-rom-flow.pu b/architectures/firmware/intel/cavs/cavs-boot/apollolake/images/apl-rom-flow.pu deleted file mode 100644 index 4624b4d1..00000000 --- a/architectures/firmware/intel/cavs/cavs-boot/apollolake/images/apl-rom-flow.pu +++ /dev/null @@ -1,59 +0,0 @@ -participant "State" as st -participant "Error" as err -participant "Host\nDriver" as host -participant "APL\nROM" as rom -participant "CSE" as cse - -host -> rom : <> RomControl (purge=1, dma_id) - -== Initialization == -rom -> rom : Boot - err <[#red]- rom : ADSP_UNHANDLED_INTERRUPT [anytime unhandled int reported] - err <[#red]- rom : ADSP_MEMORY_HOLE_ECC [anytime memory hole int reported] - err <[#red]- rom : ADSP_USER_EXCEPTION [anytime unhandled user mode exception happens] - err <[#red]- rom : ADSP_KERNEL_EXCEPTION [anytime unhandled kernel mode exception happens] - -rom -> rom : L2Cache Initialization - err <[#red]- rom : ADSP_L2_CACHE_ERROR [Failed to init L2$] - -rom -> rom : Requesting IMR - st <[#green]- rom : FSR_ROM_BASEFW_CSE_IMR_REQUEST - rom -> cse : <> IPC_ADSP2CSE_REQUEST_IMR - rom <- cse : <> IPC_CSE2ADSP_REQUEST_IMR_RESPONSE - st <[#green]- rom : FSR_ROM_BASEFW_CSE_IMR_GRANTED - -rom -> rom : Initializing Code Load DMA - err <[#red]- rom : ADSP_INVALID_PARAM [dma_id out of range] - -st <[#green]- rom : FSR_ROM_INIT_DONE - -== Loading Image == - rom -> rom : Loading Firmware - ' First fw image block is loaded and feature mask is verified - st <[#green]- rom : FSR_ROM_VERIFY_FEATURE_MASK - err <[#red]- rom : ADSP_INVALID_FEAT_MASK [mft mask does not match SKUID] - ' Load offset is verified - st <[#green]- rom : FSR_ROM_GET_LOAD_OFFSET - err <[#red]- rom : ADSP_LOAD_OFFSET_TOO_SMALL [load offset less then Rsvd space] - err <[#red]- rom : ADSP_IMR_TOO_SMALL [load offset greater than assigned IMR size] - ' CSE Manifest if loaded - rom -> rom : Loading CSE Manifest - err <[#red]- rom : ADSP_IMR_TOO_SMALL [CSE manifest > IMR size] - st <[#green]- rom : FSR_ROM_CSE_MANIFEST_LOADED - ' FW Manifest is loaded - rom -> rom : Loading ADSP FW Manifest - err <[#red]- rom : ADSP_IMR_TOO_SMALL [ADSP FW manifest > IMR size] - st <[#green]- rom : FSR_ROM_FW_MANIFEST_LOADED - err <[#red]- rom : ADSP_BASE_FW_NOT_FOUND [module entry not found in manifest] - ' Loading rest of FW - rom -> rom : Loading FW - st <[#green]- rom : FSR_ROM_FW_FW_LOADED - -== Authenticating Image == - st <[#green]- rom : FSR_ROM_BASEFW_CSE_VALIDATE_IMAGE_REQUEST - rom -> cse : <> IPC_CSE2ADSP_START_FW_AUTH - rom <- cse : <> IPC_CSE2ADSP_START_FW_AUTH_RESPONSE - err <[#red]- rom : ADSP_CSE_VALIDATION_FAILED [invalid image signature] - st <[#green]- rom : FSR_ROM_BASEFW_CSE_IMAGE_VALIDATED -== Booting FW == - st <[#green]- rom : FSR_ROM_FW_ENTERED diff --git a/architectures/firmware/intel/cavs/cavs-boot/apollolake/index.rst b/architectures/firmware/intel/cavs/cavs-boot/apollolake/index.rst deleted file mode 100644 index 21ee69cb..00000000 --- a/architectures/firmware/intel/cavs/cavs-boot/apollolake/index.rst +++ /dev/null @@ -1,10 +0,0 @@ -.. _cavs-boot-apl: - -Apollo Lake Boot Process -######################## - -.. toctree:: - :maxdepth: 1 - - apl-boot-rom - apl-boot-ldr diff --git a/architectures/firmware/intel/cavs/cavs-boot/cavs-dsp-boot-overview.rst b/architectures/firmware/intel/cavs/cavs-boot/cavs-dsp-boot-overview.rst deleted file mode 100755 index 24fde842..00000000 --- a/architectures/firmware/intel/cavs/cavs-boot/cavs-dsp-boot-overview.rst +++ /dev/null @@ -1,127 +0,0 @@ -.. _cavs-dsp-boot-overview: - -Overview -######## - -There are two main DSP boot flows: - -* **Cold boot** performed when the host CPU exits an Sx state. FW binaries are - loaded into DSP memory and full state re-initialization is required. This - flow is also referred as *Purge Flow* in the figures below. - -* **RTD3 boot** when the DSP state is restored from the DSP internal memory. - This flow is available on platforms with access to Isolated Memory Region - (IMR) allocated for the DSP. - -IPC Communication with DSP ROM -****************************** - -Once the primary DSP core (#0) is powered up and reset by the host driver, an -IPC communication with the DSP ROM is required in order to set the boot -options (see Boot Path Control Messages for details and list of platforms that -require this step). It is a one-way message that does not require a response -from the DSP. - -There may be some specific requirements about the order of the DSP core reset, -sending IPC message, and the DSP core unstall operations. It is assumed that -the following order is required unless specified otherwise by Boot Path -Control Message in case of a specific platform: - -1. Power up and reset the DSP Core 0, -#. Send ROM Control IPC, -#. Unstall DSP Core 0. - -The ROM Control IPC message includes “purge” parameter that should be set to 1 -in case of the cold boot. Otherwise it may be set to 0 after coming out of -RTD3 to attempt quicker state restore flow. In the latter case, the driver -just waits for FW Ready notification (no library loading is needed). - -The flow is illustrated in the next figure. - -.. uml:: images/boot-dsp.pu - -Loading Binaries to ADSP Memory -******************************* - -The ADSP FW binary code may be divided into: - -* The Base FW binary file, which contains FW infrastructure code (Base FW - module) required by all the platforms, optionally followed by other modules, - -* Set of libraries (modules) containing additional processing modules code - that may be optionally loaded into ADSP FW memory based on the platform’s - requirements and configuration. - -.. note:: This section contains general information about the structure of - binaries necessary to understand the loading process. For a complete - documentation refer to FW Binaries documentation. - -There are two main parts of the main binary: - -* Manifest, -* Modules binary code. - -Determining Part of Binary to be Loaded -======================================= - -The binary begins with the Manifest that is loaded into the DSP memory. The -Manifest contains ``preload_page_count`` parameter that determines part of the -binary to be loaded by the driver during the boot process. The preload size is -expressed in pages, where size of the page is 4096 bytes for all platforms. If -IMR is available and allocated for the DSP on the platform, the preload size -includes the entire binary. Otherwise it includes only the critical part of -the binary while other parts (so called loadable modules) may be loaded on -demand when needed (see Load Multiple Modules IPC) to limit SRAM usage and -save the power. - -For example, the Base FW binary file may be setup in a way that -``preload_page_count`` includes size of the Manifest as well as size of the -following Base FW module (it is always module 0 in the Base FW binary) since -its presence in the DSP memory is absolutely necessary for the boot to -complete. If the Base FW module is followed by other modules code, they may be -either included in the preload or not, depending on the platform memory -availability. - -The ``preload_page_count`` is one of the ``AdspFwBinaryHeader`` parameters. -The header starts with “$AM1” tag (0x314D4124) and is located at offset 0x2000 -of the binary file. - -.. note:: All the binary file offsets specified by the Manifest are computed - relatively to the beginning of the Manifest. - -Preparing DMA to Transfer Binaries -================================== - -The driver programs the DMA engine that is used to transfer the binaries into -the DSP memory. It is either dedicated Code Load DMA if available, or one of -the HD/A host output DMAs otherwise. In the latter case the ROM Control IPC is -required since the DMA identifier must be passed to the DSP ROM in order to -program the DMA on the DSP side. - -Note that the DMA buffers are managed independently on the host side and the -DSP side. - -Loading Binaries -================ - -Once the DMA is ready, the driver loads the Base FW binary, waits for the FW -Ready IPC notification and then loads additional binaries (libraries/modules). - -.. note:: Loading additional modules must be finished before any stream is - opened for the first time and the DMA is reclaimed for HD/A streaming. - -The complete flow is illustrated in the next figure. - -.. uml:: images/loading-bins.pu - :caption: Loading FW Binaries to ADSP Memory - -The details of *_write(....binary)* step are illustrated in the next figure. - -.. uml:: images/write-bin.pu - :caption: Writing a Binary - -Booting with Boot Loader -************************ - -.. uml:: images/boot-ldr-flow.pu - :caption: SOF Boot Loader Flow diff --git a/architectures/firmware/intel/cavs/cavs-boot/images/boot-dsp.pu b/architectures/firmware/intel/cavs/cavs-boot/images/boot-dsp.pu deleted file mode 100644 index 59acf2df..00000000 --- a/architectures/firmware/intel/cavs/cavs-boot/images/boot-dsp.pu +++ /dev/null @@ -1,21 +0,0 @@ -actor Host -participant mw0 as "MemWnd0" -participant core0 as "DSP Core0" -participant rom as "DSP ROM" - -Host -> core0 : power up and reset - -Host -> rom : <> ROM Control(set_boot_config) -Host -> core0 : unstall - core0 -> rom : ResetVector() - activate rom - -Host -> mw0 : wait for(FSR_ROM_INIT_DONE) - - rom -> rom : Process ROM Control - - mw0 <- rom : FwRegsSetState(FSR_ROM_INIT_DONE) - -Host <-- mw0 - -Host -> Host : binaries loading diff --git a/architectures/firmware/intel/cavs/cavs-boot/images/boot-ldr-flow.pu b/architectures/firmware/intel/cavs/cavs-boot/images/boot-ldr-flow.pu deleted file mode 100644 index 643cca70..00000000 --- a/architectures/firmware/intel/cavs/cavs-boot/images/boot-ldr-flow.pu +++ /dev/null @@ -1,28 +0,0 @@ -actor "ROM" as rom -box "boot_ldr @IMR" #6fccdd - participant ".boot_entry.text" as bup_be - participant ".text" as bup -end box -participant "sof" as fw - -rom -> bup_be : boot_entry() @boot_ldr.ep (boot_entry.S) - activate bup_be - bup_be -> bup_be : j boot_init: - note right: Platform specific actions (compilation flags)\n\ -- reset MHE\n\ -- disable L2$ - bup_be -> bup : call8 boot_pri_core() (boot_loader.c) - activate bup - bup -> bup : hp_sram_init() - opt defined(CONFIG_BOOT_LOADER) - bup -> bup : parse_manifest() - note right: copying of FW IMR -> SRAM done here - end - - bup -> bup : _ResetVector() - activate bup - bup -> fw : _MainEntry() @SOF_TEXT_START - fw -> fw : call0 _start - activate fw - fw -> fw : call main - activate fw diff --git a/architectures/firmware/intel/cavs/cavs-boot/images/loading-bins.pu b/architectures/firmware/intel/cavs/cavs-boot/images/loading-bins.pu deleted file mode 100644 index 0c0dedb6..00000000 --- a/architectures/firmware/intel/cavs/cavs-boot/images/loading-bins.pu +++ /dev/null @@ -1,41 +0,0 @@ -actor host as "Host" -participant cldma as "CodeLoadDMA" -participant mw0 as "MemWnd0" -participant core0 as "DSP Core0" -participant rom as "DSP ROM" -participant fw as "DSP FW" - -activate rom -activate host -host -> cldma : init_host_side() - -rom -> cldma : init_dsp_side() -note right: Unified cAVS1.5+ flow - -host -> mw0 : wait for (FSR_ROM_INIT_DONE) - mw0 <- rom : FSR_ROM_INIT_DONE -host <-- mw0 - -host -> cldma : write(base fw binary) - cldma <- rom : read() : base fw manifest - rom -> rom : veirfy(base fw manifest) - cldma <- rom : read() : base fw code - mw0 <- rom : FSR_ROM_FW_ENTERED - - create fw - rom -> fw : start() - activate fw - fw -> fw : initialization() - host <- fw : <> FW Ready - deactivate fw - -loop libraries loading - host -> cldma : write(library binary) - host -> fw : <> Load Library - activate fw - cldma <- fw : read() : library manifest - fw -> fw : verify(library manifest) - cldma <- fw : read() : library code - host <-- fw - deactivate fw -end loop diff --git a/architectures/firmware/intel/cavs/cavs-boot/images/write-bin.pu b/architectures/firmware/intel/cavs/cavs-boot/images/write-bin.pu deleted file mode 100644 index 451ca627..00000000 --- a/architectures/firmware/intel/cavs/cavs-boot/images/write-bin.pu +++ /dev/null @@ -1,10 +0,0 @@ -actor host as "Host" -participant cldma as "CodeLoadDMA" - -activate host -host -> host : read(): binary -host -> host : detect and strip Extended Manifest : binary_mft_code -host -> host : retrieve preload size (binary_mft_code) : preload_size - -host -> cldma : write (binary_mft_code, mft_size) -host -> cldma : write (binary_mft_code+mft_size, preload_size-mft_size) diff --git a/architectures/firmware/intel/cavs/cavs-boot/index.rst b/architectures/firmware/intel/cavs/cavs-boot/index.rst deleted file mode 100644 index 54ba2ef6..00000000 --- a/architectures/firmware/intel/cavs/cavs-boot/index.rst +++ /dev/null @@ -1,17 +0,0 @@ -.. _architecture-intel-cavs-boot: - -Booting up CAVS ADSP -#################### - -Intel has several generations of audio DSP. "CAVS" versions relate to the audio -DSP in Skylake Core and Apollo Lake Atom platforms onwards. - -Bay Trail, Cherry Trail, Braswell, Haswell, and Broadwell audio DSPs have a simpler -boot flow using memory copy and not authentication. - - -.. toctree:: - :maxdepth: 2 - - cavs-dsp-boot-overview - apollolake/index diff --git a/architectures/firmware/intel/cavs/images/idc-send-message.pu b/architectures/firmware/intel/cavs/images/idc-send-message.pu deleted file mode 100644 index f19d027e..00000000 --- a/architectures/firmware/intel/cavs/images/idc-send-message.pu +++ /dev/null @@ -1,30 +0,0 @@ -participant core0 -participant core1 -participant idc -participant platform - -core0 -> idc : idc_init() - activate idc - - idc -> platform : interrupt_register(irq, auto_unmask, irq_handler, idc) - activate platform - idc <-- platform - deactivate platform - -core0 <-- idc -deactivate idc - -core0 -> idc : idc_send_msg(idc_msg, mode) - activate idc - - idc -> core1 : irq_handler() - activate core1 - idc <-- core1 - deactivate core1 -core0 <-- idc -deactivate idc - -core1 -> idc : idc_do_cmd(data) - activate idc -idc <-- core1 -deactivate idc diff --git a/architectures/firmware/intel/cavs/smp/index.rst b/architectures/firmware/intel/cavs/smp/index.rst deleted file mode 100644 index 5aff7fc0..00000000 --- a/architectures/firmware/intel/cavs/smp/index.rst +++ /dev/null @@ -1,64 +0,0 @@ -.. _architecture-intel-smp: - -Intel SMP Architecture -###################### - -Description -*********** - -SMP architecture is used in the environment, where multiple processors are -connected to a single shared memory, have access to all input and output -interfaces, and are controlled by a single operating system. In our case, -we have multiple Xtensa DSP cores, which use the same Firmware binary loaded -to the shared L2 SRAM, and are controlled by the same instance of the XTOS. - -Using SMP architecture -********************** - -|SOF| implementation of SMP architecture involves separate and modified XTOS, -which can be chosen by selecting appropriate arch flag during configuration -step of building FW binary. - -.. code-block:: bash - - ./configure --with-arch=xtensa-smp --with-platform= --with-dsp-core= --with-root-dir= --host= - -Implementation details -********************** - -The data structures critical to core execution need to be instantiated -per core, instead of being accessed using static pointers. -SMP implementation creates ``struct core_context`` to meet those demands. -This structure contains pointers to the XTOS data along with -``struct irq_task``, ``struct schedule_data``, ``struct work_queue`` etc. - -.. code-block:: c - - struct core_context { - struct thread_data td; - struct irq_task *irq_low_task; - struct irq_task *irq_med_task; - struct irq_task *irq_high_task; - struct schedule_data *sch; - struct work_queue *queue; - struct idc *idc; - }; - -``struct core_context`` is allocated by primary core for secondary cores before -secondary core boot. Address of the ``struct core_context`` is written into -``THREADPTR`` processor register, which can later be retrieved by the secondary core -after boot. Every core has its own instance of ``THREADPTR``, -so ``struct core_context`` address can be read anytime at any place of the code. - -Communication between cores -*************************** - -Primary core can communicate with secondary cores by sending messages using -the IDC mechanism. This mechanism is pretty much the same as IPC. -Important data can be sent in two 32-bit IDC registers. Cores use interrupts -to register for the incoming messages. - -.. uml:: ../images/idc-send-message.pu - -.. comment "master" has been replaced with "primary" -.. comment "slave" has been replaced with "secondary" \ No newline at end of file diff --git a/architectures/firmware/sof-xtos/schedulers.rst b/architectures/firmware/sof-xtos/schedulers.rst old mode 100644 new mode 100755 index 3070599c..17d751d2 --- a/architectures/firmware/sof-xtos/schedulers.rst +++ b/architectures/firmware/sof-xtos/schedulers.rst @@ -1,4 +1,4 @@ -.. _schedulers: +.. _schedulers_xtos: Schedulers ########## diff --git a/architectures/firmware/sof-zephyr/rtos_layer/zephyr_kernel_overview.rst b/architectures/firmware/sof-zephyr/rtos_layer/zephyr_kernel_overview.rst old mode 100644 new mode 100755 index b6d0e3fb..e8e9ada2 --- a/architectures/firmware/sof-zephyr/rtos_layer/zephyr_kernel_overview.rst +++ b/architectures/firmware/sof-zephyr/rtos_layer/zephyr_kernel_overview.rst @@ -316,7 +316,7 @@ events that are already in the circular buffer will be dropped. .. TODO: Add link to SOF Telemetry interface documentation -.. _Schedulers: +.. _schedulers_zephyr: Schedulers ---------- From 30cfc411efbb726878ba7ed42d24a3a7bda1e04e Mon Sep 17 00:00:00 2001 From: Deb Date: Tue, 4 Oct 2022 18:00:02 -0600 Subject: [PATCH 195/290] remove unnecessary file Signed-off-by: Deb --- architectures/firmware/intel/cavs/index.rst | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100755 architectures/firmware/intel/cavs/index.rst diff --git a/architectures/firmware/intel/cavs/index.rst b/architectures/firmware/intel/cavs/index.rst deleted file mode 100755 index 4f3ac9a7..00000000 --- a/architectures/firmware/intel/cavs/index.rst +++ /dev/null @@ -1,13 +0,0 @@ -.. _cavs-architecture-intel: - -Intel cAVS Architecture -####################### - -The details below are specific to Intel products with an audio DSP cAVS -architecture using SOF. - -.. toctree:: - :maxdepth: 1 - - cavs-boot/index - smp/index \ No newline at end of file From 9839169bc1d896dc6131cb92150a07c52653d47e Mon Sep 17 00:00:00 2001 From: Deb Date: Tue, 4 Oct 2022 19:05:47 -0600 Subject: [PATCH 196/290] Add release 2.3 info Signed-off-by: Deb --- release.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release.rst b/release.rst index 93fb89d8..922761a6 100755 --- a/release.rst +++ b/release.rst @@ -26,7 +26,7 @@ kernel, and documentation. Download the source code as a zip or tar.gz file: Source and Binary Releases -------------------------- -The latest SOF release is v2.2 (July 2022). +The latest SOF release is v2.3 (Oct 2022). View new feature information and release downloads for the latest and previous releases on GitHub. Firmware and SDK tool source code and binary From 5aaf07ab6fc8ad3503024406741c0923b3c1bfc1 Mon Sep 17 00:00:00 2001 From: Jyri Sarha Date: Tue, 4 Oct 2022 19:22:07 +0300 Subject: [PATCH 197/290] developer_guides: debugability: probes: Logging backend sof-probes update Added firmware kconfig options for enabling probes and logging backend. Also added notes about the latest updates for sof-probes demuxing tool. Signed-off-by: Jyri Sarha --- .../debugability/probes/index.rst | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/developer_guides/debugability/probes/index.rst b/developer_guides/debugability/probes/index.rst index dc019629..1984392a 100644 --- a/developer_guides/debugability/probes/index.rst +++ b/developer_guides/debugability/probes/index.rst @@ -65,6 +65,28 @@ Firmware side make menuconfig + The following options available + + Required for audio probes: + + .. code-block:: bash + + CONFIG_PROBE=y # enable probes + CONFIG_PROBE_POINTS_MAX=16 # max probepoints + + Required for logging through probes interface: + + .. code-block:: bash + + CONFIG_LOG_BACKEND_SOF_PROBE=y + CONFIG_ZEPHYR_LOG=y + + This option enables the probes logging automatically when probes extraction DMA is started: + + .. code-block:: bash + + CONFIG_LOG_BACKEND_SOF_PROBE_OUTPUT_AUTO_ENABLE=y + - Refer to **Step 3 Build firmware binaries** in :ref:`Build SOF from Scratch ` for reference. Note that you do not need to modify the audio topology file. @@ -101,6 +123,7 @@ the last stage of extraction. - Pause the playback stream. (optional) - Add probe points via the ``debugfs`` "probe_points" entry in ``/sys/kernel/debug/sof`` + For example, to add a buffer with 7 probe points: .. code-block:: bash @@ -159,4 +182,14 @@ Usage and ouput: sof-probes: done As a result, ``buffer_7.wav`` is generated in the *tools/build_tools/probes* folder. The wave file can then be examined with your tool of choice -such as ``Audacity``. \ No newline at end of file +such as ``Audacity``. + + +Simple logging case +******************* + +With the crecord and sof-probes in path, probes logging backend with auto enable option it is possible to get the firmware logs to stdout with this command combination: + +.. code-block:: bash + + crecord -c3 -d0 -b8192 -f4 -FS32_LE -R48000 -C4 | sof-probes -l From 510fc9df6b675deb3934185d1ab87a6731b7ed85 Mon Sep 17 00:00:00 2001 From: Jyri Sarha Date: Tue, 4 Oct 2022 19:26:53 +0300 Subject: [PATCH 198/290] developer_guides: debugability: probes: Fix misleading statement The statement about enabling a single probe point for buffer #7 was misleading. Signed-off-by: Jyri Sarha --- developer_guides/debugability/probes/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/developer_guides/debugability/probes/index.rst b/developer_guides/debugability/probes/index.rst index 1984392a..880328b1 100644 --- a/developer_guides/debugability/probes/index.rst +++ b/developer_guides/debugability/probes/index.rst @@ -124,7 +124,7 @@ the last stage of extraction. - Add probe points via the ``debugfs`` "probe_points" entry in ``/sys/kernel/debug/sof`` - For example, to add a buffer with 7 probe points: + For example, to add buffer 7 with a probe point: .. code-block:: bash From 30431cf5ed224019386460b1f17dea61a5c50451 Mon Sep 17 00:00:00 2001 From: Jyri Sarha Date: Tue, 4 Oct 2022 19:41:23 +0300 Subject: [PATCH 199/290] developer_guides: debugability: probes: Document IPC3 and IPC4 differences Signed-off-by: Jyri Sarha --- .../debugability/probes/index.rst | 48 ++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/developer_guides/debugability/probes/index.rst b/developer_guides/debugability/probes/index.rst index 880328b1..0ef12784 100644 --- a/developer_guides/debugability/probes/index.rst +++ b/developer_guides/debugability/probes/index.rst @@ -124,7 +124,7 @@ the last stage of extraction. - Add probe points via the ``debugfs`` "probe_points" entry in ``/sys/kernel/debug/sof`` - For example, to add buffer 7 with a probe point: + For example, to add buffer 7 with a probe point (IPC3): .. code-block:: bash @@ -161,6 +161,52 @@ the last stage of extraction. strnlen(tw->sname, SNDRV_CTL_ELEM_ID_NAME_MAXLEN) > 0 ? tw->sname : "none"); + For IPC4 system, the above example looks like this: + + .. code-block:: bash + + echo 2,0,0 > probe_points + + The semantics of the buffer_id are quite different on IPC4 system: + + .. code-block:: c + + typedef union probe_point_id { + uint32_t full_id; + struct { + uint32_t module_id : 16; /**< Target module ID */ + uint32_t instance_id : 8; /**< Target module instance ID */ + uint32_t type : 2; /**< Probe point type as specified by ProbeType enumeration */ + uint32_t index : 6; /**< Queue index inside target module */ + } fields; + } __attribute__((packed, aligned(4))) probe_point_id_t; + + .. code-block:: c + + /** + * Description of probe point + */ + struct probe_point { + probe_point_id_t buffer_id; /**< ID of buffer to which probe is attached */ + uint32_t purpose; /**< PROBE_PURPOSE_xxx */ + uint32_t stream_tag; /**< Stream tag of DMA via which data will be provided for injection. + * For extraction purposes, stream tag is ignored when received, + * but returned actual extraction stream tag via INFO function. + */ + } __attribute__((packed, aligned(4))); + +Enabling the log in IPC3 system (in case auto enable is not on): + + .. code-block:: bash + + echo 0,1,0 > probe_points + +And on IPC4 system: + + .. code-block:: bash + + echo 0,0,0 > probe_points + 2. Unpause the playback stream. (optional) #. Close the playback stream when done. #. Close the crecord tool. From 1f00d980a64b032365bca0274bad5d9d7c65192d Mon Sep 17 00:00:00 2001 From: Deb Date: Thu, 13 Oct 2022 17:05:00 -0500 Subject: [PATCH 200/290] correct naming structure under firmware Signed-off-by: Deb --- architectures/firmware/index.rst | 2 +- .../cavs}/cavs-boot/apollolake/apl-boot-ldr.rst | 0 .../cavs}/cavs-boot/apollolake/apl-boot-rom.rst | 0 .../cavs}/cavs-boot/apollolake/images/apl-rom-flow.pu | 0 .../vend-intel => intel/cavs}/cavs-boot/apollolake/index.rst | 0 .../cavs}/cavs-boot/cavs-dsp-boot-overview.rst | 0 .../vend-intel => intel/cavs}/cavs-boot/images/boot-dsp.pu | 0 .../vend-intel => intel/cavs}/cavs-boot/images/boot-ldr-flow.pu | 0 .../vend-intel => intel/cavs}/cavs-boot/images/loading-bins.pu | 0 .../vend-intel => intel/cavs}/cavs-boot/images/write-bin.pu | 0 .../vend-intel => intel/cavs}/cavs-boot/index.rst | 0 .../vend-intel => intel/cavs}/images/idc-send-message.pu | 0 .../{vendor-specific/vend-intel => intel/cavs}/index.rst | 0 .../{vendor-specific/vend-intel => intel/cavs}/smp/index.rst | 0 architectures/firmware/{vendor-specific => intel}/index.rst | 2 +- 15 files changed, 2 insertions(+), 2 deletions(-) rename architectures/firmware/{vendor-specific/vend-intel => intel/cavs}/cavs-boot/apollolake/apl-boot-ldr.rst (100%) rename architectures/firmware/{vendor-specific/vend-intel => intel/cavs}/cavs-boot/apollolake/apl-boot-rom.rst (100%) rename architectures/firmware/{vendor-specific/vend-intel => intel/cavs}/cavs-boot/apollolake/images/apl-rom-flow.pu (100%) rename architectures/firmware/{vendor-specific/vend-intel => intel/cavs}/cavs-boot/apollolake/index.rst (100%) rename architectures/firmware/{vendor-specific/vend-intel => intel/cavs}/cavs-boot/cavs-dsp-boot-overview.rst (100%) rename architectures/firmware/{vendor-specific/vend-intel => intel/cavs}/cavs-boot/images/boot-dsp.pu (100%) rename architectures/firmware/{vendor-specific/vend-intel => intel/cavs}/cavs-boot/images/boot-ldr-flow.pu (100%) rename architectures/firmware/{vendor-specific/vend-intel => intel/cavs}/cavs-boot/images/loading-bins.pu (100%) rename architectures/firmware/{vendor-specific/vend-intel => intel/cavs}/cavs-boot/images/write-bin.pu (100%) rename architectures/firmware/{vendor-specific/vend-intel => intel/cavs}/cavs-boot/index.rst (100%) rename architectures/firmware/{vendor-specific/vend-intel => intel/cavs}/images/idc-send-message.pu (100%) rename architectures/firmware/{vendor-specific/vend-intel => intel/cavs}/index.rst (100%) rename architectures/firmware/{vendor-specific/vend-intel => intel/cavs}/smp/index.rst (100%) rename architectures/firmware/{vendor-specific => intel}/index.rst (94%) diff --git a/architectures/firmware/index.rst b/architectures/firmware/index.rst index f44e7ae3..839ff2e4 100755 --- a/architectures/firmware/index.rst +++ b/architectures/firmware/index.rst @@ -8,4 +8,4 @@ Firmware Architecture sof-xtos/index sof-zephyr/index - vendor-specific/index \ No newline at end of file + intel/index \ No newline at end of file diff --git a/architectures/firmware/vendor-specific/vend-intel/cavs-boot/apollolake/apl-boot-ldr.rst b/architectures/firmware/intel/cavs/cavs-boot/apollolake/apl-boot-ldr.rst similarity index 100% rename from architectures/firmware/vendor-specific/vend-intel/cavs-boot/apollolake/apl-boot-ldr.rst rename to architectures/firmware/intel/cavs/cavs-boot/apollolake/apl-boot-ldr.rst diff --git a/architectures/firmware/vendor-specific/vend-intel/cavs-boot/apollolake/apl-boot-rom.rst b/architectures/firmware/intel/cavs/cavs-boot/apollolake/apl-boot-rom.rst similarity index 100% rename from architectures/firmware/vendor-specific/vend-intel/cavs-boot/apollolake/apl-boot-rom.rst rename to architectures/firmware/intel/cavs/cavs-boot/apollolake/apl-boot-rom.rst diff --git a/architectures/firmware/vendor-specific/vend-intel/cavs-boot/apollolake/images/apl-rom-flow.pu b/architectures/firmware/intel/cavs/cavs-boot/apollolake/images/apl-rom-flow.pu similarity index 100% rename from architectures/firmware/vendor-specific/vend-intel/cavs-boot/apollolake/images/apl-rom-flow.pu rename to architectures/firmware/intel/cavs/cavs-boot/apollolake/images/apl-rom-flow.pu diff --git a/architectures/firmware/vendor-specific/vend-intel/cavs-boot/apollolake/index.rst b/architectures/firmware/intel/cavs/cavs-boot/apollolake/index.rst similarity index 100% rename from architectures/firmware/vendor-specific/vend-intel/cavs-boot/apollolake/index.rst rename to architectures/firmware/intel/cavs/cavs-boot/apollolake/index.rst diff --git a/architectures/firmware/vendor-specific/vend-intel/cavs-boot/cavs-dsp-boot-overview.rst b/architectures/firmware/intel/cavs/cavs-boot/cavs-dsp-boot-overview.rst similarity index 100% rename from architectures/firmware/vendor-specific/vend-intel/cavs-boot/cavs-dsp-boot-overview.rst rename to architectures/firmware/intel/cavs/cavs-boot/cavs-dsp-boot-overview.rst diff --git a/architectures/firmware/vendor-specific/vend-intel/cavs-boot/images/boot-dsp.pu b/architectures/firmware/intel/cavs/cavs-boot/images/boot-dsp.pu similarity index 100% rename from architectures/firmware/vendor-specific/vend-intel/cavs-boot/images/boot-dsp.pu rename to architectures/firmware/intel/cavs/cavs-boot/images/boot-dsp.pu diff --git a/architectures/firmware/vendor-specific/vend-intel/cavs-boot/images/boot-ldr-flow.pu b/architectures/firmware/intel/cavs/cavs-boot/images/boot-ldr-flow.pu similarity index 100% rename from architectures/firmware/vendor-specific/vend-intel/cavs-boot/images/boot-ldr-flow.pu rename to architectures/firmware/intel/cavs/cavs-boot/images/boot-ldr-flow.pu diff --git a/architectures/firmware/vendor-specific/vend-intel/cavs-boot/images/loading-bins.pu b/architectures/firmware/intel/cavs/cavs-boot/images/loading-bins.pu similarity index 100% rename from architectures/firmware/vendor-specific/vend-intel/cavs-boot/images/loading-bins.pu rename to architectures/firmware/intel/cavs/cavs-boot/images/loading-bins.pu diff --git a/architectures/firmware/vendor-specific/vend-intel/cavs-boot/images/write-bin.pu b/architectures/firmware/intel/cavs/cavs-boot/images/write-bin.pu similarity index 100% rename from architectures/firmware/vendor-specific/vend-intel/cavs-boot/images/write-bin.pu rename to architectures/firmware/intel/cavs/cavs-boot/images/write-bin.pu diff --git a/architectures/firmware/vendor-specific/vend-intel/cavs-boot/index.rst b/architectures/firmware/intel/cavs/cavs-boot/index.rst similarity index 100% rename from architectures/firmware/vendor-specific/vend-intel/cavs-boot/index.rst rename to architectures/firmware/intel/cavs/cavs-boot/index.rst diff --git a/architectures/firmware/vendor-specific/vend-intel/images/idc-send-message.pu b/architectures/firmware/intel/cavs/images/idc-send-message.pu similarity index 100% rename from architectures/firmware/vendor-specific/vend-intel/images/idc-send-message.pu rename to architectures/firmware/intel/cavs/images/idc-send-message.pu diff --git a/architectures/firmware/vendor-specific/vend-intel/index.rst b/architectures/firmware/intel/cavs/index.rst similarity index 100% rename from architectures/firmware/vendor-specific/vend-intel/index.rst rename to architectures/firmware/intel/cavs/index.rst diff --git a/architectures/firmware/vendor-specific/vend-intel/smp/index.rst b/architectures/firmware/intel/cavs/smp/index.rst similarity index 100% rename from architectures/firmware/vendor-specific/vend-intel/smp/index.rst rename to architectures/firmware/intel/cavs/smp/index.rst diff --git a/architectures/firmware/vendor-specific/index.rst b/architectures/firmware/intel/index.rst similarity index 94% rename from architectures/firmware/vendor-specific/index.rst rename to architectures/firmware/intel/index.rst index 6a4e56ee..de288ec2 100755 --- a/architectures/firmware/vendor-specific/index.rst +++ b/architectures/firmware/intel/index.rst @@ -10,4 +10,4 @@ generic SOF architecture. .. toctree:: :maxdepth: 1 - vend-intel/index \ No newline at end of file + cavs/index \ No newline at end of file From 2371a1d23a5ef73984595de1f8b2843d9f1e490f Mon Sep 17 00:00:00 2001 From: Michal Wasko Date: Wed, 6 Apr 2022 14:34:51 +0200 Subject: [PATCH 201/290] sphinx blockdiag support sphinxcontrib-blockdiag extension added to generate diagrams from the code Signed-off-by: Michal Wasko --- conf.py | 2 +- scripts/requirements-lax.txt | 2 +- scripts/requirements.txt | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/conf.py b/conf.py index b57e4291..61b5957d 100755 --- a/conf.py +++ b/conf.py @@ -31,7 +31,7 @@ # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = ['breathe', 'sphinx.ext.graphviz', 'sphinxcontrib.plantuml', - 'sphinx.ext.todo', 'sphinx.ext.extlinks', + 'sphinx.ext.todo', 'sphinx.ext.extlinks', 'sphinxcontrib.blockdiag' ] diff --git a/scripts/requirements-lax.txt b/scripts/requirements-lax.txt index b6cb59af..7287ddf0 100644 --- a/scripts/requirements-lax.txt +++ b/scripts/requirements-lax.txt @@ -13,6 +13,7 @@ breathe>=4.7.3 sphinx>=1.6.7 docutils>=0.14 sphinx_rtd_theme>=0.2.4 +sphinxcontrib-blockdiag>=3.0.0 # - Version 0.11 is the first version that supports # `plantuml_output_format=none` which is required for instant builds. @@ -29,7 +30,6 @@ sphinx_rtd_theme>=0.2.4 # https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=896485#12 sphinxcontrib.plantuml>=0.11,<0.25 - # Differences between these "lax" version requirements and the official # ones in requirements.txt: diff --git a/scripts/requirements.txt b/scripts/requirements.txt index 516d4e06..bc8d82c1 100644 --- a/scripts/requirements.txt +++ b/scripts/requirements.txt @@ -5,3 +5,4 @@ sphinx==2.4.4 docutils==0.16 sphinx_rtd_theme sphinxcontrib-plantuml +sphinxcontrib-blockdiag From 6ec5940222f8a0ec7bdda50c68e4353a476eaa8b Mon Sep 17 00:00:00 2001 From: Michal Wasko Date: Thu, 31 Mar 2022 17:37:47 +0200 Subject: [PATCH 202/290] arch: fw: mpp scheduling using zephyr SOF MPP scheduling description and flows using zephyr rtos infrastructure Signed-off-by: Michal Wasko --- .../images/mpp_scheduling/edf_scheduling.diag | 39 +++ .../example_DP_secondary_core_timeline.pu | 136 ++++++++ .../mpp_scheduling/example_LL_DP_timeline.pu | 95 ++++++ .../example_multiple_cores_timeline.pu | 108 +++++++ .../example_task_with_budget.pu | 50 +++ .../mpp_scheduling/schedulers_diagram.pu | 60 ++++ .../schedulers_threads_periodic_update.pu | 38 +++ .../mpp_scheduling/schedulers_zephyr.pu | 88 +++++ .../firmware/sof-zephyr/mpp_layer/index.rst | 1 + .../sof-zephyr/mpp_layer/mpp_scheduling.rst | 302 ++++++++++++++++++ 10 files changed, 917 insertions(+) create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/images/mpp_scheduling/edf_scheduling.diag create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/images/mpp_scheduling/example_DP_secondary_core_timeline.pu create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/images/mpp_scheduling/example_LL_DP_timeline.pu create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/images/mpp_scheduling/example_multiple_cores_timeline.pu create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/images/mpp_scheduling/example_task_with_budget.pu create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/images/mpp_scheduling/schedulers_diagram.pu create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/images/mpp_scheduling/schedulers_threads_periodic_update.pu create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/images/mpp_scheduling/schedulers_zephyr.pu create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/mpp_scheduling.rst diff --git a/architectures/firmware/sof-zephyr/mpp_layer/images/mpp_scheduling/edf_scheduling.diag b/architectures/firmware/sof-zephyr/mpp_layer/images/mpp_scheduling/edf_scheduling.diag new file mode 100644 index 00000000..46a3e974 --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/images/mpp_scheduling/edf_scheduling.diag @@ -0,0 +1,39 @@ +blockdiag edf_scheduling { + + node_width = 250; + node_height = 120; + default_fontsize = 16; + + Comp_1 -> Comp_2 + comment_1 -> Comp_2 [style=dashed] + Comp_2 -> Comp_3 + comment_2 -> Comp_3 [style=dashed] + Comp_3 -> Comp_4 + comment_3 -> Comp_4 [style=dashed] + Comp_4 -> sink + comment_4 -> sink [style=dashed] + + Comp_1 [label="DP component 1\n + *processing period\n + *compute requirement"] + Comp_2 [label="DP component 2\n + *processing period\n + *compute requirement"] + Comp_3 [label="DP component 3\n + *processing period\n + *compute requirement"] + Comp_4 [label="DP component 4\n + *processing period\n + *compute requirement"] + + sink [label="real time sink", shape=endpoint, fontsize = 16] + + comment_1 [label="DP1 to deliver data let\n + DP2 meet its objective"] + comment_2 [label="DP2 to deliver data let\n + DP3 meet its objective"] + comment_3 [label="DP3 to deliver data let\n + DP4 meet its objective"] + comment_4 [label="DP4 to deliver data\n + to real time-sink"] +} diff --git a/architectures/firmware/sof-zephyr/mpp_layer/images/mpp_scheduling/example_DP_secondary_core_timeline.pu b/architectures/firmware/sof-zephyr/mpp_layer/images/mpp_scheduling/example_DP_secondary_core_timeline.pu new file mode 100644 index 00000000..2d3e35c9 --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/images/mpp_scheduling/example_DP_secondary_core_timeline.pu @@ -0,0 +1,136 @@ +@startuml + +Title DP tasks scheduling on secondary DSP core + +legend +Assumptions: +1) 1ms scheduling +2) No LL tasks assigned to example secondary DSP core +3) DP Task B do not depend on Task A completion +(otherwise, Task B would start on next timer interrupt after A +completion) +end legend + +scale 1 as 150 pixels + +concise "Task B" as Task_B +concise "Task A" as Task_A + +concise "DP task processing" as DP_Processing +robust "DSP" as DSP +concise "Timer interrupt" as Interrupt + + +@Task_A +0 is Busy +1.5 is {-} + +4 is Busy +5.5 is {-} + +8 is Busy +9.5 is {-} + +@0 <-> @4: Task A schedule period (4ms) +@4 <-> @5.5: Task A execution time (1.5ms) + +DP_Processing@0 -[#Orange]> Task_A@0 +DP_Processing@1 -[#Orange]> Task_A@1 +DP_Processing@1.5 -[#Orange]> Task_A@1.5 + + +@Task_B +0 is Busy +2 is {-} + +6 is Busy +8 is {-} + +@0 <-> @6: Task B schedule period (6ms) +@6 <-> @8: Task B execution time (2ms) + +DP_Processing@1.5 -[#Brown]> Task_B@0 +DP_Processing@2 -[#Brown]> Task_B@0.5 +DP_Processing@3 -[#Brown]> Task_B@1.5 +DP_Processing@3.5 -[#Brown]> Task_B@2 + +DSP is Idle +DP_Processing is {-} + +@0 +DP_Processing is "A" + +@0 +Interrupt -[#DarkViolet]> DSP +DSP -> DP_Processing +DSP is "Scheduling" +DP_Processing is "A" + +@1 +Interrupt -[#DarkViolet]> DSP +DSP -> DP_Processing +DP_Processing is "A" + +@1.5 +DP_Processing -> DSP +DSP -> DP_Processing +DP_Processing is "B" + +@2 +Interrupt -[#DarkViolet]> DSP +DSP -> DP_Processing +DP_Processing is "B" + +@3 +Interrupt -[#DarkViolet]> DSP +DSP -> DP_Processing +DP_Processing is "B" + +@3.5 +DP_Processing -> DSP +DSP is Idle +DP_Processing is {-} + +@4 +Interrupt -[#DarkViolet]> DSP +DSP is "Scheduling" +DSP -> DP_Processing +DP_Processing is "A" + +@5 +Interrupt -[#DarkViolet]> DSP +DSP -> DP_Processing +DP_Processing is "A" + +@5.5 +DP_Processing -> DSP +DSP is Idle +DP_Processing is {-} + +@6.001 +Interrupt -[#DarkViolet]> DSP +DSP -> DP_Processing +DSP is "Scheduling" +DP_Processing is "B" + +@7.001 +Interrupt -[#DarkViolet]> DSP +DSP -> DP_Processing +DP_Processing is "B" + +@8.001 +Interrupt -[#DarkViolet]> DSP +DSP -> DP_Processing +DP_Processing is "A" + +@9.001 +Interrupt -[#DarkViolet]> DSP +DSP -> DP_Processing +DP_Processing is "A" + +@9.5 +DP_Processing -> DSP +DSP is Idle +DP_Processing is {-} + +@enduml diff --git a/architectures/firmware/sof-zephyr/mpp_layer/images/mpp_scheduling/example_LL_DP_timeline.pu b/architectures/firmware/sof-zephyr/mpp_layer/images/mpp_scheduling/example_LL_DP_timeline.pu new file mode 100644 index 00000000..74a91cce --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/images/mpp_scheduling/example_LL_DP_timeline.pu @@ -0,0 +1,95 @@ +@startuml + +Title Task scheduling on DSP core + +legend +Assumptions: +1) 1ms scheduling +2) 0.1ms takes LL task execution +3) 0.5ms takes execution of all DP tasks +end legend + +scale 1 as 200 pixels + +concise "DP Tasks Processing" as DP_Processing +concise "LL Tasks Processing" as LL_Processing +robust "DSP" as DSP +concise "Timer Interrupt" as Interrupt + +DSP is Idle + +@DSP +@1.2 <-> @2: Time available for\nDP tasks execution +@2.2 <-> @2.7: Actual execution time\nof DP tasks +@3 <-> @3.2: Actual execution time\nof LL tasks + +@Interrupt +@0 <-> @1 : Schedule period + +@0 +Interrupt -> DSP +DSP -> LL_Processing +DSP is "Scheduling tasks" +LL_Processing is Busy +DP_Processing is {-} + +@+0.2 +DSP -> DP_Processing +LL_Processing is {-} +DP_Processing is Busy + +@+0.5 +DP_Processing -> DSP +DP_Processing is {-} +DSP is Idle + +@1 +Interrupt -> DSP +DSP -> LL_Processing +DSP is "Scheduling tasks" +LL_Processing is Busy + +@+0.2 +DSP -> DP_Processing +LL_Processing is {-} +DP_Processing is Busy + +@+0.5 +DP_Processing -> DSP +DP_Processing is {-} +DSP is Idle + +@2 +Interrupt -> DSP +DSP -> LL_Processing +DSP is "Scheduling tasks" +LL_Processing is Busy + +@+0.2 +DSP -> DP_Processing +LL_Processing is {-} +DP_Processing is Busy + +@+0.5 +DP_Processing -> DSP +DP_Processing is {-} +DSP is Idle + +@3 +Interrupt -> DSP +DSP -> LL_Processing +DSP is "Scheduling tasks" +LL_Processing is Busy + +@+0.2 +DSP -> DP_Processing + +LL_Processing is {-} +DP_Processing is Busy + +@+0.5 +DP_Processing -> DSP +DP_Processing is {-} +DSP is Idle + +@enduml diff --git a/architectures/firmware/sof-zephyr/mpp_layer/images/mpp_scheduling/example_multiple_cores_timeline.pu b/architectures/firmware/sof-zephyr/mpp_layer/images/mpp_scheduling/example_multiple_cores_timeline.pu new file mode 100644 index 00000000..1aa419e7 --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/images/mpp_scheduling/example_multiple_cores_timeline.pu @@ -0,0 +1,108 @@ +@startuml + +Title Tasks scheduling on multiple DSP cores + +legend +Assumptions: +1) 1ms system tick + +Notes: +2) Core #0 has only LL tasks assigned schedule in 1ms period +3) Core #1 has one DP task assigned that is dependent on Core #0 LL tasks data, scheduled in 1ms period +(e.g. multicore pipeline with DP module scheduled on separate core) +4) Core #2 has LL tasks scheduled in 1ms period and DP task scheduled in 2ms period +(e.g. pipeline processing with LL and DP components components where DP component has 2ms scheduling period) +end legend + +scale 1 as 300 pixels + +concise "DSP #2" as DSP_2 +concise "DSP #1" as DSP_1 +concise "DSP #0" as DSP_0 + +concise "Timer interrupt" as Interrupt + +@DSP_0 +0 is "LL proc." +0.5 is {-} + +1 is "LL proc." +1.5 is {-} + +2 is "LL proc." +2.5 is {-} + +3 is "LL proc." +3.5 is {-} + +4 is "LL proc." +4.5 is {-} + +@0 <-> @1: DSP#0 LL schedule period (1ms) + +@DSP_1 +0 is {-} + +1 is "DP proc." +1.6 is {-} + +2 is "DP proc." +2.6 is {-} + +3 is "DP proc." +3.6 is {-} + +4 is "DP proc." +4.6 is {-} +5 is {-} + +@0 <-> @1: delay one period (waiting for first DSP#0 LL data) +@1 <-> @2: DSP#1 DP schedule period (1ms) + +@DSP_2 + +0 is "LL proc." +0.3 is {-} + +1 is "LL proc." +1.3 is {-} + +2 is "LL proc." +2.3 is "DP proc." + +3 is "LL proc." +3.3 is "DP proc." +3.7 is {-} + +4 is "LL proc." +4.3 is "DP proc." + +@0 <-> @1: DSP#2 LL schedule period (1ms) +@2.3 <-> @4.3: DSP#2 DP schedule period (2ms) + +@0 +Interrupt -[#DarkViolet]> DSP_0 +Interrupt -[#DarkViolet]> DSP_1 +Interrupt -[#DarkViolet]> DSP_2 + +@1 +Interrupt -[#DarkViolet]> DSP_0 +Interrupt -[#DarkViolet]> DSP_1 +Interrupt -[#DarkViolet]> DSP_2 + +@2 +Interrupt -[#DarkViolet]> DSP_0 +Interrupt -[#DarkViolet]> DSP_1 +Interrupt -[#DarkViolet]> DSP_2 + +@3 +Interrupt -[#DarkViolet]> DSP_0 +Interrupt -[#DarkViolet]> DSP_1 +Interrupt -[#DarkViolet]> DSP_2 + +@4 +Interrupt -[#DarkViolet]> DSP_0 +Interrupt -[#DarkViolet]> DSP_1 +Interrupt -[#DarkViolet]> DSP_2 + +@enduml diff --git a/architectures/firmware/sof-zephyr/mpp_layer/images/mpp_scheduling/example_task_with_budget.pu b/architectures/firmware/sof-zephyr/mpp_layer/images/mpp_scheduling/example_task_with_budget.pu new file mode 100644 index 00000000..c4b27de9 --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/images/mpp_scheduling/example_task_with_budget.pu @@ -0,0 +1,50 @@ +@startuml + +skinparam maxMessageSize 400 +skinparam BoxPadding 4 + +box "SOF Firmware" #LightBlue + participant "Firmware Manager" + participant "MPP Scheduling" + participant "Zephyr Scheduler" + participant "Zephyr Thread" +end box + +activate "Zephyr Scheduler" + +"Zephyr Scheduler"-> "Zephyr Thread": schedule IPC Task with Budget (TWB) thread\n(MEDIUM_PRIO) +activate "Zephyr Thread" + + "Zephyr Thread"-> "Zephyr Thread": run + "Zephyr Thread"-> "MPP Scheduling": on processing complete + activate "MPP Scheduling" + "MPP Scheduling"-> "Zephyr Thread": k_thread_runtime_stats_get + activate "Zephyr Thread" + return + "MPP Scheduling"-> "MPP Scheduling": update IPC Task with budget\ncycles_consumed_in_sys_tick + return + "Zephyr Thread"-> "Zephyr Thread": suspend TWB Zephyr Thread\n(k_sem_take) +return + +"Zephyr Scheduler"-> "Zephyr Thread": schedule EDF thread\n(LOW_PRIO) +activate "Zephyr Thread" + "Zephyr Thread"-> "Zephyr Thread": run + + activate "Firmware Manager" + "Firmware Manager"-> "Firmware Manager": Host IPC message received + "Firmware Manager"-> "MPP Scheduling": request IPC processing + activate "MPP Scheduling" + "MPP Scheduling"-> "Zephyr Thread": resume IPC TWB Zephyr Thread\n(k_sem_give) + "MPP Scheduling" --> "Firmware Manager" + deactivate "MPP Scheduling" + deactivate "Firmware Manager" + +"Zephyr Thread" --> "Zephyr Scheduler": EDF thread gets preempted +deactivate "Zephyr Thread" + +"Zephyr Scheduler"-> "Zephyr Thread": schedule IPC task with budget thread\n(MEDIUM_PRIO) + activate "Zephyr Thread" + "Zephyr Thread"-> "Zephyr Thread": run + return + +@enduml diff --git a/architectures/firmware/sof-zephyr/mpp_layer/images/mpp_scheduling/schedulers_diagram.pu b/architectures/firmware/sof-zephyr/mpp_layer/images/mpp_scheduling/schedulers_diagram.pu new file mode 100644 index 00000000..b7e6895a --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/images/mpp_scheduling/schedulers_diagram.pu @@ -0,0 +1,60 @@ +@startuml +allowmixing + +scale max 1280 width + +package “RTOS layer” { + + package "SOF kernel extension" as KERNEL_EXTENSION { + package "MPP Scheduling" as MPP_SCHEDULING { + component "LL Tasks" as LL_TASKS + component "DP Tasks" as DP_TASKS + component "Tasks with Budget" as TWB + component "Idle Tasks" as IDLE_TASKS + + LL_TASKS -[hidden]right- DP_TASKS + DP_TASKS -[hidden]right- TWB + TWB -[hidden]right- IDLE_TASKS + } + } + + package "Zephyr" as ZEPHYR_LAYER { + package "Services" as SERVICES { + component "Timing" as TIMING + component "Interrupts" as INTERRUPTS + } + + package "Scheduling" as SCHEDULING { + component "Threads" as THREADS + component "EDF Scheduler" as EDF + component "Time-Slice Scheduler" as TIME_SLICE_SCHEDULING + + THREADS -[hidden]right- EDF + EDF -[hidden]right- TIME_SLICE_SCHEDULING + } + + package "Drivers" as DRIVERS { + component "Timer" as TIMER_DRV + component "Watchdog" as WATCHDOG_DRV + } + + package “SoC HAL” as SOC_HAL { + component "OEM SoC 1" as OEM_SOC_1 + component "OEM SoC 2" as OEM_SOC_2 + component "Other SoCs" as OTHER_SOCS + } + + component "XTHAL" as XTHAL + + SERVICES -[hidden]right- SCHEDULING + SERVICES -[hidden]down- XTHAL + SCHEDULING -[hidden]down- SOC_HAL + SCHEDULING -[hidden]down- DRIVERS + DRIVERS -[hidden]right- SOC_HAL + DRIVERS -[hidden]right- XTHAL + } + + KERNEL_EXTENSION -[hidden]down- ZEPHYR_LAYER +} + +@enduml diff --git a/architectures/firmware/sof-zephyr/mpp_layer/images/mpp_scheduling/schedulers_threads_periodic_update.pu b/architectures/firmware/sof-zephyr/mpp_layer/images/mpp_scheduling/schedulers_threads_periodic_update.pu new file mode 100644 index 00000000..5eee1041 --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/images/mpp_scheduling/schedulers_threads_periodic_update.pu @@ -0,0 +1,38 @@ +@startuml + +scale max 1280 width + +skinparam maxMessageSize 400 +skinparam BoxPadding 4 + +box "SOF Firmware" #LightBlue + participant "MPP Scheduling" + participant "Zephyr Thread" + participant "Timer" +end box + +"Timer" -> "MPP Scheduling": sys_tick callback +activate "MPP Scheduling" + +loop for each Task with Budget + "MPP Scheduling"-> "MPP Scheduling": reset task with budget\ncycles_consumed_in_sys_tick + "MPP Scheduling" -> "Zephyr Thread": k_thread_priority_set(thread, MEDIUM_PRIO) + "MPP Scheduling" -> "Zephyr Thread": k_thread_time_slice_set(thread, slice_ticks = budget) + note right: Reset priority and budget\nto default value + "MPP Scheduling"-> "Zephyr Thread": k_thread_runtime_stats_get(thread) + activate "Zephyr Thread" + return return thread_cycles - absolute number of cycles consumed + "MPP Scheduling"-> "MPP Scheduling": save thread_ref_cycles = thread_cycles as a reference +end + +loop for each DP task + opt if DP task is ready for processing + "MPP Scheduling"-> "MPP Scheduling": re-calculate task deadline + "MPP Scheduling" -> "Zephyr Thread": k_thread_deadline_set(thread, deadline) + "MPP Scheduling" -> "Zephyr Thread": resume thread + end +end + +deactivate "MPP Scheduling" + +@enduml diff --git a/architectures/firmware/sof-zephyr/mpp_layer/images/mpp_scheduling/schedulers_zephyr.pu b/architectures/firmware/sof-zephyr/mpp_layer/images/mpp_scheduling/schedulers_zephyr.pu new file mode 100644 index 00000000..834b28c4 --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/images/mpp_scheduling/schedulers_zephyr.pu @@ -0,0 +1,88 @@ +@startuml + +scale max 1280 width + +skinparam maxMessageSize 400 +skinparam BoxPadding 4 + +box "SOF" #LightBlue + participant "MPP Scheduling" + participant "Zephyr Scheduler" + participant "Zephyr Thread" + participant "Timer" +end box + +"Timer" -> "MPP Scheduling": sys_tick callback +activate "MPP Scheduling" + loop for each core + "MPP Scheduling"-> "Zephyr Scheduler": resume LL Zephyr Thread\n(k_sem_give) + activate "Zephyr Scheduler" + end + + "MPP Scheduling"-> "MPP Scheduling": DP and Task with Budget\nZephyr Threads update + +"Zephyr Scheduler"-> "Zephyr Thread": schedule LL Zephyr Thread\n(context switch) + deactivate "MPP Scheduling" + activate "Zephyr Thread" + "Zephyr Thread"-> "Zephyr Thread": zephyr_ll_run + activate "Zephyr Thread" + + loop for each LL pending task + note left: LL pending tasks are scheduled operations\nthat are waiting for certain circumstances\n(like data arrival) to start processing + opt if task is ready for processing + "Zephyr Thread"-> "Zephyr Thread": move task \nto LL run queue + end + end + + loop for each task in LL queues + "Zephyr Thread"-> "Zephyr Thread": run LL task callback + end + return + + "Zephyr Thread"-> "Zephyr Thread": suspend LL Zephyr Thread\n(k_sem_take) + return + +loop for each Task With Budget (TwB) Zephyr Thread + "Zephyr Scheduler"-> "Zephyr Thread": schedule TwB Zephyr Thread\n(context switch) + activate "Zephyr Thread" + "Zephyr Thread"-> "Zephyr Thread": run + + alt if time_slice (budget) timeout + "Zephyr Thread"-> "Zephyr Scheduler": time_slice timeout + "Zephyr Scheduler"-> "MPP Scheduling": time_slice callback(thread) + activate "MPP Scheduling" + "MPP Scheduling"-> "Zephyr Thread": k_thread_priority_set(thread, LOW_PRIO) + note right: when budget is consumed\nreset time_slice to default\nand lower priority + "MPP Scheduling"-> "Zephyr Thread": k_thread_time_slice_set(thread, slice_ticks = budget) + deactivate "MPP Scheduling" + + else if processing complete (no time_slice timeout) + "Zephyr Thread"-> "MPP Scheduling": on processing complete (thread) + activate "MPP Scheduling" + "MPP Scheduling"-> "Zephyr Thread": k_thread_runtime_stats_get(thread) + activate "Zephyr Thread" + return return thread_cycles - absolute number of cycles consumed by thread + "MPP Scheduling"->"MPP Scheduling": update thread\ncycles_consumed_in_sys_tick += (thread_cycles - thread_ref_cycles) + note right: thread_ref_cycles is a reference number of cycles consumed by thread\nupdated on each sys_tick start and processing complete + "MPP Scheduling"->"MPP Scheduling": update thread_ref_cycles = thread_cycles + return + deactivate "MPP Scheduling" + + "Zephyr Thread" -> "Zephyr Thread": suspend TwB Zephyr Thread\n(k_sem_take) + note left: TwB Threads are expected to be resumed when there is new data for processing\nfor example IPC TwB Thread will be resumed on IPC interrupt + "Zephyr Thread" --> "Zephyr Scheduler" + deactivate "Zephyr Thread" + end +end + +loop for each DP Zephyr Thread + "Zephyr Scheduler"-> "Zephyr Thread": schedule DP Zephyr Thread with earlieast deadline\n(context switch) + note right: TwB Threads with low priority are treated\nas threads with max deadline and will be\nscheduled after DP threads complete processing + activate "Zephyr Thread" + "Zephyr Thread"-> "Zephyr Thread": run + note right: DP thread runs till completion\nor till earlier deadline or\nhigher priority thread is available + return + deactivate "Zephyr Thread" +end + +@enduml diff --git a/architectures/firmware/sof-zephyr/mpp_layer/index.rst b/architectures/firmware/sof-zephyr/mpp_layer/index.rst index ddcd77f2..f28f6ab4 100644 --- a/architectures/firmware/sof-zephyr/mpp_layer/index.rst +++ b/architectures/firmware/sof-zephyr/mpp_layer/index.rst @@ -11,3 +11,4 @@ to the Application layer. :maxdepth: 1 mpp_overview + mpp_scheduling diff --git a/architectures/firmware/sof-zephyr/mpp_layer/mpp_scheduling.rst b/architectures/firmware/sof-zephyr/mpp_layer/mpp_scheduling.rst new file mode 100644 index 00000000..c4ff5631 --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/mpp_scheduling.rst @@ -0,0 +1,302 @@ +.. _sof-zephyr_mpp_scheduling: + +MPP Scheduling +############## + +This section describes MPP scheduling flows, task types and their usage in SOF +based on Zephyr API. + +MPP Scheduling defines four task categories: + +- Low Latency audio data processing tasks (LL) - high priority, +- Tasks with Budget (TwB) - medium priority, +- audio Data Processing tasks (DP) - low priority, +- background (idle) priority tasks + +**NOTE:** As of today, only LL tasks has been integrated with Zephyr. TwB, DP +and idle tasks are work in progress (WIP). + +The role of MPP Scheduling is limited to task threads definition, configuration +and state management. The thread scheduling itself is handled by Zephyr. + +MPP Scheduling is designed to: + +- address strict real-time requirements, + + - i.e. to avoid under/overflows on isochronous interfaces such as + I2S, + +- provide predictable latency, +- reduce amount of buffering needed, + +MPP Scheduling defines two tasks categories: + +Task categories characteristic: + +- LL tasks for latency sensitive audio data processing, + + - LL tasks are organized in queues shared between component instances, + - there is one non-preemptive high priority LL Thread assigned to exactly + one core. For example, for HW configuration with 4 cores there will be 4 + LL Threads, + - each queue is statically linked to one LL Thread and all queue tasks will + be processed on a core that LL Thread is assigned to, + - there are multiple queues per LL Thread which represent a priority and + guarantee tasks execution order, + +.. TODO: Add LL tasks, Threads and queues relation diagram, + +- TwB for medium priority processing (e.g., IPC/IDC message handling), + + - each TwB is scheduled as a separate preemptive thread, + - TwB has assigned budget for processing that is refreshed in each sys tick + (`Zephyr Thread time slicing + `__), + - TwB priority is dropped to low when budget is consumed, + +- DP tasks for low priority audio processing, + + - DP tasks are scheduled based on earliest deadline first (EDF) algorithm, + - each DP task is scheduled as a separate preemptive thread, + - DP tasks can be assigned to one of the available cores, + +- idle tasks for background processing, + + - idle tasks are scheduled as separate preemptive threads, + - they have the lowest priority and are scheduled when all other tasks + completed their processing, + - they are used in Fast Mode. For example, in data draining from firmware to + host. + +**NOTE:** Each task is assigned by MPP Scheduling to one core. Tasks are +executed by the assigned core till termination. + +**NOTE:** For Earliest Deadline First (EDF) algorithm description, please refer +to link: +`Wikipedia `__. + +**NOTE:** For Zephyr Scheduling description, please refer to link: +`Zephyr +Scheduling `__. + +.. uml:: images/mpp_scheduling/schedulers_diagram.pu + :caption: SOF MPP Scheduling based on Zephyr + +LL Tasks +******** + +Low Latency Tasks are executed within one of the non-preemptive high priority LL +Threads that runs all ready-to-run tasks till completion during a single cycle. +There is one LL Thread scheduled per core with its own queues and LL tasks to +execute. + +MPP Scheduling adds ready tasks to LL queues at the beginning of each scheduling +period. There are a number of queues to add tasks to. LL Thread iterates over +the queues, and runs all tasks from one queue before moving to the next queue. +Therefore, it is possible to guarantee that some tasks are always run before +others during a cycle. + +There are also two special queues: pre-run queue and post-run queue. Tasks from +pre-run queue are run at the beginning of each cycle (may consider them to have +the highest priority). + +Tasks from post-run queue are run at the end of each cycle (may consider them to +have the lowest priority). + +Example of a pre-run task may be a task registered by the sink driver that +starts the sink at the very beginning of the cycle if data was supplied during +the previous cycles and link has been stopped. + +.. TODO: Evaluate option to add time slice limit for LL thread (set limit it to + 90% to not starve potential IPC communication tasks) + +DP Tasks +******** + +The data processing components are represented as a DP tasks that are scheduled as +separate preemptive threads. DP threads scheduling is done according to EDF +(Earliest Deadline First) algorithm that is part of Zephyr. + +To meet real-time processing criteria algorithm operates by choosing component task +that is closest to its deadline (time when output data is required). + +For playback case algorithm starts from sink and going backward calculates +deadline for data delivery: + + * Time required by component to process data depend on processing period and compute. + * Goal is to process data through chain before real-time sink deadline + +EDF scheduling example + +.. blockdiag:: images/mpp_scheduling/edf_scheduling.diag + +The capture pipelines operate in the same way. + +It is important to consider that EDF assumes preemptive scheduling of the DP +Tasks and lack of dependency between them. + +Task With Budget +**************** + +This is a specialized version of DP task that has pre-allocated MCPS budget +renewed with every system tick. When the task is ready to run, then depending on +the budget left in the current system tick, either MEDIUM_PRIORITY or +LOW_PRIORITY is assigned to task thread. The latter allows for opportunistic +execution if there is no other ready task with a higher priority while the +budget is already spent. + +Examples of tasks with budget: Ipc Task, Idc Task. + +Task with Budget (TWB) has two key parameters assigned: + +- *cycles granted*: the budget per system tick, +- *cycles consumed*: number of cycles consumed in a given system_tick + for task execution + +The number of cycles consumed is being reset to 0 at the beginning of each +system_tick, renewing TWB budget. When the number of cycles consumed exceed +cycles granted, the task is switched from MEDIUM to LOW priority. When the task +with budget thread is created the MPP Scheduling is responsible to set thread +time slice equal to task budget along with setting callback on time slice +timeout. Thread time slicing guarantee that Zephyr scheduler will interrupt +execution when the budget is spent, so MPP Scheduling timeout callback can +re-evaluate task priority. + +If there is a budget left in some system tick (task spent less time or started +executing close to the system tick that preempts execution), it is reset and not +carried over to the next tick. + +**NOTE** The Zephyr Scheduler track time slice budget of the TWB when preempted +and log warning if the budget is significantly exceeded (some long critical +section inside the task’s code might be responsible for this). + +**NOTE** The MPP Scheduling must be notified by TWB on processing complete and +update cycles consumed in the current system tick. This allows to schedule TWB +more than once (if necessary) in the single system tick with MEDIUM_PRIORITY. +The second TWB schedule should be done with modified time slice value, equal to +delta between budget and cycles consumed. + +Scheduling flows +**************** + +Zephyr scheduling +================= + +The presented Zephyr scheduling flow takes place on each core that has +MPP tasks scheduled. + +.. uml:: images/mpp_scheduling/schedulers_zephyr.pu + :caption: Zephyr scheduling of MPP threads flow + + +MPP Data Processing and Task with Budget threads periodic update +================================================================ + +Zoom in to Data Processing (Earliest Deadline First) and Task with Budget +Threads periodic update operations on each system tick start. + +.. uml:: images/mpp_scheduling/schedulers_threads_periodic_update.pu + :caption: DP and TWB threads sys tick update flow + + +Task with budget scheduling +=========================== + +.. uml:: images/mpp_scheduling/example_task_with_budget.pu + :caption: Task with budget example scheduling flow + + +Example timeline of MPP Scheduling on a DSP core +================================================= + +The below diagram shows how scheduling looks like on a DSP core. At the timer +interrupt, LL scheduler runs as the first one and then DP scheduler is executed. + +.. uml:: images/mpp_scheduling/example_LL_DP_timeline.pu + :caption: Example timeline of MPP Scheduling on DSP core with LL and DP tasks scheduling + + +Example timeline of DP tasks scheduling on secondary DSP core +============================================================== + +The below diagram shows a detailed example of how DP tasks are scheduled +on the secondary DSP core. + +.. uml:: images/mpp_scheduling/example_DP_secondary_core_timeline.pu + :caption: Example of DP tasks scheduling on secondary DSP core + + +Example timeline of MPP scheduling on multiple DSP cores +======================================================== + +The below diagram shows how scheduling looks like on many DSP cores. The DP task +deadlines are reevaluated on each core in Timer sys tick callback. + +.. uml:: images/mpp_scheduling/example_multiple_cores_timeline.pu + :caption: Example of MPP Scheduling on many cores - LL and DP tasks scheduling + +Fast Mode +********* + +The Fast Mode is used to process data faster than real time. The processing +faster than real time is only needed for a short time period and it happens i.e. +when firmware performs low power Wake on Voice. In such case SOF firmware is +working in low power mode, performing i.e. key phrase detection algorithm, +accumulating last few seconds of audio samples in history buffer. When a key +phrase detection happens, there is a need to stream the accumulated history to +Host as quickly as possible with optional additional processing on DSP. It is +only possible when a sink interface to Host transfer burst of data from DSP. + +The Fast Mode is an idle low priority task. The task is only executed when other +DP tasks with deadlines has completed their processing and there is still enough +DSP cycles before a next system tick. + +When the Fast Mode task is created by i.e. History Buffer, the component +instance (i.e. History Buffer) needs to provide a list of LL component instances +that will be executed within a Fast Mode thread, similar as it is done with LL +tasks queues and LL Thread. When the Fast Mode thread is executed it will +trigger processing of LL components in similar way as LL Thread does. The Fast +Mode task is executed in the critical section. It will check if there is data +available in an input queue and there is enough space in an output queue. Only +then it will execute a LL component. What is important to note is that the Fast +Mode task does not call processing on the DP components directly. + +As described in the previous sections, the processing on DP components is called +according to EDF algorithm. A periodicity of a component processing is +determined by time needed to fill an input queue using real time source of data. +When an input queue has sufficient amount of data, the processing on DP +component can be called. The input queues for DP components that are on the Fast +Mode task path will be filling much faster than real time as the side effect of +the Fast Mode task execution - LL components will move data to DP component +input queue and out of DP component output queue. As the result, DP component +can be executed much earlier than real time - a DSP task reports “ready to run” +as soon as it has sufficient amount of data in input queue and output queue has +enough space for produced frame. That can lead to starvation of other tasks and +to prevent it a Fast Mode tasks must be scheduled as idle tasks in background. + +Watchdog timer +************** + +Depending on HW configuration there can be a single watchdog timer, watchdog +available for each DSP core or none. + +All DSP cores shall enable watchdog when they are active to monitor health of +subsystem. When one of watchdogs will expire, the entire subsystem will be reset +by Host. + +Watchdog shall be enabled when: + +- DSP core is enabled, +- tasks are assigned to DSP core, + +Watchdog shall be disabled when: + +- DSP core is disabled, +- no tasks are assigned to DSP core, +- DSP core goes to low power state, + +Watchdog timer shall be programmed to value of a few scheduling periods. + +Watchdog timer when enabled shall be updated at every system tick. In case of +primary DSP core, it should be after running LL tasks. In case of secondary HP +DSP cores, it should be on system tick end. \ No newline at end of file From e5a27a4bb57f2ac77a885933c12663c7ac076978 Mon Sep 17 00:00:00 2001 From: Jyri Sarha Date: Tue, 18 Oct 2022 18:01:36 +0300 Subject: [PATCH 203/290] developer_guides: debugability: probes: Rewrite probes logging enable quide One of the PRs for automatic enabling of logging through probes interface was not accepted, and since there is not better alternative to enable the logs at the moment, document the old mething for enabling them. Restructure the documrent a bit while at it. Signed-off-by: Jyri Sarha --- .../debugability/probes/index.rst | 47 +++++++++++-------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/developer_guides/debugability/probes/index.rst b/developer_guides/debugability/probes/index.rst index 0ef12784..4f9cd559 100644 --- a/developer_guides/debugability/probes/index.rst +++ b/developer_guides/debugability/probes/index.rst @@ -12,11 +12,15 @@ from each buffer. Requirements ************ +.. _install-tinycompress: + - Install `tinycompress `_ (crecord tool) Enabling Probes *************** +.. _kernel-side: + Kernel side =========== @@ -55,6 +59,8 @@ Kernel side cat /proc/asound/cards | grep sofprobes +.. _firmware-side: + Firmware side ============= @@ -81,13 +87,9 @@ Firmware side CONFIG_LOG_BACKEND_SOF_PROBE=y CONFIG_ZEPHYR_LOG=y - This option enables the probes logging automatically when probes extraction DMA is started: + Refer to :ref:`Simple logging case` for quick guide to use probes logging interface. - .. code-block:: bash - - CONFIG_LOG_BACKEND_SOF_PROBE_OUTPUT_AUTO_ENABLE=y - -- Refer to **Step 3 Build firmware binaries** in :ref:`Build SOF from Scratch ` for reference. +- Refer to **Step 3 Build firmware binaries** in :ref:`Build SOF from Scratch ` for reference on how to build SOF FW. Note that you do not need to modify the audio topology file. @@ -195,22 +197,12 @@ the last stage of extraction. */ } __attribute__((packed, aligned(4))); -Enabling the log in IPC3 system (in case auto enable is not on): - - .. code-block:: bash - - echo 0,1,0 > probe_points - -And on IPC4 system: - - .. code-block:: bash - - echo 0,0,0 > probe_points - 2. Unpause the playback stream. (optional) #. Close the playback stream when done. #. Close the crecord tool. +.. _data-parsing: + Data parsing ************ @@ -230,12 +222,29 @@ Usage and ouput: As a result, ``buffer_7.wav`` is generated in the *tools/build_tools/probes* folder. The wave file can then be examined with your tool of choice such as ``Audacity``. +.. _simple-logging-case: Simple logging case ******************* -With the crecord and sof-probes in path, probes logging backend with auto enable option it is possible to get the firmware logs to stdout with this command combination: +With the :ref:`crecord` and :ref:`sof-probes` in path, FW built with :ref:`probes logging enabled`, and probes enabled from :ref:`Linux side`, it should be possible to extract the logs with following steps: + +#. crecord has to be started first: .. code-block:: bash crecord -c3 -d0 -b8192 -f4 -FS32_LE -R48000 -C4 | sof-probes -l + +#. then to enable logs through probes sysfw interface use following commands as root, + + IPC3 system: + +.. code-block:: bash + + echo 0,1,0 > /sys/kernel/debug/sof/probe_points + + IPC4 system: + +.. code-block:: bash + + echo 0,0,0 > /sys/kernel/debug/sof/probe_points From e1f4f89cb851b73b90abf9c21bc06aa3af52ec37 Mon Sep 17 00:00:00 2001 From: Michal Wasko Date: Tue, 26 Jul 2022 16:22:10 +0200 Subject: [PATCH 204/290] arch: fw: sof-zephyr io drivers sof-zephyr rtos architecture chapter for io drivers Signed-off-by: Michal Wasko --- .../firmware/sof-zephyr/rtos_layer/index.rst | 1 + .../io_drivers/images/io_drivers_diagram.pu | 16 ++++++++++++++ .../rtos_layer/io_drivers/index.rst | 21 +++++++++++++++++++ 3 files changed, 38 insertions(+) create mode 100644 architectures/firmware/sof-zephyr/rtos_layer/io_drivers/images/io_drivers_diagram.pu create mode 100644 architectures/firmware/sof-zephyr/rtos_layer/io_drivers/index.rst diff --git a/architectures/firmware/sof-zephyr/rtos_layer/index.rst b/architectures/firmware/sof-zephyr/rtos_layer/index.rst index 80efe77c..f8e741bf 100644 --- a/architectures/firmware/sof-zephyr/rtos_layer/index.rst +++ b/architectures/firmware/sof-zephyr/rtos_layer/index.rst @@ -11,3 +11,4 @@ workloads. :maxdepth: 1 zephyr_kernel_overview + io_drivers/index diff --git a/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/images/io_drivers_diagram.pu b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/images/io_drivers_diagram.pu new file mode 100644 index 00000000..37ce38ce --- /dev/null +++ b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/images/io_drivers_diagram.pu @@ -0,0 +1,16 @@ +frame "SOF" { + component Gateway + component GatewayExtension <> +} + +frame "Zephyr" { + component IoDriver <> + component DMA +} + +Gateway *-right- GatewayExtension + +Gateway -down- IoDriver +Gateway -down- DMA + +GatewayExtension ..> IoDriver diff --git a/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/index.rst b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/index.rst new file mode 100644 index 00000000..fcf5f665 --- /dev/null +++ b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/index.rst @@ -0,0 +1,21 @@ +.. _io_drivers: + +IO Drivers +########## + +The IO Drivers provide access to an IO HW Interfaces connected to the DSP, e.g. +I2S, DMIC, etc. and are managed as a part of the Zephyr RTOS. The Audio IO +Drivers share generic `Zephyr DAI interface `__. +For a full list of IO drivers available on the specific platform, refer to +:ref:`platforms`. HW IO is accessed via the `Gateway` interface inside the FW. +The actual implementation of that interface depends on the underlying HW IO +mechanism. Gateways use the Zephyr DMA interface to transmit the data to/from +the represented HW IO. DMA interface implementation depends on the underlying +DMA method (HDA-DMA, GPDMA, etc.). + +**NOTE:** The introduction of Gateways concept to SOF with Zephyr is a work in +progress. In existing implementation the SOF Host and DAI implementation is +still in use as a substitute of Gateways. + +.. uml:: images/io_drivers_diagram.pu + :caption: IO Drivers diagram From 2c312336c5eeae2793c88b8d39fb0826a52922af Mon Sep 17 00:00:00 2001 From: Michal Wasko Date: Tue, 26 Jul 2022 16:46:00 +0200 Subject: [PATCH 205/290] arch: fw: sof-zephyr hda io driver sof-zephyr hda io driver architecture chapter Signed-off-by: Michal Wasko --- .../rtos_layer/io_drivers/hda/hda_driver.rst | 50 +++++++++++++++++++ .../io_drivers/hda/images/hda_capture.pu | 15 ++++++ .../hda/images/hda_io_driver_deps.pu | 12 +++++ .../io_drivers/hda/images/hda_playback.pu | 15 ++++++ .../rtos_layer/io_drivers/index.rst | 8 +++ 5 files changed, 100 insertions(+) create mode 100644 architectures/firmware/sof-zephyr/rtos_layer/io_drivers/hda/hda_driver.rst create mode 100644 architectures/firmware/sof-zephyr/rtos_layer/io_drivers/hda/images/hda_capture.pu create mode 100644 architectures/firmware/sof-zephyr/rtos_layer/io_drivers/hda/images/hda_io_driver_deps.pu create mode 100644 architectures/firmware/sof-zephyr/rtos_layer/io_drivers/hda/images/hda_playback.pu diff --git a/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/hda/hda_driver.rst b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/hda/hda_driver.rst new file mode 100644 index 00000000..3165775c --- /dev/null +++ b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/hda/hda_driver.rst @@ -0,0 +1,50 @@ +.. _hda_driver: + +HD-A IO Driver +############## + +.. uml:: images/hda_io_driver_deps.pu + :caption: HD-A IO Driver overview + +HD-A Gateways +************* + +Gateway Node Addressing +======================= + +There are four types of HD-A gateways. Note that the naming convention +(inherited from c-spec) names the data flow direction based on the external +entity's perspective. Therefore, "output" means that data comes to FW from the +external source and "input" means that data is sent from FW to the external +sink. + +.. uml:: images/hda_playback.pu + :caption: HD-A Playback + +.. uml:: images/hda_capture.pu + :caption: HD-A Capture + +HD-A Gateway types: + - HDA-A DMA Source, + + - DMA Host Output, + - DMA Link Input, + + - HDA-A DMA Sink, + + - DMA Host Input, + - DMA Link Output + +HD-A to HDMI +============ + +There following options are available: + + 1. Legacy HD/A (not recommended), + 2. HW chaining in the DSP (depends on HW support), + 3. SW chaining in the DSP (recommended), + 4. Full Copier-...-Copier pipeline (more resources required). + +The most resource-efficient way to do a simple HD/A to HD/A playback via the DSP +is to use the "DMA Chaining" feature. FW provides an IPC command to connect two +HD/A gateways with a simple data copier task running in the LL domain. diff --git a/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/hda/images/hda_capture.pu b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/hda/images/hda_capture.pu new file mode 100644 index 00000000..37e6a371 --- /dev/null +++ b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/hda/images/hda_capture.pu @@ -0,0 +1,15 @@ +@startuml + +component "host capture" as hc + +package FW { + component "Host Input" as hi + component "Link Output" as lo +} + +component "link capture" as lc +hc <- hi +hi <- lo +lo <- lc + +@enduml diff --git a/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/hda/images/hda_io_driver_deps.pu b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/hda/images/hda_io_driver_deps.pu new file mode 100644 index 00000000..8cfdd590 --- /dev/null +++ b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/hda/images/hda_io_driver_deps.pu @@ -0,0 +1,12 @@ + +@startuml +allowmixing + +component "hd-a io driver" as io_drv +component "hd-a gateway" as gateway +component "hd-a dma" as dma + +io_drv -right-> gateway : provides +gateway -down-> dma : use + +@enduml diff --git a/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/hda/images/hda_playback.pu b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/hda/images/hda_playback.pu new file mode 100644 index 00000000..7988d2b3 --- /dev/null +++ b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/hda/images/hda_playback.pu @@ -0,0 +1,15 @@ +@startuml + +component "host playback" as hp + +package FW { + component "Host Output" as ho + component "Link Input" as li +} + +component "link playback" as lp +hp -> ho +ho -> li +li -> lp + +@enduml diff --git a/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/index.rst b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/index.rst index fcf5f665..bc4bcc3e 100644 --- a/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/index.rst +++ b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/index.rst @@ -19,3 +19,11 @@ still in use as a substitute of Gateways. .. uml:: images/io_drivers_diagram.pu :caption: IO Drivers diagram + +Drivers +******* + +.. toctree:: + :maxdepth: 1 + + hda/hda_driver From 0c8fa85a13bac417b8309400cf19bbad6e8034b8 Mon Sep 17 00:00:00 2001 From: Michal Wasko Date: Fri, 29 Jul 2022 15:39:05 +0200 Subject: [PATCH 206/290] arch: fw: sof-zephyr i2s io driver sof-zephyr i2s io driver architecture chapter Signed-off-by: Michal Wasko --- .../rtos_layer/io_drivers/i2s/i2s_driver.rst | 110 ++++++++++++++++++ .../io_drivers/i2s/images/i2s_diagram.pu | 18 +++ .../io_drivers/i2s/images/i2s_tdm.dot | 38 ++++++ .../rtos_layer/io_drivers/index.rst | 1 + 4 files changed, 167 insertions(+) create mode 100644 architectures/firmware/sof-zephyr/rtos_layer/io_drivers/i2s/i2s_driver.rst create mode 100644 architectures/firmware/sof-zephyr/rtos_layer/io_drivers/i2s/images/i2s_diagram.pu create mode 100644 architectures/firmware/sof-zephyr/rtos_layer/io_drivers/i2s/images/i2s_tdm.dot diff --git a/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/i2s/i2s_driver.rst b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/i2s/i2s_driver.rst new file mode 100644 index 00000000..110bace9 --- /dev/null +++ b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/i2s/i2s_driver.rst @@ -0,0 +1,110 @@ +.. _i2s_driver: + +I2S IO Driver +############# + +.. uml:: images/i2s_diagram.pu + :caption: I2S IO Driver overview + +Configuration BLOB +****************** + +The Configuration Blob is a build of block structures: + - TDM slot Map, + - I2S base registers, + - MCLK configuration that allows for specifying the ratio for multiple + dividers, + - Aggregation configuration + +The ``I2sConfigurationBlobHeader`` begins with a signature followed by the BLOB +version and size. + +.. code-block:: text + + I2sConfigurationBlobHeader + { + signature and version { 0xEE, BLOB version } + size in bytes + } + +Blob Configuration structure that follows the header depends on the BLOB version. +Currently, only v2.5 is supported with the structure as follows: + +.. code-block:: text + + I2sConfigurationBlob2 + { + I2sConfigurationBlobHeader + TDM slot map ver.2 [I2S_TDM_MAX_SLOT_MAP_COUNT] + I2S base registers + MCLK configuration ver.2 + { + 2.5: Aggregation configuration + } + } + +TDM Time Slots +============== + +TDM time slots are statically assigned to streams by definition coming from +ACPI. A single stream transmits data through time slots of a single time slot +group. For example, 8 TDM time slots may be grouped by the following definition +from ACPI: + +.. code-block:: text + + tsd[0] = 0xFFFFFF43, tsd[1] = 0xFFFFFF01, ... + +where: + - Stream 0 specifies time_slot_group_index = 1, + - Stream 1 uses time_slot_group_index = 0 + +that would mean that the 1st TDM slot is mapped to S0 Ch0; the 0th TDM slot is +mapped to S0 Ch1; the 3rd TDM slot is mapped to S1 Ch0, and 4th TDM slot is +mapped to S1 Ch1. + +.. graphviz:: images/i2s_tdm.dot + :caption: I2S TDM + +Configuring BCLK Clock Input Source +=================================== + +The I2S Link BCLK may be configured to use on the SoC available clock sources. + +Example BCLK clock sources: + + - XTAL Oscillator clock, + - Audio Cardinal clock, + - Audio PLL fixed clock, + - MCLK + +Clock selection is programmed using values provided in the I2S Configuration +BLOB for the MCDSS and MNDSS fields of the MDIVCTRL register. + +Link Synchronization (and Aggregation) +====================================== + +Applies to sync of the streams started together as well as to synchronizing new +stream with already running ones. + +.. note:: The same configuration must be set to all involved I2S ports. Specifically, + all the ports must be driven by the same clock source. Moreover, there might + be clock source SoC limitations. For example, in the TGL the M/N divider has + to be selected for aggregation case. + +.. list-table:: + :widths: 25 25 50 + :header-rows: 1 + + * - Synchronized + - Provider Mode + - Consumer Mode + * - Stream start + - Yes + - Yes + * - BCLK, SFRM + - Yes + - By hooking up to the same I2S provider + +"Single" I2S links may be synchronized and aggregated by sending I2sSyncData to +the I2S IO Driver. diff --git a/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/i2s/images/i2s_diagram.pu b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/i2s/images/i2s_diagram.pu new file mode 100644 index 00000000..d49b4d50 --- /dev/null +++ b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/i2s/images/i2s_diagram.pu @@ -0,0 +1,18 @@ +@startuml + +hide methods +hide attributes + +class I2sSink --() Gateway +class I2sSource --() Gateway +class I2sDriver --() IoDriver +class I2sChannel +class I2sInputChannel + +I2sChannel --* I2sDriver +I2sInputChannel --|> I2sChannel +I2sOutputChannel --|> I2sChannel +I2sSink --o I2sOutputChannel +I2sSource --o I2sInputChannel + +@enduml diff --git a/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/i2s/images/i2s_tdm.dot b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/i2s/images/i2s_tdm.dot new file mode 100644 index 00000000..db699bbd --- /dev/null +++ b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/i2s/images/i2s_tdm.dot @@ -0,0 +1,38 @@ +digraph G { + node [fontsize=10,shape=record,height=.1]; + splines=false + + subgraph clusterAcpi { + label="tdm_ts_group[8]"; fontsize=10; + tdm_acpi [label="FFFFFF43 |FFFFFF01 |..."]; + } + + subgraph clusterStr0 { + label="Stream 0"; fontsize=10; color="#C4D600"; + + str0_cfg [label="\{ time_slot_group_index=1\}"]; + str0_cfg -> tdm_acpi:acpi1 [style=dotted]; + + str0 [label="L |R |... |

" color="#C4D600"]; + } + + subgraph clusterStr1 { + label="Stream 1"; fontsize=10; color="#FFA300" + + str1_cfg [label="\{ time_slot_group_index=0\}"] + str1_cfg -> tdm_acpi:acpi0 [style=dotted] + + str1 [label="L |R |..." color="#FFA300"] + } + + str [label="<0>R |<1>L |<2> |<3>L |<4>R |<5> |<6> |<7> "] + + str0:l -> str:1 + str0:r -> str:0 + + str1:l -> str:3 + str1:r -> str:4 + + {rank=min; tdm_acpi} + {rank=max; str} +} diff --git a/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/index.rst b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/index.rst index bc4bcc3e..83abc6e5 100644 --- a/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/index.rst +++ b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/index.rst @@ -27,3 +27,4 @@ Drivers :maxdepth: 1 hda/hda_driver + i2s/i2s_driver From 074ea66fbb90b521950865b2f0bff54222ddabcb Mon Sep 17 00:00:00 2001 From: Michal Wasko Date: Thu, 11 Aug 2022 11:59:32 +0200 Subject: [PATCH 207/290] arch: fw: sof-zephyr dmic io driver dmic io driver architecture chapter Signed-off-by: Michal Wasko --- .../io_drivers/dmic/dmic_driver.rst | 44 +++++++++++++++++++ .../io_drivers/dmic/images/dmic_diagram.pu | 30 +++++++++++++ .../dmic/images/dmic_gateway_init.pu | 23 ++++++++++ .../dmic/images/dmic_gateway_release.pu | 23 ++++++++++ .../images/dmic_gateway_state_transitions.pu | 19 ++++++++ .../rtos_layer/io_drivers/index.rst | 1 + 6 files changed, 140 insertions(+) create mode 100644 architectures/firmware/sof-zephyr/rtos_layer/io_drivers/dmic/dmic_driver.rst create mode 100644 architectures/firmware/sof-zephyr/rtos_layer/io_drivers/dmic/images/dmic_diagram.pu create mode 100644 architectures/firmware/sof-zephyr/rtos_layer/io_drivers/dmic/images/dmic_gateway_init.pu create mode 100644 architectures/firmware/sof-zephyr/rtos_layer/io_drivers/dmic/images/dmic_gateway_release.pu create mode 100644 architectures/firmware/sof-zephyr/rtos_layer/io_drivers/dmic/images/dmic_gateway_state_transitions.pu diff --git a/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/dmic/dmic_driver.rst b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/dmic/dmic_driver.rst new file mode 100644 index 00000000..6da57691 --- /dev/null +++ b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/dmic/dmic_driver.rst @@ -0,0 +1,44 @@ +.. _dmic_driver: + +DMIC IO Driver +############## + +.. uml:: images/dmic_diagram.pu + :caption: DMIC IO Driver overview + +Gateway Initialization +********************** + +.. uml:: images/dmic_gateway_init.pu + :caption: DMIC Input Gateway Initialization + +DMIC HW is initialized as follows: + + 1. Mute microphones. + 2. Enable clock on microphones (also enable CIC and FIRs). + 3. Wait for clock stabilization (SoC defined delay). + 4. Unmute microphones using a curved ramp until the DC offset is gone and + replaced with the live stream. + +Configuration BLOB +****************** + +DMIC IO Driver is prepared for the configuration BLOB to come in context of any +instance of the DmicInput at any time. The configuration may be rejected if the +current state of PDM controllers and FIFOs is inappropriate. Accepting the +configuration does not always mean that it is immediately programmed to the HW. +The configuration is global, so when sent by an instance of DmicInput while +another instance is already running it is just compared with already programmed +data for the sake of consistency. + +Gateway Release +*************** + +.. uml:: images/dmic_gateway_release.pu + :caption: DMIC Input Gateway Release + +State Transitions +***************** + +.. uml:: images/dmic_gateway_state_transitions.pu + :caption: DMIC Input Gateway State Transition diff --git a/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/dmic/images/dmic_diagram.pu b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/dmic/images/dmic_diagram.pu new file mode 100644 index 00000000..6dc94a0c --- /dev/null +++ b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/dmic/images/dmic_diagram.pu @@ -0,0 +1,30 @@ +@startuml + +hide methods +hide attributes + +component Zephyr { + class DmicDriver + interface dai_dmic_ops + interface dai_driver_api +} + +component MPP { + interface Gateway + + interface IoDriver + class DmicManager + class DmicInput +} + +DmicDriver -up- dai_dmic_ops + +dai_dmic_ops -left-|> dai_driver_api : implements + +DmicManager -up- IoDriver +DmicManager -left-> DmicInput : manages +DmicInput -up- Gateway +DmicInput -down-> dai_dmic_ops : calls +DmicDriver --* DmicInput + +@enduml diff --git a/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/dmic/images/dmic_gateway_init.pu b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/dmic/images/dmic_gateway_init.pu new file mode 100644 index 00000000..f8a938f4 --- /dev/null +++ b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/dmic/images/dmic_gateway_init.pu @@ -0,0 +1,23 @@ +@startuml + +participant "DMIC Manager" as dmic_manager +participant "Zephyr PM Subsystem" as zephyr_pm +participant "DMIC Driver" as dmic_driver + +-> dmic_manager : gateway_allocate() + activate dmic_manager + dmic_manager -> zephyr_pm : pm_runtime_device_get (dmic) + + activate zephyr_pm + zephyr_pm -> zephyr_pm : increase usage count + opt if usage == 1 + zephyr_pm -> dmic_driver : pm_device_resume + activate dmic_driver + return + end + return + + deactivate dmic_manager +<-- dmic_manager + +@enduml diff --git a/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/dmic/images/dmic_gateway_release.pu b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/dmic/images/dmic_gateway_release.pu new file mode 100644 index 00000000..9afebab9 --- /dev/null +++ b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/dmic/images/dmic_gateway_release.pu @@ -0,0 +1,23 @@ +@startuml + +participant "DMIC Manager" as dmic_manager +participant "Zephyr PM Subsystem" as zephyr_pm +participant "DMIC Driver" as dmic_driver + +-> dmic_manager : gateway_release() + activate dmic_manager + dmic_manager -> zephyr_pm : pm_runtime_device_put (dmic) + + activate zephyr_pm + zephyr_pm -> zephyr_pm : decrease usage count + opt if usage == 0 + zephyr_pm -> dmic_driver : pm_device_suspend + activate dmic_driver + return + end + return + + deactivate dmic_manager +<-- dmic_manager + +@enduml diff --git a/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/dmic/images/dmic_gateway_state_transitions.pu b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/dmic/images/dmic_gateway_state_transitions.pu new file mode 100644 index 00000000..ee592ed6 --- /dev/null +++ b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/dmic/images/dmic_gateway_state_transitions.pu @@ -0,0 +1,19 @@ + +participant "Dmic Input\nGateway" as dmic_input +participant "DMA" as dma + +== Dmic Input : STOPPED == + +-> dmic_input : STOPPED + dmic_input -> dma : stop() + +== Dmic Input : PAUSED == + +-> dmic_input : PAUSED + dmic_input -> dma : init_transfer() + dmic_input -> dma : pause() + +== Dmic Input : RUNNING == + +-> dmic_input : RUNNING + dmic_input -> dma : start() diff --git a/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/index.rst b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/index.rst index 83abc6e5..52562049 100644 --- a/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/index.rst +++ b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/index.rst @@ -28,3 +28,4 @@ Drivers hda/hda_driver i2s/i2s_driver + dmic/dmic_driver From c8dde81408ab5df7b6d56ebac8bf154a662ae3ca Mon Sep 17 00:00:00 2001 From: Michal Wasko Date: Tue, 5 Apr 2022 08:59:16 +0200 Subject: [PATCH 208/290] arch: fw: asynchronous messaging service Introduction of service to exchange events between firmware components Signed-off-by: Michal Wasko --- .../sof-zephyr/mpp_layer/async_messaging.rst | 42 +++++ .../flow_prod_cons_same_core.pu | 83 ++++++++++ .../flow_prod_primary_cons_secondary_core.pu | 153 ++++++++++++++++++ .../firmware/sof-zephyr/mpp_layer/index.rst | 1 + 4 files changed, 279 insertions(+) create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/async_messaging.rst create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/images/async_messaging/flow_prod_cons_same_core.pu create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/images/async_messaging/flow_prod_primary_cons_secondary_core.pu diff --git a/architectures/firmware/sof-zephyr/mpp_layer/async_messaging.rst b/architectures/firmware/sof-zephyr/mpp_layer/async_messaging.rst new file mode 100644 index 00000000..bb6517b1 --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/async_messaging.rst @@ -0,0 +1,42 @@ +.. _async_msg: + +Asynchronous Messaging Service +############################## + +Asynchronous Messaging Service (AMS) is designed to exchange sporadic / +asynchronous events between firmware components, such as key phrase detection. +It can also be optionally selected in the firmware build configuration. The +service exposes an external interface to the host and is API accessible from +firmware components. + +**NOTE:** The AMS integration is currently a work in progress; it might not be +fully functional in SOF main branch. + +Asynchronous messages are one-way from producer to all consumers and allows to: + + - direct asynchronous communication between components (1:1) + - sending one asynchronous message to many components (1:N) + - producing asynchronous messages by many modules where 1 is receiving (M:1) + - producing asynchronous messages by many modules where many are receiving (M:N) + +Messages are exchanged over IDC protocol and shared memory with multi-core +support. Message producers and consumers can be run on different cores. + +.. TODO: Add link to AMS interface generated from code + +Asynchronous Messaging Flows +**************************** + +Producer and consumer on the same core +====================================== + +.. uml:: images/async_messaging/flow_prod_cons_same_core.pu + :caption: Asynchronous Messaging example with WoV producer and custom module consumer running on single core + +Producer on primary core, consumer on secondary core +==================================================== + +.. uml:: images/async_messaging/flow_prod_primary_cons_secondary_core.pu + :caption: Asynchronous Messaging example with WoV producer on primary core and custom module consumer running on secondary core + +.. TODO: Port additional async messaging uml flows from internal FAS documentation diff --git a/architectures/firmware/sof-zephyr/mpp_layer/images/async_messaging/flow_prod_cons_same_core.pu b/architectures/firmware/sof-zephyr/mpp_layer/images/async_messaging/flow_prod_cons_same_core.pu new file mode 100644 index 00000000..876bea23 --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/images/async_messaging/flow_prod_cons_same_core.pu @@ -0,0 +1,83 @@ +@startuml + +box "DSP #0 (primary)" #LightBlue + participant "DSP #0: AMS" as ams + participant "DSP #0: KR" as kr + participant "DSP #0: Custom module" as custom_module +end box + +box "Shared SRAM" + participant "AMS database" as ams_db +end box + +... + +group Register KEY_PHRASE_DETECTED producer + group Get Message ID + kr -> ams: am_service_get_message_type_id(KEY_PHRASE_DETECTED UUID) + activate ams + ams -> ams_db: Find ID for KEY_PHRASE_DETECTED message + activate ams_db + alt If no KEY_PHRASE_DETECTED is found + ams -> ams_db: Assign ID to KEY_PHRASE_DETECTED message + return + end + return + end + + kr -> ams: am_service_register_producer(message_id) + activate ams + return +end + +... + +group Register KEY_PHRASE_DETECTED consumer + group Get Message ID + custom_module-> custom_module + end + + custom_module -> ams: am_service_register_consumer(message_id, callback) + activate ams + ams -> ams_db: Add KEY_PHRASE_DETECTED message consumer + return +end + +... + +group Send Async Message + kr -> ams: am_service_send_message(lp_kpd_id, message) + activate ams + + ams -> ams_db: Get KEY_PHRASE_DETECTED consumers + loop Until all consumer are called + ams -> ams_db: Get AMS consumer Processor ID + + alt AMS Consumer Processor ID != Current Processor ID + ams -> ams: Forward AMS message to the consumer's core + else AMS Consumer Processor ID == Current Processor ID + ams -> ams_db: Get AMS consumer callback + ams -> ams: Call consumer AMS callback + end + end + return +end + +... + +group Unregister KEY_PHRASE_DETECTED consumer + custom_module -> ams: am_service_unregister_consumer(message_id, callback) + activate ams + ams -> ams_db: Remove KEY_PHRASE_DETECTED message consumer + return +end + +... + +group Unregister KEY_PHRASE_DETECTED producer + kr -> ams: am_service_unregister_producer(message_id) + activate ams + return +end + +@enduml diff --git a/architectures/firmware/sof-zephyr/mpp_layer/images/async_messaging/flow_prod_primary_cons_secondary_core.pu b/architectures/firmware/sof-zephyr/mpp_layer/images/async_messaging/flow_prod_primary_cons_secondary_core.pu new file mode 100644 index 00000000..60b9a7db --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/images/async_messaging/flow_prod_primary_cons_secondary_core.pu @@ -0,0 +1,153 @@ +@startuml + +scale max 1280 width + +box "DSP #0 (primary)" #LightBlue + participant "DSP #0: IXC Service" as ixc_service_dsp_0 + participant "DSP #0: IDC" as idc_dsp_0 + participant "DSP #0: AMS" as ams_dsp_0 + participant "DSP #0: KR" as kr_dsp_0 +end box + +box "DSP #1 (secondary)" #LightGreen + participant "DSP #1: IDC" as idc_dsp_1 + participant "DSP #1: Scheduler" as scheduler_dsp_1 + participant "DSP #1: IDC Task" as idc_dsp_1 + participant "DSP #1: IXC Service" as ixc_service_dsp_1 + participant "DSP #1: AMS" as ams_dsp_1 + participant "DSP #1: Custom module" as custom_module_dsp_1 +end box + +box "Shared SRAM" + participant "AMS database" as ams_db +end box + +... + +group Register KEY_PHRASE_DETECTED producer + group Get Message ID + kr_dsp_0 -> ams_dsp_0: am_service_get_message_type_id(KEY_PHRASE_DETECTED UUID) + activate ams_dsp_0 + ams_dsp_0 -> ams_db: Find ID for KEY_PHRASE_DETECTED message + activate ams_db + alt If no KEY_PHRASE_DETECTED is found + ams_dsp_0 -> ams_db: Assign ID to KEY_PHRASE_DETECTED message + end + return + return + end + + kr_dsp_0 -> ams_dsp_0: am_service_register_producer(message_id) + activate ams_dsp_0 + return +end + +... + +group Register KEY_PHRASE_DETECTED consumer + group Get Message ID + custom_module_dsp_1 -> ams_dsp_1: am_service_get_message_type_id(KEY_PHRASE_DETECTED UUID) + activate ams_dsp_1 + + ams_dsp_0 -> ams_db: Find ID for KEY_PHRASE_DETECTED message + activate ams_db + alt If no KEY_PHRASE_DETECTED is found + ams_dsp_0 -> ams_db: Assign ID to KEY_PHRASE_DETECTED message + end + return + end + + custom_module_dsp_1 -> ams_dsp_1: am_service_register_consumer(message_id) + activate ams_dsp_1 + ams_dsp_1 -> ams_db: Add KEY_PHRASE_DETECTED message consumer + return +end + +... + +group Send Async Message + kr_dsp_0 -> ams_dsp_0: am_service_send_message(message_id, message) + activate ams_dsp_0 + ams_dsp_0 -> ams_db: Get KEY_PHRASE_DETECTED consumers + + note left of ams_db + "External" means the consumers located on the other DSP cores. + "Internal" means the consumers located on the same DSP core. + end note + + loop Until all consumer are called + ams_dsp_0 -> ams_db: Get AMS consumer Processor ID + + alt AMS Consumer Processor ID != Current Processor ID + alt If a first time AMS consumer on this DSP core + alt If it is a first external AMS consumer + loop Until AMS message slot is reserved or limit of tries is reached + ams_dsp_0 -> ams_db: Reserve AMS message slot + end + + ams_dsp_0 -> ams_db: Increment a 'core use count' for AMS slot + ams_dsp_0 -> ams_db: Set MOVEMENT_REPORT message + ams_dsp_0 -> ams_dsp_0: Flush/Invalidate L1 cache + end + + ams_dsp_0 -> ixc_service_dsp_0: Send FORWARD_AMS_MESSAGE(ams_message_slot_id) IDC to the consumer's core + activate ixc_service_dsp_0 + ixc_service_dsp_0 -> idc_dsp_0: IDC Interrupt + activate idc_dsp_0 + idc_dsp_1 -> scheduler_dsp_1: Add/unblock IDC task + return + return + end + else AMS Consumer Processor ID == Current Processor ID + ams_dsp_0 -> ams_db: Get AMS consumer callback + ams_dsp_0 -> ams_dsp_0: Call consumer AMS callback + end + end + return + + ... + + scheduler_dsp_1 -> idc_dsp_1: Execute task + activate idc_dsp_1 + idc_dsp_1 -> ixc_service_dsp_1: Process IDC message + activate ixc_service_dsp_1 + ixc_service_dsp_1 -> ams_dsp_1: FORWARD_AMS_MESSAGE(ams_message_slot_id) + activate ams_dsp_1 + ams_dsp_1 -> ams_db: Get KEY_PHRASE_DETECTED consumers + loop Until all consumer are called + ams_dsp_1 -> ams_db: Get AMS consumer Processor ID + + alt AMS Consumer Processor ID == Current Processor ID + ams_dsp_1 -> ams_db: Get AMS consumer callback + alt If Custom module consumer + ams_dsp_1 -> custom_module_dsp_1: Call AMS Custom module callback + activate custom_module_dsp_1 + return + else + ams_dsp_1 -> ams_dsp_0: Call consumer AMS callback + end + end + end + return + return + return +end + +... + +group Unregister KEY_PHRASE_DETECTED produce + kr_dsp_0 -> ams_dsp_0: am_service_unregister_producer(message_id) + activate ams_dsp_0 + return +end + +... + +group Unregister KEY_PHRASE_DETECTED consumer + custom_module_dsp_1 -> ams_dsp_1: am_service_unregister_consumer(message_id) + activate ams_dsp_1 + ams_dsp_1 -> ams_db: Remove KEY_PHRASE_DETECTED message consumer + return +end + +@enduml diff --git a/architectures/firmware/sof-zephyr/mpp_layer/index.rst b/architectures/firmware/sof-zephyr/mpp_layer/index.rst index f28f6ab4..729a465e 100644 --- a/architectures/firmware/sof-zephyr/mpp_layer/index.rst +++ b/architectures/firmware/sof-zephyr/mpp_layer/index.rst @@ -12,3 +12,4 @@ to the Application layer. mpp_overview mpp_scheduling + async_messaging From 80407cb4dd77414ef62d64dbddaac3af6b3e8e8c Mon Sep 17 00:00:00 2001 From: Michal Wasko Date: Tue, 31 May 2022 09:24:39 +0200 Subject: [PATCH 209/290] developer guides: async messaging Best practices of asynchronous messaging implementation Signed-off-by: Michal Wasko --- .../sof-zephyr/mpp_layer/async_messaging.rst | 2 + .../async_messaging_best_practices.rst | 651 ++++++++++++++++++ developer_guides/firmware/index.rst | 1 + 3 files changed, 654 insertions(+) create mode 100644 developer_guides/firmware/async_messaging_best_practices.rst diff --git a/architectures/firmware/sof-zephyr/mpp_layer/async_messaging.rst b/architectures/firmware/sof-zephyr/mpp_layer/async_messaging.rst index bb6517b1..77813193 100644 --- a/architectures/firmware/sof-zephyr/mpp_layer/async_messaging.rst +++ b/architectures/firmware/sof-zephyr/mpp_layer/async_messaging.rst @@ -22,6 +22,8 @@ Asynchronous messages are one-way from producer to all consumers and allows to: Messages are exchanged over IDC protocol and shared memory with multi-core support. Message producers and consumers can be run on different cores. +Development guide: :ref:`async_messaging_best_practices` + .. TODO: Add link to AMS interface generated from code Asynchronous Messaging Flows diff --git a/developer_guides/firmware/async_messaging_best_practices.rst b/developer_guides/firmware/async_messaging_best_practices.rst new file mode 100644 index 00000000..efc49c1b --- /dev/null +++ b/developer_guides/firmware/async_messaging_best_practices.rst @@ -0,0 +1,651 @@ +.. _async_messaging_best_practices: + +Async Messaging Best Practices +############################## + +This section provides best practices and point out issues that developers should +be aware of when using asynchronous messages in their components. + +Message Type IDs +**************** + +The only unique value that is guaranteed to not change is UUID. The message type +IDs can change every time when a component is registering as a message +consumer/producer. In fact it depends on initialization order of components and +it may seem to be static. However it can change i.e. with addition of a new +component to pipeline and the entire mechanism will stop working. + +The components must not hardcode this value and they must use a runtime value of +component instance ID returned during producer/consumer registration. + +.. _message_handling: + +Message Handling +**************** + +The asynchronous messages consumers must be prepared to handle the messages +asynchronously. A message can be received while a component is processing data +and it can lead to undefined behavior when internal state is changed +immediately. The recommended way of handling asynchronous messages is to save a +message and apply the changes during a next processing time i.e. at the +beginning of processing. + +- When a processing of asynchronous message is done at the beginning of + component processing (Process Data), only then component processing is + deterministic. + +If an asynchronous message cannot be processed immediately by a consumer, it is +a good practice to implement a queue of incoming asynchronous messages in a +component or at least count asynchronous messages since last processing to +detect this kind of situation. + +A consumer component cannot assume that it can save a message pointer and +dereference is later. The message memory is released as soon as Asynchronous +Messaging Service will finish processing, so a consumer component must copy a +content of asynchronous message. + +Example - the pseudo code on a consumer side: + +.. code:: cpp + + queue_t request_queue; + + struct request_t { + uint8_t new_state; + }; + + struct message_context_t { + int32_t error; + queue_t *request_queue; + }; + + message_context_t message_context; + + void callback(const ams_message_payload_s * const ams_message_payload, void *ctx) { + if(ams_message_payload->message_length != sizeof(request_t)) { + ((message_context_t *)ctx)->error = 1; + return; + } + + queue_push(((message_context_t *)ctx)->request_queue, (request_t *)(ams_message_payload->message)); + } + + error_code componentA::Init(Pipeline* parent_ppl, const ModuleACfg* cfg) { + //getting Message Type ID + error = am_service_get_message_type_id(MESSAGE_A, &message_type_id); + if(error != 0) { + //error handling + } + + //registering consumer + message_context.error = 0; + message_context.request_queue = &request_queue; + error = am_service_register_consumer(message_type_id, GetcomponentID(), GetInstanceID(), callback, &message_context); + if(error != 0) { + //error handling + } + } + + error_code componentA::ProcessData(size_t max_output_data_size, uint32_t* custom_error_code) { + while(queue_size(message_context.request_queue) > 0) { + if(message_context.error != 0) { + //error handling + } + + request_t *r = queue_pop(message_context.request_queue); + //handling of async message + process_request(r); + } + + //regular processing + } + +.. _processing_in_a_consumer_callback: + +Processing in a consumer callback +********************************* + +The consumer callbacks must not do any heavy processing. Best if the callback +only saves information and a component will process it in the next processing +slot. + +- The asynchronous message callbacks are called in the context of a message + producer or in the context of IDC task. +- If a heavy processing is done in a message, then a producer MPCS or IDC task + budget needs to take into account this heavy processing. While it may be + possible to take into account additional budget for simple cases, it is + impossible to accommodate MCPS requirements in the general case (i.e. large + number of consumers with heavy processing). + +The example described in :ref:`message_handling` is also applicable for this issue. + +.. _message_filtering_mechanism: + +Message Filtering Mechanism +*************************** + +1. If a consumer is interested in async messages from one particular producer, + it needs to register for that particular producer using component ID and + instance ID. A component ID and instance ID of producer should be passed as + ``LARGE_CONFIG_SET`` parameter to the consumer. +2. If a producer wants to target a specific component instance, then it should + use send function that is parametrized with component ID and instance ID. + +Passing Pointers In Asynchronous Messages +***************************************** + +The asynchronous messages do not prevent to pass pointers between components. It +seems like a good idea at the beginning when a developer wants to return a +result. While it is simple solution, it may lead into the following issues: + +- there can be more than one consumer of a message and each of them needs to + have an allocated slot in the memory, +- the firmware framework cannot guarantee that component memory will be still + available when async message is processed i.e. a component can be subject of + firmware paging and the firmware infrastructure can decide to evict component + memory, + +The recommended method is to not pass pointers in the asynchronous messages. + +One-way Messages +**************** + +The asynchronous messages are one-way messages and there is no explicit feedback +whether a message was received or processed. The ``send`` functions return only +information whether the async messaging service return an error. + +Two-way Messages - Example #1 +***************************** + +The asynchronous messages are One-way Messages. Sometimes there is a need to +implement “function call” like functionality where a component instance wants +another component instance to take an action and return a result. This +functionality should be implemented with following issues in mind: + +- the result will not be returned immediately - :ref:`message_handling`, +- avoiding heavy processing in a consumer callback - :ref:`processing_in_a_consumer_callback`, +- 1:1 vs. M:N communication - :ref:`message_filtering_mechanism`, +- blocking vs. non-blocking execution: + + - If a producer depends on a result, it has to be handled as a blocking call + and the producer has to block its execution until result is received. To + do that, a blockade should be used when ``send`` functions return. + + - the task blockade must be removed when a result is received (in a + result callback), it will allow to continue a component execution, + - when the task blockade is set, the component execution is preempted and + the component with the highest priority is called, + +- one vs. two messages for handling action and result + + - the “function call” can be implemented as two separate messages: one for + triggering action from component A to component B and then second one for + passing result from component B to component A, it increases amount of + asynchronous messages, + - the recommended way is to implement it as one asynchronous message where + component A and B are both consumer and producer of the same asynchronous + message + + - it is important to note that filtering mechanism must be used to break + recursion - component A must discard a message from itself, + +Example - 1:1 function call: + +Consumer (component instance A) code: + +.. code:: cpp + + uint32_t message_type_id; + + queue_t request_queue; + + struct message_context_t { + int32_t error; + queue_t *request_queue; + }; + + message_context_t message_context; + + queue_t request_queue; + + struct request_t { + uint8_t message_type; //1 - request, 2 - response + uint8_t new_state; + }; + + void consumer_callback(const ams_message_payload_s * const payload, void *ctx) { + if(payload->message_length != sizeof(request_t)) { + ((message_context_t *)ctx)->error = 1; + return; + } + + //only requests are supported by a consumer + if((request_t *)(payload->message)->message_type != 1) { + ((message_context_t *)ctx)->error = 2; + return; + } + + queue_push(((message_context_t *)ctx)->request_queue, (request_t *)(payload->message)); + } + + error_code componentB::Init(Pipeline* parent_ppl, const ModuelCfg* cfg) { + //getting Message Type ID + error = am_service_get_message_type_id(MESSAGE_A, &message_type_id); + if(error != 0) { + //error handling + } + + //registering consumer + message_context.error = 0; + message_context.request_queue = &request_queue; + error = am_service_register_consumer_mi(message_type_id, GetcomponentID(), GetInstanceID(), component_A_id, component_A_instance_id, callback, &message_context); + if(error != 0) { + //error handling + } + } + + error_code componentB::ProcessData(size_t max_output_data_size, uint32_t* custom_error_code) { + while(queue_size(request_queue) > 0) { + if(message_context.error != 0) { + //error handling + } + + request_t *r = queue_pop(request_queue); + + //handling of async message + process_request(r); + + //message response + request_t response; + response.message_type = 2; + + error_code error = am_service_send_mi(message_type_id, GetcomponentID(), GetInstanceID(), component_A_id, component_A_instance_id, sizeof(request_t), &response); + if(e != 0) { + //error handling + } + } + + //regular processing + } + +Producer code: + +.. code:: cpp + + uint32_t message_type_id; + + queue_t request_queue; + + struct message_requestor_context_t { + int32_t error; + queue_t *request_queue; + uint32_t blockade; + }; + + message_requestor_context_t message_context; + + struct request_t { + uint8_t message_type; //1 - request, 2 - response + uint8_t new_state; + }; + + void consumer_callback(const ams_message_payload_s * const payload, void *ctx) { + if(payload->message_length != sizeof(request_t)) { + (message_requestor_context_t *)ctx->error = 1; + return; + } + + //only responses are supported by a producer + if((request_t *)(payload->message)->message_type != 2) { + (message_requestor_context_t *)ctx->error = 2; + return; + } + + queue_push(((message_context_t *)ctx)->request_queue, (request_t *)(payload->message)); + (message_requestor_context_t *)ctx->blockade = 0; //unblock a producer component execution + } + + error_code componentA::Init(Pipeline* parent_ppl, const ModuleACfg* cfg) { + //getting Message Type ID + error = am_service_get_message_type_id(MESSAGE_A, &message_type_id); + if(error != 0) { + //error handling + } + + //registering consumer + message_context.error = 0; + message_context.blockade = 0; + message_context.request_queue = &request_queue; + error = am_service_register_consumer_mi(message_type_id, GetcomponentID(), GetInstanceID(), component_B_id, component_B_instance_id, callback, &message_context); + if(error != 0) { + //error handling + } + + //registering as a producer + error = am_service_register_producer(message_type_id); + if(error != 0) { + //error handling + } + } + + error_code componentA::ProcessData(size_t max_output_data_size, uint32_t* custom_error_code) { + ... + SystemServiceInternal const* services = get_system_services(); + ... + //message request + request_t response; + response.message_type = 1; + + message_context.blockade = 1; //initialize blockade + error_code error = am_service_send_mi(message_type_id, GetcomponentID(), GetInstanceID(), component_B_id, component_B_instance_id, sizeof(request_t), &response); + if(e != 0) { + //error handling + } + + //block a component execution until a consumer will reply with a result + _AdspCurrentTaskBlockade blockade; + services->SetTaskRunCondition(&blockade, (uint32_t*)(&message_context.blockade), 0 /*unblocking value*/, 0xffffffff); + services->RemoveTaskRunCondition(&blockade); + + while(queue_size(request_queue) > 0) { + if(message_context.error != 0) { + //error handling + } + + request_t *r = queue_pop(request_queue); + + //handling of async message + process_request(r); + } + ... + //regular processing + } + +Two-way Messages - Example #2 +***************************** + +The below example shows a real use case where multiple control interfaces are +supported (IPC and I2C). Control application needs to produce an async message +and when async message response is received, it needs to respond to the correct +requestor IPC vs. I2C. To make it happen, the unique async message ID needs to +be introduced. The unique ID can be generated globally or locally when source +component is tracked. In the below pseudo-code, the ID is generated locally and +component B needs to respond to the correct component. + +Example - 1:1 function call: + +Consumer (component instance B) code: + +.. code:: cpp + + uint32_t message_request_id; + uint32_t message_response_id; + uint32_t current_state; + + queue_t request_queue; + queue_t requestor_info_queue; + + struct unique_message_id { + uint16_t component_id; + uint16_t instance_id; + uint32_t message_id; + }; + + struct message_context_t { + int32_t error; + queue_t *request_queue; + queue_t *requestor_info_queue; + }; + + message_context_t message_context; + + struct request_t { + unique_message_id uid; + uint32_t requested_state; + }; + + struct requestor_info_t { + unique_message_id uid; + uint16_t component_id; + uint16_t instance_id; + }; + + struct response_t { + unique_message_id uid; + uint32_t current_state; + }; + + void consumer_callback(const ams_message_payload_s * const payload, void *ctx) { + if(payload->message_length != sizeof(request_t)) { + ((message_context_t *)ctx)->error = 1; + return; + } + + queue_push(((message_context_t *)ctx)->request_queue, (request_t *)(payload->message)); + + requestor_info_t info; + info.uid = (request_t *)(payload->message)->uid; + info.component_id = payload->producer_component_id; + info.instance_id = payload->producer_instance_id; + queue_push(((message_context_t *)ctx)->requestor_info_queue, info); + } + + error_code componentB::Init(Pipeline* parent_ppl, const ModuelCfg* cfg) { + //getting Message Type ID for requests + error = am_service_get_message_type_id(MESSAGE_REQUEST, &message_request_id); + if(error != 0) { + //error handling + } + + //registering consumer + message_context.error = 0; + message_context.request_queue = &request_queue; + message_context.requestor_info_queue = &requestor_info_queue; + error = am_service_register_consumer(message_request_id, GetcomponentID(), GetInstanceID(), callback, &message_context); + if(error != 0) { + //error handling + } + + //getting Message Type ID for responses + error = am_service_get_message_type_id(MESSAGE_RESPONSE, &message_response_id); + if(error != 0) { + //error handling + } + + //registering producer + error = am_service_register_producer(message_response_id, GetcomponentID(), GetInstanceID()); + if(error != 0) { + //error handling + } + } + + void process_request(request_t *r) { + current_state = r->requested_state; + } + + uint32_t get_current_state() { + return current_state; + } + + error_code componentB::ProcessData(size_t max_output_data_size, uint32_t* custom_error_code) { + while(queue_size(request_queue) > 0) { + if(message_context.error != 0) { + //error handling + } + + request_t *r = queue_pop(request_queue); + + //handling of async message + process_request(r); + + //message response + response_t response; + response.uid = r->uid; + response.current_state = get_current_state(); + + //find requestor information + requestor_info_t *ri = find(requestor_info_queue, r->uid); + if(ri == NULL) { + //error handling + } + queue_pop(requestor_info_queue, ri); + + error_code error = am_service_send_mi(message_type_id, GetcomponentID(), GetInstanceID(), ri->component_id, ri->instance_id, sizeof(response_t), &response_t); + if(e != 0) { + //error handling + } + } + + //regular processing + ... + } + +Producer code: + +.. code:: cpp + + uint32_t message_request_id; + uint32_t message_response_id; + uint32_t message_id_counter; + + queue_t response_queue; + queue_t request_source_queue; + + struct unique_message_id { + uint16_t component_id; + uint16_t instance_id; + uint32_t message_id; + }; + + struct message_requestor_context_t { + int32_t error; + queue_t *response_queue; + uint32_t blockade; + }; + + message_requestor_context_t message_context; + + struct request_source_t { + unique_message_id uid; + uint32_t source; //0 - IPC, 1 - I2C + }; + + struct request_t { + unique_message_id uid; + uint32_t requested_state; + }; + + struct response_t { + unique_message_id uid; + uint32_t current_state; + }; + + void consumer_callback(const ams_message_payload_s * const payload, void *ctx) { + if(payload->message_length != sizeof(response_t)) { + (message_requestor_context_t *)ctx->error = 1; + return; + } + + queue_push(((message_context_t *)ctx)->response_queue, (request_t *)(payload->message)); + } + + error_code componentA::Init(Pipeline* parent_ppl, const ModuleACfg* cfg) { + message_id_counter = 0; + + //getting Message Type ID for response + error = am_service_get_message_type_id(MESSAGE_RESPONSE, &message_response_id); + if(error != 0) { + //error handling + } + + //registering consumer + message_context.error = 0; + message_context.blockade = 0; + message_context.response_queue = &response_queue; + error = am_service_register_consumer(message_response_id, GetcomponentID(), GetInstanceID(), callback, &message_context); + if(error != 0) { + //error handling + } + + //getting Message Type ID for request + error = am_service_get_message_type_id(MESSAGE_REQUEST, &message_request_id); + if(error != 0) { + //error handling + } + + //registering as a producer + error = am_service_register_producer(message_request_id, GetcomponentID(), GetInstanceID()); + if(error != 0) { + //error handling + } + } + + Message::IxcStatus componentA::LargeConfigSet(uint32_t large_param_id, + bool init_block, + bool final_block, + uint32_t data_off_size, + const ByteArray* data, + ByteArray* response) + { + ... + //message request + request_t request; + response.uid = {GetcomponentID(), GetInstanceID(), message_id_counter++}; + response.requested_state = state_from_request; + + request_source_t source; + source.uid = response.uid; + source.source = 0; //IPC + queue_push(request_source_queue, source); + + error_code error = am_service_send_mi(message_type_id, GetcomponentID(), GetInstanceID(), component_B_id, component_B_instance_id, sizeof(request_t), &response); + if(e != 0) { + //error handling + } + ... + } + + void process_request(response_t *r) { + ... + request_source_t *rs = find(request_source_queue, r->uid); + if(rs == NULL) { + //error handling + } + + if(rs->source == 0) { + //send response over IPC + } + + queue_pop(request_source_queue, rs); + ... + } + + error_code componentA::ProcessData(size_t max_output_data_size, uint32_t* custom_error_code) { + ... + while(queue_size(response_queue) > 0) { + if(message_context.error != 0) { + //error handling + } + + response_t *r = queue_pop(request_queue); + + //handling of async message + process_request(r); + } + ... + //regular processing + } + +Max message size +**************** + +The asynchronous message size is limited by size of an async message slot in the +AM queue, which is currently 4KB and should not be exceeded. + +Queue is Full +************* + +The queue of asynchronous messages is used when there are customers of messages +registered on other core than producer’s core. This queue has limited size and +it can happen that ``send`` function will fail. In such case, the best strategy +is to retry ``send`` function call in the next execution period. diff --git a/developer_guides/firmware/index.rst b/developer_guides/firmware/index.rst index 6c9d3280..c0a0709a 100644 --- a/developer_guides/firmware/index.rst +++ b/developer_guides/firmware/index.rst @@ -11,3 +11,4 @@ Developer guides and information for firmware development. component-tutorial/tut-intro porting cmake + async_messaging_best_practices From af9da2d36f3e506cdba50d7de689455d7b0d7e51 Mon Sep 17 00:00:00 2001 From: Michal Wasko Date: Mon, 30 May 2022 09:47:29 +0200 Subject: [PATCH 210/290] plantuml config: add default diagram parameters Add default values for maxMessageSize and BoxPadding Set skinparams for activity and activityDiamond Signed-off-by: Michal Wasko --- scripts/plantuml.cfg | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/scripts/plantuml.cfg b/scripts/plantuml.cfg index ec0fc4db..2d1574e5 100644 --- a/scripts/plantuml.cfg +++ b/scripts/plantuml.cfg @@ -56,3 +56,17 @@ skinparam note { backgroundColor #f6ed80 borderColor #d6d6de } + +skinparam activity { + borderColor #33335b + backgroundColor #ffffff +} + +skinparam activityDiamond { + borderColor #33335b + backgroundColor #ffffff +} + +skinparam arrowColor #f05772 +skinparam maxMessageSize 400 +skinparam BoxPadding 4 From 8fc025bc2859797cdb2b6f46dbd46e0f1d82aba5 Mon Sep 17 00:00:00 2001 From: Michal Wasko Date: Mon, 4 Apr 2022 15:34:05 +0200 Subject: [PATCH 211/290] arch: fw: zephyr based power management SOF power management architecture description and flows using Zephyr RTOS infrastructure Signed-off-by: Michal Wasko Co-authored-by: Marcin Maka Co-authored-by: Deb Taylor --- .../images/power/dsp_fw_power_states.pu | 14 ++ .../images/power/dx_state_transitions.pu | 10 ++ .../images/power/flow_disable_d0i3.pu | 19 +++ .../rtos_layer/images/power/flow_dsp_idle.pu | 41 +++++ .../images/power/flow_enable_d0i3.pu | 29 ++++ .../power/flow_primary_core_power_down.pu | 56 +++++++ .../images/power/flow_secondary_core_boot.pu | 48 ++++++ .../power/flow_secondary_core_power_down.pu | 56 +++++++ .../images/power/power_components.pu | 30 ++++ .../firmware/sof-zephyr/rtos_layer/index.rst | 1 + .../rtos_layer/power_management.rst | 158 ++++++++++++++++++ 11 files changed, 462 insertions(+) create mode 100644 architectures/firmware/sof-zephyr/rtos_layer/images/power/dsp_fw_power_states.pu create mode 100644 architectures/firmware/sof-zephyr/rtos_layer/images/power/dx_state_transitions.pu create mode 100644 architectures/firmware/sof-zephyr/rtos_layer/images/power/flow_disable_d0i3.pu create mode 100644 architectures/firmware/sof-zephyr/rtos_layer/images/power/flow_dsp_idle.pu create mode 100644 architectures/firmware/sof-zephyr/rtos_layer/images/power/flow_enable_d0i3.pu create mode 100644 architectures/firmware/sof-zephyr/rtos_layer/images/power/flow_primary_core_power_down.pu create mode 100644 architectures/firmware/sof-zephyr/rtos_layer/images/power/flow_secondary_core_boot.pu create mode 100644 architectures/firmware/sof-zephyr/rtos_layer/images/power/flow_secondary_core_power_down.pu create mode 100644 architectures/firmware/sof-zephyr/rtos_layer/images/power/power_components.pu create mode 100644 architectures/firmware/sof-zephyr/rtos_layer/power_management.rst diff --git a/architectures/firmware/sof-zephyr/rtos_layer/images/power/dsp_fw_power_states.pu b/architectures/firmware/sof-zephyr/rtos_layer/images/power/dsp_fw_power_states.pu new file mode 100644 index 00000000..c864c743 --- /dev/null +++ b/architectures/firmware/sof-zephyr/rtos_layer/images/power/dsp_fw_power_states.pu @@ -0,0 +1,14 @@ +@startuml +hide empty description + +state "D0 / D0ix" as D0 { + [*] --> PM_STATE_ACTIVE: Initialization + PM_STATE_ACTIVE -> PM_STATE_RUNTIME_IDLE + PM_STATE_RUNTIME_IDLE -> PM_STATE_ACTIVE + PM_STATE_ACTIVE --> [*] +} + +[*] --> D0: Go to D0 / Power DSP on +D0 --> [*]: Go to D3 / Power DSP Off + +@enduml diff --git a/architectures/firmware/sof-zephyr/rtos_layer/images/power/dx_state_transitions.pu b/architectures/firmware/sof-zephyr/rtos_layer/images/power/dx_state_transitions.pu new file mode 100644 index 00000000..1a1870b2 --- /dev/null +++ b/architectures/firmware/sof-zephyr/rtos_layer/images/power/dx_state_transitions.pu @@ -0,0 +1,10 @@ +@startuml + +[*] --> D3 +D3 --> D0 +D0 --> D0ix: SET_D0ix(wake = 0) +D0ix --> D0: SET_D0ix(wake = 1) +D0ix --> D3: ENTER_DX_STATE +D0 --> D3: ENTER_DX_STATE + +@enduml diff --git a/architectures/firmware/sof-zephyr/rtos_layer/images/power/flow_disable_d0i3.pu b/architectures/firmware/sof-zephyr/rtos_layer/images/power/flow_disable_d0i3.pu new file mode 100644 index 00000000..9279b09d --- /dev/null +++ b/architectures/firmware/sof-zephyr/rtos_layer/images/power/flow_disable_d0i3.pu @@ -0,0 +1,19 @@ +@startuml + +box "Host" #LightSkyBlue + participant "Driver" as DRIVER +end box + +box "SOF" #LightBlue + participant "Core #0: Zephyr lib" as sof_zephyr_lib + participant "Zephyr Power Manager" as zephyr_power_manager +end box + +DRIVER -> sof_zephyr_lib: SET_D0ix(prevent_power_gating = 1) IPC request +activate sof_zephyr_lib + sof_zephyr_lib -> zephyr_power_manager: pm_policy_state_lock_get\n(PM_STATE_RUNTIME_IDLE) + activate zephyr_power_manager + return +return SET_D0ix IPC response + +@enduml diff --git a/architectures/firmware/sof-zephyr/rtos_layer/images/power/flow_dsp_idle.pu b/architectures/firmware/sof-zephyr/rtos_layer/images/power/flow_dsp_idle.pu new file mode 100644 index 00000000..123751e5 --- /dev/null +++ b/architectures/firmware/sof-zephyr/rtos_layer/images/power/flow_dsp_idle.pu @@ -0,0 +1,41 @@ +@startuml + +box "SOF" #LightBlue + participant "Core #N: Zephyr lib" as sof_zephyr_lib + participant "Zephyr Power Manager" as zephyr_power_manager + participant "Zephyr SoC HAL" as soc_hal +end box + +box "Hardware" #LightGreen + participant "Core #N: Control" as core_hw_control +end box + +opt When Core is Idle + + zephyr_power_manager -> sof_zephyr_lib: pm_policy_next_state (PID: Core #N, ticks) + activate sof_zephyr_lib + activate zephyr_power_manager + sof_zephyr_lib -> zephyr_power_manager: pm_policy_state_lock_get\n(PM_STATE_RUNTIME_IDLE) + activate zephyr_power_manager + return + alt if no lock on D0ix state + return PM_STATE_RUNTIME_IDLE + else if there is lock on D0ix state + return PM_STATE_ACTIVE + end + + zephyr_power_manager -> soc_hal: pm_power_state_set\n(power_state, PID: Core #N) + activate soc_hal + alt If power_state is PM_STATE_IDLE + soc_hal -> soc_hal: arch_clear_power_gating_prevent (Core #N) + soc_hal -> core_hw_control: Clear power gating prevent + else if PM_STATE_RUNTIME_ACTIVE + soc_hal -> soc_hal: arch_set_power_gating_prevent (Core #N) + soc_hal -> core_hw_control: Set power gating prevent + end + return + + deactivate zephyr_power_manager +end + +@enduml diff --git a/architectures/firmware/sof-zephyr/rtos_layer/images/power/flow_enable_d0i3.pu b/architectures/firmware/sof-zephyr/rtos_layer/images/power/flow_enable_d0i3.pu new file mode 100644 index 00000000..70b3ea8b --- /dev/null +++ b/architectures/firmware/sof-zephyr/rtos_layer/images/power/flow_enable_d0i3.pu @@ -0,0 +1,29 @@ +@startuml + +box "Host" #LightSkyBlue + participant "driver" as driver +end box + +box "SOF" #LightBlue + participant "Core #0: Zephyr lib" as sof_zephyr_lib + participant "Zephyr Power Manager" as zephyr_power_manager +end box + +driver -> sof_zephyr_lib: SET_D0ix(prevent_power_gating = 0) IPC request +activate sof_zephyr_lib + sof_zephyr_lib -> zephyr_power_manager: pm_policy_state_lock_put\n(PM_STATE_RUNTIME_IDLE) + activate zephyr_power_manager + return + sof_zephyr_lib -> zephyr_power_manager: pm_policy_state_lock_is_active\n(PM_STATE_RUNTIME_IDLE) + activate zephyr_power_manager + return + + alt if D0ix is still locked + sof_zephyr_lib --> driver: return ERROR + note right: Zephyr PM Policy can be used concurrently\nand there can be more then one lock\non D0ix state + else + sof_zephyr_lib --> driver: return SUCCESS + end + + deactivate sof_zephyr_lib +@enduml diff --git a/architectures/firmware/sof-zephyr/rtos_layer/images/power/flow_primary_core_power_down.pu b/architectures/firmware/sof-zephyr/rtos_layer/images/power/flow_primary_core_power_down.pu new file mode 100644 index 00000000..c904de25 --- /dev/null +++ b/architectures/firmware/sof-zephyr/rtos_layer/images/power/flow_primary_core_power_down.pu @@ -0,0 +1,56 @@ +@startuml + +scale max 1280 width + +box "Host" #LightSkyBlue + participant "driver" as driver +end box + +box "SOF" #LightBlue + participant "Core #0: Zephyr lib" as sof_zephyr_lib_0 + participant "Zephyr Power Manager" as zephyr_power_manager + participant "Zephyr SoC HAL" as soc_hal +end box + +box "Hardware" #LightGreen + participant "Core #0: Control" as core_hw_control +end box + +opt If D0ix is enabled + driver -> sof_zephyr_lib_0: SET_D0ix(prevent D0ix) IPC request + activate sof_zephyr_lib_0 + sof_zephyr_lib_0 -> zephyr_power_manager: pm_policy_state_lock_get\n(PM_STATE_RUNTIME_IDLE) + activate zephyr_power_manager + return + return +end + +== DSP FW in PM_STATE_ACTIVE == + +driver -> sof_zephyr_lib_0: SET_DX(PID: Core #0, D3) IPC request +activate sof_zephyr_lib_0 + sof_zephyr_lib_0 -> zephyr_power_manager: Read status of secondary cores + activate zephyr_power_manager + return + + alt If any secondary core is powered up + sof_zephyr_lib_0 --> driver: SET_DX(ERROR) IPC response + else else + sof_zephyr_lib_0 -> zephyr_power_manager: pm_power_state_force\n(PM_STATE_SOFT_OFF, PID: Core #0) + activate zephyr_power_manager + zephyr_power_manager -> soc_hal: pm_power_state_set\n(PM_STATE_SOFT_OFF, PID: Core #0) + activate soc_hal + soc_hal -> soc_hal: Save context + soc_hal -> soc_hal: Prepare restore vector + return + return + +return SET_DX(SUCCESS) IPC response +end + +driver -> core_hw_control: clear power register +loop Until Core #0 power is down + driver -> core_hw_control: Read Core #0 power bit +end + +@enduml diff --git a/architectures/firmware/sof-zephyr/rtos_layer/images/power/flow_secondary_core_boot.pu b/architectures/firmware/sof-zephyr/rtos_layer/images/power/flow_secondary_core_boot.pu new file mode 100644 index 00000000..dc8704e9 --- /dev/null +++ b/architectures/firmware/sof-zephyr/rtos_layer/images/power/flow_secondary_core_boot.pu @@ -0,0 +1,48 @@ +@startuml + +box "Host" #LightSkyBlue + participant "driver" as driver +end box + +box "SOF" #LightBlue + participant "Core #0: Zephyr lib" as sof_zephyr_lib_0 + participant "Core #1: FW Init" as fw_init_1 + participant "Zephyr Power Manager" as zephyr_power_manager + participant "Zephyr SoC HAL" as soc_hal +end box + +box "Hardware" #LightGreen + participant "Core #1: Control" as core_control_1 +end box + +opt If D0ix is enabled + driver -> sof_zephyr_lib_0: SET_D0ix(prevent D0/D0ix) IPC request + activate sof_zephyr_lib_0 + sof_zephyr_lib_0 -> zephyr_power_manager: pm_policy_state_lock_get\n(PM_STATE_RUNTIME_IDLE) + activate zephyr_power_manager + return + return +end + +== DSP FW in PM_STATE_ACTIVE == + +driver -> sof_zephyr_lib_0: SET_DX(PID: Core #1, D0) IPC request +activate sof_zephyr_lib_0 + sof_zephyr_lib_0 -> soc_hal: arch_start_cpu(PID: Core #1) + activate soc_hal + soc_hal -> core_control_1: Set alternate boot vector to FW Init + note right: Cores share the \nsame FW binary\nand the firmware must be\npresent in SRAM. + soc_hal -> core_control_1: Set SPA bit + + core_control_1 -> fw_init_1: Start and jump to alternate boot vector + activate fw_init_1 + fw_init_1 -> fw_init_1: Restore context\nif any saved + + loop Until Core #1 is enabled + soc_hal -> core_control_1: read power register + end + deactivate fw_init_1 + return +return + +@enduml diff --git a/architectures/firmware/sof-zephyr/rtos_layer/images/power/flow_secondary_core_power_down.pu b/architectures/firmware/sof-zephyr/rtos_layer/images/power/flow_secondary_core_power_down.pu new file mode 100644 index 00000000..05d6c6c8 --- /dev/null +++ b/architectures/firmware/sof-zephyr/rtos_layer/images/power/flow_secondary_core_power_down.pu @@ -0,0 +1,56 @@ +@startuml + +scale max 1280 width + +box "Host" #LightSkyBlue + participant "driver" as driver +end box + +box "SOF" #LightBlue + participant "Core #0: Zephyr lib" as sof_zephyr_lib_0 + participant "Zephyr Power Manager" as zephyr_power_manager + participant "Zephyr SoC HAL" as soc_hal +end box + +box "Hardware" #LightGreen + participant "Core #1: Control" as core_1_control +end box + +opt If D0ix is enabled + driver -> sof_zephyr_lib_0: SET_D0ix(prevent D0ix) IPC request + activate sof_zephyr_lib_0 + sof_zephyr_lib_0 -> zephyr_power_manager: pm_policy_state_lock_get\n(PM_STATE_RUNTIME_IDLE) + activate zephyr_power_manager + return + return +end + +== DSP FW in PM_STATE_ACTIVE == + +driver -> sof_zephyr_lib_0: SET_DX(PID: Core #1, D3) IPC request +activate sof_zephyr_lib_0 + sof_zephyr_lib_0 -> zephyr_power_manager: pm_power_state_force\n(PM_STATE_SOFT_OFF, PID: Core #1) + activate zephyr_power_manager + zephyr_power_manager -> soc_hal: pm_power_state_set\n(PM_STATE_SOFT_OFF, PID: Core #1) + activate soc_hal + soc_hal -> soc_hal: Save context to IMR + return + deactivate zephyr_power_manager + + loop Until Core #1 transition to PM_STATE_SOFT_OFF + sof_zephyr_lib_0 -> zephyr_power_manager: pm_power_state_get(PID: Core #1) + activate zephyr_power_manager + return + end + + sof_zephyr_lib_0 -> soc_hal: arch_stop_cpu(PID: Core #1) + activate soc_hal + soc_hal -> core_1_control: clear power bit + loop Until Core #1 is disabled + soc_hal -> core_1_control: read power register + end + return + +return SET_DX(SUCCESS) IPC response + +@enduml diff --git a/architectures/firmware/sof-zephyr/rtos_layer/images/power/power_components.pu b/architectures/firmware/sof-zephyr/rtos_layer/images/power/power_components.pu new file mode 100644 index 00000000..f111ae24 --- /dev/null +++ b/architectures/firmware/sof-zephyr/rtos_layer/images/power/power_components.pu @@ -0,0 +1,30 @@ +node sw_driver [ + SW Driver + * DSP power control over IPC protocol +] + +node fw [ + SOF Zephyr Library + + * Exposes interface of SOF with XTOS for Host Power IPC handling + * Executes requested sequence of Zephyr power operations + * Waits and verifies power request completion + + --- + Zephyr Power Management + Generic RTOS Power Management service + + * Manages System Power States + * Manages Power Policies + * Manages Device Runtime Power + + --- + SoC HAL + Hardware specific power control + + * Moves SoC and its resources to power state requested by Zephyr + * Interacts directly with hardware and power registers + * Suppors different power states depending on the target SoC +] + +sw_driver -down-> fw : <> Set Dx - power state transition D0/D3\n<> Set D0ix - power gating override (on/off) diff --git a/architectures/firmware/sof-zephyr/rtos_layer/index.rst b/architectures/firmware/sof-zephyr/rtos_layer/index.rst index f8e741bf..d65b2dab 100644 --- a/architectures/firmware/sof-zephyr/rtos_layer/index.rst +++ b/architectures/firmware/sof-zephyr/rtos_layer/index.rst @@ -11,4 +11,5 @@ workloads. :maxdepth: 1 zephyr_kernel_overview + power_management io_drivers/index diff --git a/architectures/firmware/sof-zephyr/rtos_layer/power_management.rst b/architectures/firmware/sof-zephyr/rtos_layer/power_management.rst new file mode 100644 index 00000000..c394f52c --- /dev/null +++ b/architectures/firmware/sof-zephyr/rtos_layer/power_management.rst @@ -0,0 +1,158 @@ +.. _power_mgmt: + +Power Management +################ + +The Power Manager is responsible for system and device power management. The +power management behavior can be customized by power policy configuration and +direct power API requests which allows you to adjust system power savings to the +current firmware activity. + +.. uml:: images/power/power_components.pu + :caption: Participants of the Firmware power management. + +`Zephyr Power Management +documentation `__ + +DSP Cores +********* + +Each DSP core can be separately powered up and down. + +The assumption is that DSP #0 is a primary core and is responsible for powering +up all secondary cores. The primary core powers up the secondary cores on Set Dx +IPC request. + +The secondary core shall be powered up prior to any task allocated to it by the SW +driver. + +Power Transitions +***************** + +There are three DSP core power states: + +.. list-table:: + :widths: 5 10 20 + :header-rows: 1 + + * - DSP Power State + - Zephyr Power State + - Notes + * - D0 + - PM_STATE_ACTIVE + - built-in state, no extra mapping required + * - D0i3 + - PM_STATE_RUNTIME_IDLE + - custom mapping in the Device Tree + *d0i3: idle { power-state-name = "runtime-idle" }* + * - D3 + - PM_STATE_SOFT_OFF + - custom mapping in the Device Tree + *d3: off { power-state-name = "soft-off" }* + +A major consumer of power related to the main part of the DSP subsystem +is a source of the clock that is wired to the DSP core and the DSP core itself. +Transitions to lower power states focus on this part. Another power consumer, +a bit less significant, is the L2 SRAM memory embedded in the DSP subsystem. + +The clock source and clock gating is managed by the Power Manager according to +Power Policy configuration settings. + +Memory power is controlled by the Memory Management Driver that is responsible +for memory setup on power state transitions and memory banks power gating on +map/unmap requests (if it is supported by the SoC). + +Other power-related settings are clock gating and power gating of I/Os (I2C, +I3C, GPIO, SPI, UART, DMIC, etc.) and external DSP accelerators (if supported by +the hardware). + +The low power state transition can be triggered either by Zephyr (on CPU idle) +or on the Host IPC request through the Zephyr force power state set request. The +entrance to D0i3 power state can be dynamically locked on SetD0ix IPC request +that configures the Zephyr Power Policy to prevent a selected power state transition. + +More details are in the `Zephyr Power Management +documentation `__ + +.. uml:: images/power/dsp_fw_power_states.pu + :caption: DSP and FW Power States + +.. uml:: images/power/dx_state_transitions.pu + :caption: D3, D0 and D0ix state transitions + +Power Up of Secondary Core (D3 to D0 transition) +================================================ + +The below diagram shows secondary core boot flow: + +.. uml:: images/power/flow_secondary_core_boot.pu + :caption: DSP Secondary Core Boot flow + +Power down of DSP core (D0 to D3 transition) +============================================ + +The below diagram shows a primary core power down flow: + +.. uml:: images/power/flow_primary_core_power_down.pu + :caption: DSP Primary Core Power Down flow + +Power down of Secondary Core (D0 to D3 transition) +================================================== + +The below diagram shows a secondary core power down flow: + +.. uml:: images/power/flow_secondary_core_power_down.pu + :caption: DSP Secondary Core Power Down flow + +Enable D0ix (D0 to D0ix) +======================== + +D0ix is enabled on explicit `SET_D0ix` IPC message with prevent_power_gating bit +set to 0. + +.. uml:: images/power/flow_enable_d0i3.pu + :caption: Enable D0i3 flow + +Disable D0ix (D0ix to D0) +========================= + +D0ix is disabled on explicit `SET_D0ix` IPC message with prevent_power_gating +bit set to 1. + +.. uml:: images/power/flow_disable_d0i3.pu + :caption: Disable D0i3 flow + +DSP idle state +============== + +.. uml:: images/power/flow_dsp_idle.pu + :caption: DSP idle state flow + +DSP Cores Clock Gating +====================== + +DSP clocks, similar to DSP cores, can be separately gated as well. Clock gating +shall be enabled by default for all DSP cores unless there is request to prevent +it. + +.. TODO: Create diagram with DSP power state transitions when either DSP clock + is gate or DSP power is gate. + +**NOTE:** Power and clock gating is controlled via `Set D0ix` IPC message. + +I/O Power and Clock Gating Management +************************************* + +Zephyr is responsible for I/O devices power and clock management. + +The I/O device power is controlled based on usage count. More details can be +found in `Zephyr Device Runtime Power Management +documentation `__ + +The I/O clock gating is configurable in driver power policy. Each driver shall +request the desired clock and clock power gating if it is necessary for I/O, +accelerator, etc. to work correctly. + +For instance, audio I/Os such as I2S associated with audio domain require a high +accuracy XTAL clock and may request it. This clock shall be used for as long as +audio I/Os are active. From bbab560ca8be1f133563cd392d9a6d9a9e60cf68 Mon Sep 17 00:00:00 2001 From: jxstelter Date: Mon, 27 Jun 2022 16:23:10 +0200 Subject: [PATCH 212/290] arch: fw: IADK modules adapter description MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit IADK module adapter provides interface between SOF components API and IADK Framework developed modules. Signed-off-by: Jarosław Stelter --- .../firmware/intel/ace/iadk_modules.rst | 48 +++++++++++++++++++ architectures/firmware/intel/ace/index.rst | 13 +++++ architectures/firmware/intel/index.rst | 3 +- 3 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 architectures/firmware/intel/ace/iadk_modules.rst create mode 100644 architectures/firmware/intel/ace/index.rst diff --git a/architectures/firmware/intel/ace/iadk_modules.rst b/architectures/firmware/intel/ace/iadk_modules.rst new file mode 100644 index 00000000..2410faa7 --- /dev/null +++ b/architectures/firmware/intel/ace/iadk_modules.rst @@ -0,0 +1,48 @@ +.. _iadk-modules: + +IADK Modules Adapter +#################### + +IADK Modules +============ + +An IADK module is a software component that can be represented by a processing +block with some input pins and output pins capable to transport a digital +signal into the block or out of the block. Processing is applied on an input +signal or a combination of input signals, some input signals may only be used +as reference signals that influence the processing on other input signals. +The result of the processing is written into the output signals. The behavior +of the block can be controlled using a configuration parameter interface. + +An IADK module communicates with base firmware and other modules through +ProcessingModuleInterface API and access base firmware services via +System Service API. + + +IADK Module Adapter +=================== + +The IADK Module Adapter is an extension to SOF component infrastructure that +allows to integrate modules developed under IADK (Intel Audio Development Kit) +Framework. +IADK modules uses uniform set of interfaces and are linked into separate +library. These modules are loaded in runtime through Library Manager and then +after registration into SOF component infrastructure are interfaced through +module adapter API. +Since IADK modules uses ProcessingModuleInterface API to control/data transfer +and SystemService API to use base FW services from internal module code, there +is a communication shim layer defined. + +The SOF IADK Module Adapter is designed to interact with IADK modules without +their code modification. Therefore C++ function, structures and variables +definition are here kept with original form from IADK Framework. +This provides binary compatibility with already developed 3rd party modules. + +There are three entities in IADK Module Adapter Package: + * System Agent - A mediator to allow the custom module to interact with the + base SOF FW. It calls IADK module entry point and provides all necessary + information to connect both sides of ProcessingModuleInterface and + System Service. + * System Service - exposes of SOF base FW services to the module. + * Processing Module Adapter - SOF base FW side of ProcessingModuleInterface + API diff --git a/architectures/firmware/intel/ace/index.rst b/architectures/firmware/intel/ace/index.rst new file mode 100644 index 00000000..8f2507bd --- /dev/null +++ b/architectures/firmware/intel/ace/index.rst @@ -0,0 +1,13 @@ +.. _ace-architecture-intel: + +Intel ACE Architecture +###################### + +The details below are specific to Intel products with an audio DSP ACE +architecture using SOF. Intel ACE is a next generation of Intel Audio DSP +solution that replaces Intel cAVS architecture. + +.. toctree:: + :maxdepth: 1 + + iadk_modules diff --git a/architectures/firmware/intel/index.rst b/architectures/firmware/intel/index.rst index de288ec2..c7a5c4ea 100755 --- a/architectures/firmware/intel/index.rst +++ b/architectures/firmware/intel/index.rst @@ -10,4 +10,5 @@ generic SOF architecture. .. toctree:: :maxdepth: 1 - cavs/index \ No newline at end of file + cavs/index + ace/index \ No newline at end of file From b2366192a7d2ed206b9f630dec31448fc2556a75 Mon Sep 17 00:00:00 2001 From: jxstelter Date: Mon, 27 Jun 2022 13:39:57 +0200 Subject: [PATCH 213/290] arch: fw: library manager description. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit SOF library manager description and basic flows during loadable library operations: - library loading, - loadable module init instance, - loadable module delete instance. Signed-off-by: Jarosław Stelter Co-authored-by: Marcin Maka --- .../library_manager_delete_instance.pu | 56 ++++++++++++++++ .../library_manager_init_instance.pu | 65 +++++++++++++++++++ .../lib_manager/library_manager_load.pu | 49 ++++++++++++++ .../firmware/sof-zephyr/mpp_layer/index.rst | 1 + .../sof-zephyr/mpp_layer/lib_manager.rst | 58 +++++++++++++++++ 5 files changed, 229 insertions(+) create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/images/lib_manager/library_manager_delete_instance.pu create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/images/lib_manager/library_manager_init_instance.pu create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/images/lib_manager/library_manager_load.pu create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/lib_manager.rst diff --git a/architectures/firmware/sof-zephyr/mpp_layer/images/lib_manager/library_manager_delete_instance.pu b/architectures/firmware/sof-zephyr/mpp_layer/images/lib_manager/library_manager_delete_instance.pu new file mode 100644 index 00000000..6a827e38 --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/images/lib_manager/library_manager_delete_instance.pu @@ -0,0 +1,56 @@ +@startuml + +box "Host" #LightGreen + participant "Driver" as host_driver +end box + +box "SOF" #LightSkyBlue + participant "IPC4 Handler" as ipc4_handler + participant "Component Manager" as component_manager + participant "Library Manager" as library_manager +end box + +box "Zephyr RTOS" #LightBlue + participant "Memory Management Driver" as memory_management_driver +end box + +host_driver -> ipc4_handler: SOF_IPC4_MOD_DELETE_INSTANCE + activate ipc4_handler + ipc4_handler -> component_manager: Free comp_driver + activate component_manager + alt IADK module + component_manager -> library_manager: Deinitialize comp_driver \nwith Processing Module Adapter + activate library_manager + library_manager -> component_manager: return status + deactivate library_manager + else SOF module + component_manager -> library_manager: Deinitialize comp_driver + activate library_manager + library_manager -> component_manager: return status + deactivate library_manager + end alt + component_manager -> library_manager: Free comp_driver resources + activate library_manager + library_manager -> memory_management_driver: Free/Unmap L2 memory for code and rodata + activate memory_management_driver + memory_management_driver -> library_manager + deactivate memory_management_driver + library_manager -> memory_management_driver: Free/Unmap L2 memory for bss + activate memory_management_driver + memory_management_driver -> library_manager + deactivate memory_management_driver + loop Search library for shared module + library_manager -> library_manager: Check if shared module exists and is loaded + library_manager -> memory_management_driver: Free/Unmap L2 memory for shared module + activate memory_management_driver + memory_management_driver -> library_manager + deactivate memory_management_driver + end loop + library_manager -> component_manager: return status + deactivate library_manager + component_manager -> ipc4_handler: return status + deactivate component_manager +ipc4_handler -> host_driver: Complete IPC request +deactivate ipc4_handler + +@enduml diff --git a/architectures/firmware/sof-zephyr/mpp_layer/images/lib_manager/library_manager_init_instance.pu b/architectures/firmware/sof-zephyr/mpp_layer/images/lib_manager/library_manager_init_instance.pu new file mode 100644 index 00000000..9b16f5fd --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/images/lib_manager/library_manager_init_instance.pu @@ -0,0 +1,65 @@ +@startuml + +box "Host" #LightGreen + participant "Driver" as host_driver +end box + +box "SOF" #LightSkyBlue + participant "IPC4 Handler" as ipc4_handler + participant "Component Manager" as component_manager + participant "Library Manager" as library_manager +end box + +box "Zephyr RTOS" #LightBlue + participant "Memory Management Driver" as memory_management_driver +end box + +host_driver -> ipc4_handler: SOF_IPC4_MOD_INIT_INSTANCE + activate ipc4_handler + ipc4_handler -> library_manager: lib_manager_register_module() + activate library_manager + library_manager -> ipc4_handler: return status + deactivate library_manager + ipc4_handler -> component_manager: Create comp_driver + activate component_manager + component_manager -> library_manager: Allocate L2 memory for module + activate library_manager + library_manager -> memory_management_driver: Map L2 memory + deactivate library_manager + activate memory_management_driver + memory_management_driver -> library_manager + deactivate memory_management_driver + activate library_manager + library_manager -> memory_management_driver: Load module code and rodata \nfrom L3 to L2 memory + activate memory_management_driver + memory_management_driver -> library_manager + deactivate memory_management_driver + library_manager -> memory_management_driver: Initialize L2 memory for bss + activate memory_management_driver + memory_management_driver -> library_manager + deactivate memory_management_driver + loop Search library for shared module + library_manager -> library_manager: Check if shared module exists and is not loaded + library_manager -> memory_management_driver: Allocate/Map L2 memory for shared module + activate memory_management_driver + memory_management_driver -> library_manager + deactivate memory_management_driver + library_manager -> memory_management_driver: Load shared module code and rodata \nfrom L3 to L2 memory + activate memory_management_driver + memory_management_driver -> library_manager + deactivate memory_management_driver + end loop + alt IADK module + component_manager -> library_manager: Create/Initialize comp_driver \nwith IADK Module Adapter + library_manager -> component_manager: return status + else SOF module + component_manager -> library_manager: Create/Initialize comp_driver + library_manager -> component_manager: return status + deactivate library_manager + end alt + component_manager -> ipc4_handler: return status + deactivate component_manager +ipc4_handler -> host_driver: Complete IPC request +deactivate ipc4_handler + +@enduml diff --git a/architectures/firmware/sof-zephyr/mpp_layer/images/lib_manager/library_manager_load.pu b/architectures/firmware/sof-zephyr/mpp_layer/images/lib_manager/library_manager_load.pu new file mode 100644 index 00000000..714a5de5 --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/images/lib_manager/library_manager_load.pu @@ -0,0 +1,49 @@ +@startuml + +box "Host" #LightGreen + participant "Driver" as host_driver +end box + +box "SOF" #LightBlue + participant "IPC4 Handler" as ipc4_handler + participant "Library Manager" as library_manager + participant "MPP Memory Manager" as mpp_memory_manager +end box + +box "ACE Platform" #LightYellow + participant "ROM EXT" as rom_ext +end box + + +host_driver -> ipc4_handler: SOF_IPC4_GLB_LOAD_LIBRARY + activate ipc4_handler + ipc4_handler -> library_manager: lib_manager_load_library() + activate library_manager + library_manager -> library_manager: Parse Manifest \nPrepare Storage Memory + library_manager -> mpp_memory_manager: Allocate L3 memory for library + activate mpp_memory_manager + mpp_memory_manager -> library_manager + deactivate mpp_memory_manager + library_manager -> library_manager: Prepare HDA DMA transfer + host_driver -> library_manager: Transfer library manifest over DMA\nto L3 memory + note right: if SoC does not support L3 memory\nthen L2 memory has to be used + opt if AUTH_API_ENABLED + library_manager -> rom_ext: Verify Manifest + activate rom_ext + rom_ext -> library_manager: result + deactivate rom_ext + end opt + host_driver -> library_manager: Transfer library code over DMA\nto L3 memory + opt if AUTH_API_ENABLED + library_manager -> rom_ext: Verify whole Library + activate rom_ext + rom_ext -> library_manager: result + deactivate rom_ext + end opt + library_manager -> library_manager: Update Library \ndescriptors table + library_manager -> ipc4_handler: return status + deactivate library_manager +ipc4_handler -> host_driver: Complete IPC request +deactivate ipc4_handler + +@enduml diff --git a/architectures/firmware/sof-zephyr/mpp_layer/index.rst b/architectures/firmware/sof-zephyr/mpp_layer/index.rst index 729a465e..67629b39 100644 --- a/architectures/firmware/sof-zephyr/mpp_layer/index.rst +++ b/architectures/firmware/sof-zephyr/mpp_layer/index.rst @@ -13,3 +13,4 @@ to the Application layer. mpp_overview mpp_scheduling async_messaging + lib_manager diff --git a/architectures/firmware/sof-zephyr/mpp_layer/lib_manager.rst b/architectures/firmware/sof-zephyr/mpp_layer/lib_manager.rst new file mode 100644 index 00000000..0bb4bccf --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/lib_manager.rst @@ -0,0 +1,58 @@ +.. _lib_manager: + +Loadable Library Manager +######################## + +The Loadable Library Manager is a MPP Layer component responsible for loading +and running loadable components provided in external libraries. It supports SOF +native components as well as IADK cAVS/ACE developed modules through +:doc:`../../intel/ace/iadk_modules`. + +Loading an external library is a feature available only for IPC4 protocol with +command: `SOF_IPC4_GLB_LOAD_LIBRARY`. + +.. uml:: images/lib_manager/library_manager_load.pu + :caption: Library Manager: Load library flow + +In the `SOF_IPC4_GLB_LOAD_LIBRARY` IPC flow the ``lib_manager_load_library()`` api +function loads binary from host driver to DSP memory and updates its internal +structure with library descriptor data. If ``AUTH_API`` Kconfig option is +selected, library manager communicates with platform ROM Extension library to +perform library image verification. In that case only trusted libraries will be +successfully loaded. + +**NOTE:** ``AUTH_API`` Kconfig option is available only for Intel platforms. + +During the `SOF_IPC4_MOD_INIT_INSTANCE` IPC4 protocol call, handler searches +for specific module among build-in components and if not found, verifies +manifests of all already loaded external libraries. When module is found in +external library, it is registered in SOF Firmware ``struct comp_driver_list`` +with ``lib_manager_register_module()`` api function and loaded from L3 memory to +L2 memory. Afterwards module is created with standard component device +operation. + +**NOTE:** If L3 memory is not available, the L2 memory has to be used and there +is no memory load operation required. + +.. uml:: images/lib_manager/library_manager_init_instance.pu + :caption: Init instance flow for loadable module + +External libraries could contain not only processing modules but also shared +library code that could be reused across several external modules. The library +manager searches external library manifest for such entities and loads them +together with first processing module loaded. + +When an external processing module is no longer needed, it could be unloaded +with the IPC4 call `SOF_IPC4_MOD_DELETE_INSTANCE`. The command performs reverse +flow to the previous one. It frees L2 SRAM memory allocated for the processing +module and if it is last one unloaded from given library, it frees also +resources used for all shared libraries loaded previously. + +.. uml:: images/lib_manager/library_manager_delete_instance.pu + :caption: Delete instance flow for loadable module + +In `SOF_IPC4_MOD_INIT_INSTANCE` and `SOF_IPC4_MOD_DELETE_INSTANCE` flows, +particular module could be loaded in more than one instance. Its `.text` and +`.rodata` memory sections are allocated only for the first instance and shared +for all other instances. Also the `.text` and `.rodata` resources are released +only for the last instance of given processing module. From a919d9031683bdd2d4386200cf52464bf820f78e Mon Sep 17 00:00:00 2001 From: Michal Wasko Date: Wed, 27 Apr 2022 15:39:35 +0200 Subject: [PATCH 214/290] arch: fw: sof common architecture section added Common architecture tree for chapters that apply both to SOF XTOS and SOF with Zephyr, like Components description. Signed-off-by: Michal Wasko --- architectures/firmware/index.rst | 1 + .../components/component-mgmt-api.rst | 0 .../components/component-overview.rst | 0 .../components/images/comp-dev-states.pu | 0 .../components/images/comp-driver.pu | 0 .../components/images/comp-new-flow.pu | 0 .../components/images/component-mgmt-api.pu | 0 .../{sof-xtos => sof-common}/components/index.rst | 0 architectures/firmware/sof-common/index.rst | 12 ++++++++++++ architectures/firmware/sof-xtos/index.rst | 1 - 10 files changed, 13 insertions(+), 1 deletion(-) rename architectures/firmware/{sof-xtos => sof-common}/components/component-mgmt-api.rst (100%) rename architectures/firmware/{sof-xtos => sof-common}/components/component-overview.rst (100%) rename architectures/firmware/{sof-xtos => sof-common}/components/images/comp-dev-states.pu (100%) rename architectures/firmware/{sof-xtos => sof-common}/components/images/comp-driver.pu (100%) rename architectures/firmware/{sof-xtos => sof-common}/components/images/comp-new-flow.pu (100%) rename architectures/firmware/{sof-xtos => sof-common}/components/images/component-mgmt-api.pu (100%) rename architectures/firmware/{sof-xtos => sof-common}/components/index.rst (100%) create mode 100644 architectures/firmware/sof-common/index.rst diff --git a/architectures/firmware/index.rst b/architectures/firmware/index.rst index 839ff2e4..86c79454 100755 --- a/architectures/firmware/index.rst +++ b/architectures/firmware/index.rst @@ -6,6 +6,7 @@ Firmware Architecture .. toctree:: :maxdepth: 1 + sof-common/index sof-xtos/index sof-zephyr/index intel/index \ No newline at end of file diff --git a/architectures/firmware/sof-xtos/components/component-mgmt-api.rst b/architectures/firmware/sof-common/components/component-mgmt-api.rst similarity index 100% rename from architectures/firmware/sof-xtos/components/component-mgmt-api.rst rename to architectures/firmware/sof-common/components/component-mgmt-api.rst diff --git a/architectures/firmware/sof-xtos/components/component-overview.rst b/architectures/firmware/sof-common/components/component-overview.rst similarity index 100% rename from architectures/firmware/sof-xtos/components/component-overview.rst rename to architectures/firmware/sof-common/components/component-overview.rst diff --git a/architectures/firmware/sof-xtos/components/images/comp-dev-states.pu b/architectures/firmware/sof-common/components/images/comp-dev-states.pu similarity index 100% rename from architectures/firmware/sof-xtos/components/images/comp-dev-states.pu rename to architectures/firmware/sof-common/components/images/comp-dev-states.pu diff --git a/architectures/firmware/sof-xtos/components/images/comp-driver.pu b/architectures/firmware/sof-common/components/images/comp-driver.pu similarity index 100% rename from architectures/firmware/sof-xtos/components/images/comp-driver.pu rename to architectures/firmware/sof-common/components/images/comp-driver.pu diff --git a/architectures/firmware/sof-xtos/components/images/comp-new-flow.pu b/architectures/firmware/sof-common/components/images/comp-new-flow.pu similarity index 100% rename from architectures/firmware/sof-xtos/components/images/comp-new-flow.pu rename to architectures/firmware/sof-common/components/images/comp-new-flow.pu diff --git a/architectures/firmware/sof-xtos/components/images/component-mgmt-api.pu b/architectures/firmware/sof-common/components/images/component-mgmt-api.pu similarity index 100% rename from architectures/firmware/sof-xtos/components/images/component-mgmt-api.pu rename to architectures/firmware/sof-common/components/images/component-mgmt-api.pu diff --git a/architectures/firmware/sof-xtos/components/index.rst b/architectures/firmware/sof-common/components/index.rst similarity index 100% rename from architectures/firmware/sof-xtos/components/index.rst rename to architectures/firmware/sof-common/components/index.rst diff --git a/architectures/firmware/sof-common/index.rst b/architectures/firmware/sof-common/index.rst new file mode 100644 index 00000000..6e093246 --- /dev/null +++ b/architectures/firmware/sof-common/index.rst @@ -0,0 +1,12 @@ +.. _sof-common: + +SOF Common Architecture +####################### + +Architecture chapters and details that are common both for SOF Legacy and SOF +with Zephyr. + +.. toctree:: + :maxdepth: 1 + + components/index diff --git a/architectures/firmware/sof-xtos/index.rst b/architectures/firmware/sof-xtos/index.rst index 2909242d..1063889e 100644 --- a/architectures/firmware/sof-xtos/index.rst +++ b/architectures/firmware/sof-xtos/index.rst @@ -11,6 +11,5 @@ SOF with XTOS Architecture pm-runtime/index schedulers drivers/index - components/index pipelines/index kd_integration/index From dd1737a49879ebf582a49500f15950900675e455 Mon Sep 17 00:00:00 2001 From: Marcin Maka Date: Fri, 3 Jun 2022 11:21:29 +0200 Subject: [PATCH 215/290] components: document comp_ops and module_interface dependencies This chapter documents dependencies between various component (module) interfaces in firmware. It also documents the direction of transition towards a single, simpler native module interface. Signed-off-by: Marcin Maka --- .../components/component-module-api.rst | 42 +++++ .../components/images/comp-copy-flow.pu | 42 +++++ .../components/images/comp-module-api.pu | 160 ++++++++++++++++++ .../components/images/comp-prepare-flow.pu | 22 +++ .../firmware/sof-common/components/index.rst | 1 + 5 files changed, 267 insertions(+) create mode 100644 architectures/firmware/sof-common/components/component-module-api.rst create mode 100644 architectures/firmware/sof-common/components/images/comp-copy-flow.pu create mode 100644 architectures/firmware/sof-common/components/images/comp-module-api.pu create mode 100644 architectures/firmware/sof-common/components/images/comp-prepare-flow.pu diff --git a/architectures/firmware/sof-common/components/component-module-api.rst b/architectures/firmware/sof-common/components/component-module-api.rst new file mode 100644 index 00000000..6441f421 --- /dev/null +++ b/architectures/firmware/sof-common/components/component-module-api.rst @@ -0,0 +1,42 @@ +.. apps-comp-world: + +Component & Module Interfaces +############################# + +Introduction of the Module Adapter, an intermediate layer which provides common +code for different module API adapters, created multi-level sequences of calls +to functions and this mechanism is very expensive during run-time processing +with regards to additional cycles consumed for parameter translation and copying +as well as the additional memory for extra buffers, contexts, and the call +stack. The `module_adapter` translates the `comp_ops` interface required by the +existing infrastructure (pipelines etc.) into the `module_interface`. Then +appropriate adapter translates the `module_interface` into the final module +interface like `Cadence Codec API` or `IADK ProcessingModuleInterface`. These +dependencies are illustrated in the next figure. + +.. uml:: images/comp-module-api.pu + :caption: Component & Module API + +Maintenance of two base component (alias module) interfaces is expensive and +also confusing for the developers who wants to create a module that provides SOF +native module API. It is unclear whether this should be the `comp_ops` or the +`module_interface`. The latter is much more convenient since it is tailored for +the audio processing modules while the `comp_ops` is a multipurpose interface +cluttered with many optional operations required for *dai-comp* modules only. + +Therefore the `module_interface` should become the only SOF native module +interface that the rest of underlying infrastructure would interact with +directly. The `comp_ops` would become obsolete and eventually would be removed +from the SOF. + +The cost of extra memory required at the moment for intermediate audio data +buffers allocated inside the `module_adapter` layer (see the *Preparation Flow* +figure below) as well as cost of extra cycles required to copy the data to/from +the intermediate buffers (see the *Processing Flow* figure below) could be +avoided by removing the `comp_ops` as well. + +.. uml:: images/comp-prepare-flow.pu + :caption: Preparation Flow + +.. uml:: images/comp-copy-flow.pu + :caption: Processing Flow diff --git a/architectures/firmware/sof-common/components/images/comp-copy-flow.pu b/architectures/firmware/sof-common/components/images/comp-copy-flow.pu new file mode 100644 index 00000000..0f015622 --- /dev/null +++ b/architectures/firmware/sof-common/components/images/comp-copy-flow.pu @@ -0,0 +1,42 @@ +actor pipeline +box "Module Adapter\no-- comp_ops" + participant "module_adapter" as module_adapter +end box +box "IADK Module Adapter\no-- module_interface" + participant "iadk_adapter" as iadk_adapter +end box +box "IADK Module\no-- ProcessingModuleInterface" + participant iadk_module +end box + +pipeline -> module_adapter : (1) ops->module_adapter_copy() + activate module_adapter + + module_adapter -> module_adapter : find min bytes\nto process + + note left of module_adapter + This logic is WRONG for some modules!! + end note + + module_adapter -> module_adapter : copy input from sources\nto internal buffers + + module_adapter -> module_adapter : module_process() + activate module_adapter +note left of module_adapter +Why all those extra internal calls +used only once?? +end note + + module_adapter -> iadk_adapter : (2) ops->process() + activate iadk_adapter + iadk_adapter -> iadk_module : (3) processing + module_adapter <-- iadk_adapter + deactivate iadk_adapter + + deactivate module_adapter + + module_adapter -> module_adapter : module_adapter_process_output() + activate module_adapter + module_adapter -> module_adapter : copy output from internal buffers\ntosinks + deactivate module_adapter +pipeline <-- module_adapter diff --git a/architectures/firmware/sof-common/components/images/comp-module-api.pu b/architectures/firmware/sof-common/components/images/comp-module-api.pu new file mode 100644 index 00000000..5f7ef971 --- /dev/null +++ b/architectures/firmware/sof-common/components/images/comp-module-api.pu @@ -0,0 +1,160 @@ +scale 1024 width + +component "pipelines" { + class pipeline + hide pipeline methods + hide pipeline attributes +} +component "component" { + + class comp_driver <> { + } + hide comp_driver methods + hide comp_driver attributes + + class comp_dev <> { + state + position + frames + pipeline + min_sink_bytes + min_source_bytes + task + size + period + ... + } + hide comp_dev methods + + interface buffer + hide buffer methods + hide buffer attributes + + interface comp_ops { + create() : comp_dev* + free(comp_dev*) + params(params) + dai_get_hw_params(params, dir) + dai_config(dai_config, dai_spec_config) + cmd(int cmd, void *data) + trigger(int cmd) + prepare() + reset() + copy() + position() + get_attribute() + set_attribute() + dai_ts_config() + dai_ts_start() + dai_ts_stop() + unbind() + get_large_config() + set_large_config() + } + hide comp_ops attributes + + + comp_driver -> comp_dev : creates + comp_dev *-right- comp_ops +} +pipeline -> comp_ops : calls + +component "module_adapter" { + + class module_adapter <> { + ops : comp_ops = + .create = adapter_shim_new + .prepare = module_adapter_prepare + .params = module_adapter_params + .copy = module_adapter_copy + + adapter_shim_new() + module_adapter_prepare() + module_adapter_params() + module_adapter_copy() + } + + interface module_interface { + init(processing_module*) + prepare(processing_module*) + process(processing_module*) + set_configuration() + get_configuration() + set_processing_mode() + get_processing_mode() + reset() + free() + } + hide module_interface attributes + + class processing_module <> { + stream_params + sink_buffer_list + period_bytes + deep_buff_bytes + output_buffer_size + input_buffers[] + output_buffers[] + } + hide processing_module methods + + module_adapter -left-> processing_module : creates + module_adapter -> module_interface : calls + +} +module_adapter -up-|> comp_ops + +component "cadence adapter" { + class cadence_codec { + cadence_codec_init() + cadence_codec_prepare() + cadence_codec_process() + cadence_codec_set_configuration() + cadence_codec_reset() + cadence_codec_free() + } + hide cadence_codec attributes + + interface "Cadence Codec API" as cadence_codec_api + hide cadence_codec_api methods + hide cadence_codec_api attributes + + cadence_codec -> cadence_codec_api : calls +} +cadence_codec -up-|> module_interface + +component "custom extensions" { + class "mp3 codec" as mp3_codec + hide mp3_codec methods + hide mp3_codec attributes + + class "aac codec" as aac_codec + hide aac_codec methods + hide aac_codec attributes +} +mp3_codec -up-|> cadence_codec_api +aac_codec -up-|> cadence_codec_api + +component "IADK adapter" { + class adp_interface { + intel_modules_init() + intel_modules_prepare() + intel_modules_process() + } + hide adp_interface attributes + + interface ProcessingModuleInterface <> { + Init() + Delete() + Process() + Reset() + SetProcessingMode() + GetProcessingMode() + SetConfiguration(config_id, fragment_pos, data_in, data_out) + GetConfiguration(config_id, fragment_pos, data_out) + } + hide ProcessingModuleInterface attributes + + adp_interface -> ProcessingModuleInterface : calls +} +adp_interface -up-|> module_interface diff --git a/architectures/firmware/sof-common/components/images/comp-prepare-flow.pu b/architectures/firmware/sof-common/components/images/comp-prepare-flow.pu new file mode 100644 index 00000000..960b8623 --- /dev/null +++ b/architectures/firmware/sof-common/components/images/comp-prepare-flow.pu @@ -0,0 +1,22 @@ +actor pipeline +box "Module Adapter\no-- comp_ops" + participant "module_adapter" as module_adapter +end box +box "IADK Module Adapter\no-- module_interface" + participant "iadk_adapter" as iadk_adapter +end box +box "IADK Module\no-- ProcessingModuleInterface" + participant iadk_module +end box + +pipeline -> module_adapter : (1) ops->module_adapter_prepare() + activate module_adapter + module_adapter -> module_adapter : module_prepare() + activate module_adapter + module_adapter -> iadk_adapter : (2) ops->prepare() + activate iadk_adapter + iadk_adapter -> iadk_module : (3) preparation + module_adapter <-- iadk_adapter + deactivate iadk_adapter + module_adapter -> module_adapter : alloc buf descriptors + module_adapter -> module_adapter : alloc buffers diff --git a/architectures/firmware/sof-common/components/index.rst b/architectures/firmware/sof-common/components/index.rst index a78e796e..76db7fdd 100644 --- a/architectures/firmware/sof-common/components/index.rst +++ b/architectures/firmware/sof-common/components/index.rst @@ -8,3 +8,4 @@ Components component-overview component-mgmt-api + component-module-api From 1a17d9cdeb5b147f882bfc0e32ef92714478a038 Mon Sep 17 00:00:00 2001 From: Michal Wasko Date: Thu, 29 Dec 2022 09:28:36 +0100 Subject: [PATCH 216/290] codeowners: add more people More people to receive a notification when a change to any file is being made. Signed-off-by: Michal Wasko --- CODEOWNERS | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/CODEOWNERS b/CODEOWNERS index 86c19cad..6339b6f0 100755 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1,5 +1,8 @@ -#This file identifies people who are automatically notified when Pull Requests are made for /sof-docs. -#At this time, the following people are notified and are expected to review the PRs: -#Liam Girdwood (technical review), Anton Bobkov (technical/grammatical/style review), and Deb Taylor (grammatical/style review). +# This file identifies people who are automatically notified when Pull Requests are made for /sof-docs. +# At this time, the following people are notified and are expected to review the PRs: +# Liam Girdwood (technical review), # Deb Taylor (grammatical/style review), +# Marcin Maka (technical review) and Michal Wasko (technical review). -* @lgirdwood @anton-intel @deb-intel @intelkevinputnam @greg-intel +# So if a pull request only touches javascript files, only these owners + +* @lgirdwood @deb-intel @intelkevinputnam @greg-intel @mmaka1 @mwasko From 4fe2ca22f107942af393f8d1d90b5bc62a38d81f Mon Sep 17 00:00:00 2001 From: Marcin Maka Date: Mon, 16 May 2022 11:28:24 +0200 Subject: [PATCH 217/290] arch: fw: doc sof lib with zephyr and legacy configuration Documentation of a unified SOF lib interface for the upper code and implementation of the interfaces with both Zephyr and legacy SOF parts. Signed-off-by: Marcin Maka --- .../firmware/sof-zephyr/images/sof_lib.pu | 39 +++++++++ .../sof-zephyr/images/sof_lib_zephyr.pu | 53 ++++++++++++ architectures/firmware/sof-zephyr/index.rst | 1 + .../sof-zephyr/zephyr_api_integration.rst | 86 +++++++++++++++++++ 4 files changed, 179 insertions(+) create mode 100644 architectures/firmware/sof-zephyr/images/sof_lib.pu create mode 100644 architectures/firmware/sof-zephyr/images/sof_lib_zephyr.pu create mode 100644 architectures/firmware/sof-zephyr/zephyr_api_integration.rst diff --git a/architectures/firmware/sof-zephyr/images/sof_lib.pu b/architectures/firmware/sof-zephyr/images/sof_lib.pu new file mode 100644 index 00000000..b819e2e4 --- /dev/null +++ b/architectures/firmware/sof-zephyr/images/sof_lib.pu @@ -0,0 +1,39 @@ +component "app/mpp" as app + +component lib <> { + interface cpu + interface dai + interface dma + interface pm_runtime + + component dai_mng + dai_mng -up- dai + component dma_mng + dma_mng -up- dma + component pm_runtime_impl + pm_runtime_impl -up- pm_runtime +} + +app .down.> dai : uses +app .down.> dma : uses +app .down.> pm_runtime : uses +app .down.> cpu : uses + +component "arch/xtensa/lib" as arch_xtensa { + component arch_cpu +} +arch_cpu -up- cpu + +component vendor { + component platform { + component dai_init + dai_init .up.> dai_mng : initialize + component dma_init + dma_init .up.> dma_mng : initialize + component platform_pm_runtime + } + component drivers + drivers .up.> dma : uses +} +arch_cpu .down.> platform +pm_runtime_impl .down.> platform_pm_runtime diff --git a/architectures/firmware/sof-zephyr/images/sof_lib_zephyr.pu b/architectures/firmware/sof-zephyr/images/sof_lib_zephyr.pu new file mode 100644 index 00000000..d39e6c48 --- /dev/null +++ b/architectures/firmware/sof-zephyr/images/sof_lib_zephyr.pu @@ -0,0 +1,53 @@ +component "app/mpp" as app + +component lib <> { + interface cpu + interface dai + interface dma + interface pm_runtime + + ' component dai_mng + ' dai_mng -up- dai + ' component dma_mng + ' dma_mng -up- dma + ' component pm_runtime_impl + ' pm_runtime_impl -up- pm_runtime +} + +app .down.> dai : uses +app .down.> dma : uses +app .down.> pm_runtime : uses +app .down.> cpu : uses + +component "lib-zephyr" as lib_zephyr { + component "cpu-flows" as cpu_flows + cpu_flows -up- cpu +} + +component "zephyr" as zephyr { + component "api" as zephyr_api +} + +cpu_flows .down.> zephyr_api : uses +zephyr_api -up- dai +zephyr_api -up- dma +zephyr_api -up- pm_runtime + +' component "arch/xtensa/lib" as arch_xtensa { +' component arch_cpu +' } +' arch_cpu -up- cpu + +' component vendor { +' component platform { +' component dai_init +' dai_init .up.> dai_mng : initialize +' component dma_init +' dma_init .up.> dma_mng : initialize +' component platform_pm_runtime +' } +' component drivers +' drivers .up.> dma : uses +' } +' arch_cpu .down.> platform +' pm_runtime_impl .down.> platform_pm_runtime diff --git a/architectures/firmware/sof-zephyr/index.rst b/architectures/firmware/sof-zephyr/index.rst index c3f5df01..e89e5913 100644 --- a/architectures/firmware/sof-zephyr/index.rst +++ b/architectures/firmware/sof-zephyr/index.rst @@ -10,3 +10,4 @@ SOF with Zephyr Architecture app_layer/index mpp_layer/index rtos_layer/index + zephyr_api_integration diff --git a/architectures/firmware/sof-zephyr/zephyr_api_integration.rst b/architectures/firmware/sof-zephyr/zephyr_api_integration.rst new file mode 100644 index 00000000..fe351051 --- /dev/null +++ b/architectures/firmware/sof-zephyr/zephyr_api_integration.rst @@ -0,0 +1,86 @@ +.. _zephyr-api-integration: + +Zephyr API Integration +###################### + +Most of the interfaces between the application (audio) layer and the kernel are +aggregated inside the part of the legacy SOF architecture called "lib". The +interfaces are exposed by the *lib*, declared in header files in +*src/include/sof/lib* directory. Implementation is located in the *src/lib* +except for platform and architecture specific functions that are delegated to +*platform* and *arch* parts respectively. + +.. uml:: images/sof_lib.pu + :caption: Legacy SOF Lib + +Zephyr replaces *lib* and other architecture and platform specific code, +everything below the *app* & *mpp* layers. + +In order to unify the access to the lower parts from the *app* and *mpp*, the +library header files provides now a definition of unified interface but some +changes are introduced to the original set of APIs and/or the implementation. + +Let's have a look at possible cases. + +**Case #1: New Zephyr API replaces 1:1 legacy SOF lib API** + +If there is a Zephyr version of a SOF legacy API which provides exactly the same +functionality as the original function but has a different name, the Zephyr +function name is used as a replacement in the SOF *app* and *mpp* code. It +causes direct linking and call into the Zephyr code optimizing FW size and +performance when SOF is built with Zephyr. Building with legacy SOF *lib* +requires an implementation or just a simple adapter for the new Zephyr API. It +may or may not slightly increase the size and decrease the performance of the +legacy SOF. + +.. code-block:: c + + // src/include/sof/lib.cpu.h + #ifdef __ZEPHYR__ + #include + #else + // was: static inline int cpu_is_core_enabled(int id) + static inline bool arch_cpu_active(int id) + { + arch_cpu_is_core_enabled(id); + } + #endif /* __ZEPHYR__ */ + +**Case #2: Legacy SOF lib API requires multi-step implementation for Zephyr +configuration** + +There may be a case when SOF legacy API is implemented by a single function +provided by the *arch* or another package and there is no 1:1 API available in +Zephyr to replace that. In this case, the API is implemented in the *lib-zephyr* +part based on the native Zephyr APIs. + +.. code-block:: c + + // src/include/sof/lib/cpu.h + #ifdef __ZEPHYR__ + void cpu_disable_core(int id); + #else + static inline void cpu_disable_core(int id) + { + arch_cpu_disable_core(id); + } + #endif /* __ZEPHYR__ */ + + // src/lib-zephyr/cpu.c + void cpu_disable_core(int id) + { + // ... calls to Zephyr APIs + } + +**Case #3: Legacy SOF lib API is implemented completely inside the lib and does +not have any replacement in Zephyr** + +The agent code might be an example of the library functions that are common and +must be compiled and linked together with either legacy SOF *lib* or +*lib-zephyr*. + +The dependencies between the SOF *lib*, *lib-zephyr*, and *zephyr* are +illustrated in the below figure. + +.. uml:: images/sof_lib_zephyr.pu + :caption: SOF Lib + Zephyr From 0d8991b4114f50c67b2671d9e0e5a25297a36c1f Mon Sep 17 00:00:00 2001 From: Deb Date: Mon, 23 Jan 2023 12:40:41 -0600 Subject: [PATCH 218/290] Update req.txt file, update copyright, change release number Signed-off-by: Deb --- conf.py | 4 ++-- release.rst | 2 +- scripts/requirements.txt | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) mode change 100644 => 100755 scripts/requirements.txt diff --git a/conf.py b/conf.py index 61b5957d..2ee473e9 100755 --- a/conf.py +++ b/conf.py @@ -74,14 +74,14 @@ # General information about the project. project = u'SOF Project' -copyright = u'2022, SOF Project' +copyright = u'2023, SOF Project' author = u'SOF Project developers' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. -version = release = "2.2" +version = release = "2.4.1" # # The short X.Y version. diff --git a/release.rst b/release.rst index 922761a6..8c971457 100755 --- a/release.rst +++ b/release.rst @@ -26,7 +26,7 @@ kernel, and documentation. Download the source code as a zip or tar.gz file: Source and Binary Releases -------------------------- -The latest SOF release is v2.3 (Oct 2022). +The latest SOF release is v2.4.1 (Jan 2023). View new feature information and release downloads for the latest and previous releases on GitHub. Firmware and SDK tool source code and binary diff --git a/scripts/requirements.txt b/scripts/requirements.txt old mode 100644 new mode 100755 index bc8d82c1..3d50863c --- a/scripts/requirements.txt +++ b/scripts/requirements.txt @@ -1,8 +1,8 @@ # This file hardcodes validated versions with '==', # see requirements-lax.txt for an alternative. -breathe==4.14.1 -sphinx==2.4.4 -docutils==0.16 +breathe==4.29.2 +sphinx==4.5.0 +docutils==0.17.1 sphinx_rtd_theme sphinxcontrib-plantuml sphinxcontrib-blockdiag From 0960d7cb3910bdb2178b54788e3f17727e7afb68 Mon Sep 17 00:00:00 2001 From: Deb Taylor Date: Thu, 26 Jan 2023 14:32:01 -0600 Subject: [PATCH 219/290] Update deprecated actions (#450) * Update deprecated actions Signed-off-by: Deb --- .github/workflows/pull-request.yml | 8 ++++---- .github/workflows/woke.yml | 2 +- .github/workflows/woke_pr.yml | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) mode change 100644 => 100755 .github/workflows/pull-request.yml mode change 100644 => 100755 .github/workflows/woke.yml mode change 100644 => 100755 .github/workflows/woke_pr.yml diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml old mode 100644 new mode 100755 index 5ad42d65..f10d87ff --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -35,7 +35,7 @@ jobs: runs-on: ubuntu-20.04 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 # FIXME: remove this time consuming step once github stops # providing a broken package index, see @@ -74,7 +74,7 @@ jobs: # https://docs.github.com/en/actions/guides/storing-workflow-data-as-artifacts - name: upload HTML for deploy if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/publish' }} - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: html path: _build/html @@ -87,7 +87,7 @@ jobs: # download the build result from the same workflow # https://docs.github.com/en/actions/guides/storing-workflow-data-as-artifacts - name: download HTML - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: html path: html @@ -106,7 +106,7 @@ jobs: # Makefile downgrades the Sphinx warnings, they are not errors any more env: {LAX: 1} steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 # FIXME: remove this time consuming step once github stops # providing a broken package index, see diff --git a/.github/workflows/woke.yml b/.github/workflows/woke.yml old mode 100644 new mode 100755 index 8943d2a7..8338578c --- a/.github/workflows/woke.yml +++ b/.github/workflows/woke.yml @@ -19,7 +19,7 @@ jobs: name: woke check for all file runs-on: ubuntu-20.04 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: woke uses: get-woke/woke-action@v0 with: diff --git a/.github/workflows/woke_pr.yml b/.github/workflows/woke_pr.yml old mode 100644 new mode 100755 index 0c307257..7aa97088 --- a/.github/workflows/woke_pr.yml +++ b/.github/workflows/woke_pr.yml @@ -21,7 +21,7 @@ jobs: name: woke check for patch runs-on: ubuntu-20.04 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: get-woke/woke-action-reviewdog@v0 with: github-token: ${{ secrets.GITHUB_TOKEN }} From 96128fedd03f5e1b5ae0a55da7282b1fcc2d2743 Mon Sep 17 00:00:00 2001 From: Seppo Ingalsuo Date: Thu, 30 Jun 2022 21:01:39 +0300 Subject: [PATCH 220/290] Algorithms: Add equalizers design tutorial This patch adds a section about measuring acoustical speaker frequency response and design of IIR and FIR equalizers to improve it. Signed-off-by: Seppo Ingalsuo --- algos/eq/Picture_FIR_equalized_response.png | Bin 0 -> 65252 bytes algos/eq/Picture_FIR_impulse_response.png | Bin 0 -> 27728 bytes algos/eq/Picture_FIR_response.png | Bin 0 -> 53684 bytes algos/eq/Picture_FIR_response_absolute.png | Bin 0 -> 51106 bytes .../Picture_FIR_right_channel_equalized.png | Bin 0 -> 64622 bytes ...re_IIR_FIR_target_vs_achieved_response.png | Bin 0 -> 60473 bytes algos/eq/Picture_iir_absolute_response.png | Bin 0 -> 51470 bytes ...re_iir_filter_response_vs_ideal_target.png | Bin 0 -> 54469 bytes algos/eq/Picture_iir_impulse_response.png | Bin 0 -> 18649 bytes algos/eq/Picture_iir_poles_and_zeros.png | Bin 0 -> 23782 bytes ...r_simulated_left_and_channel_responses.png | Bin 0 -> 66006 bytes ...re_imported_frequency_response_for_iir.png | Bin 0 -> 65366 bytes algos/eq/Picture_raw_frequency_response.png | Bin 0 -> 67499 bytes algos/eq/Picture_response_with_smoothing.png | Bin 0 -> 66261 bytes ...re_right_channel_FIR_absolute_response.png | Bin 0 -> 50603 bytes algos/eq/Picture_right_channel_response.png | Bin 0 -> 65771 bytes ...e_simulated_IIR_FIR_frequency_response.png | Bin 0 -> 73901 bytes ...lated_left_and_right_channel_responses.png | Bin 0 -> 72551 bytes algos/eq/Picture_speaker_meas.jpg | Bin 0 -> 116075 bytes ...ture_tested_speaker_frequency_response.png | Bin 0 -> 66862 bytes algos/eq/equalizers_tuning.rst | 924 ++++++++++++++++++ algos/index.rst | 3 +- 22 files changed, 926 insertions(+), 1 deletion(-) create mode 100644 algos/eq/Picture_FIR_equalized_response.png create mode 100644 algos/eq/Picture_FIR_impulse_response.png create mode 100644 algos/eq/Picture_FIR_response.png create mode 100644 algos/eq/Picture_FIR_response_absolute.png create mode 100644 algos/eq/Picture_FIR_right_channel_equalized.png create mode 100644 algos/eq/Picture_IIR_FIR_target_vs_achieved_response.png create mode 100644 algos/eq/Picture_iir_absolute_response.png create mode 100644 algos/eq/Picture_iir_filter_response_vs_ideal_target.png create mode 100644 algos/eq/Picture_iir_impulse_response.png create mode 100644 algos/eq/Picture_iir_poles_and_zeros.png create mode 100644 algos/eq/Picture_iir_simulated_left_and_channel_responses.png create mode 100644 algos/eq/Picture_imported_frequency_response_for_iir.png create mode 100644 algos/eq/Picture_raw_frequency_response.png create mode 100644 algos/eq/Picture_response_with_smoothing.png create mode 100644 algos/eq/Picture_right_channel_FIR_absolute_response.png create mode 100644 algos/eq/Picture_right_channel_response.png create mode 100644 algos/eq/Picture_simulated_IIR_FIR_frequency_response.png create mode 100644 algos/eq/Picture_simulated_left_and_right_channel_responses.png create mode 100644 algos/eq/Picture_speaker_meas.jpg create mode 100644 algos/eq/Picture_tested_speaker_frequency_response.png create mode 100644 algos/eq/equalizers_tuning.rst diff --git a/algos/eq/Picture_FIR_equalized_response.png b/algos/eq/Picture_FIR_equalized_response.png new file mode 100644 index 0000000000000000000000000000000000000000..9407914bdb6256ad6334a9ecf3cdb211a5d582d0 GIT binary patch literal 65252 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 Lu6m*BBme&b-k0P} literal 0 HcmV?d00001 diff --git a/algos/eq/Picture_FIR_impulse_response.png b/algos/eq/Picture_FIR_impulse_response.png new file mode 100644 index 0000000000000000000000000000000000000000..8abbb95d14ba62a2d553523acfb2f41e8124f4e3 GIT binary patch literal 27728 zcmeEuWl&t(wl0z&A$XAB8XN+_g1cLACs?rH?gV#t51QaEjRl7w!QFy4jeDbSWuJTQ zJ$q;WxUcHgt@o^)Mo_GU|?WSrKQA_VPN32VPIf; zkPv`(ey#?J0e@f}l_f=BDn^OGz>6nl!t%l}Fx4?AcZN@a*T{BKT8=OsJ zF@b@x+L9I%R&~=q$a>m}+k4X=6Lsa$<^rj2!J&SVbQp{E1o>$}+~MJ&s_=_yaV3$0 z7T$t58;d8KP{EG3M_sU^H+bAfZxFA&1#|d!mglpg=I57>Mu$iHkjMiuM3BOsy@w-TCf2I{ntB*1OZ8)6E3M@7RibKR#f;jZ5vHSD2L!AMLlz@?p z5XB>6QTzlS?^HZ3jQO0xSk&Acy4?Ef&_$T4%u4DDP3?5KD)y<X(|Hu=PDWmoMxj$ zcxYrA^;WaV+Vz%i!Cj9$&U;cL=^WJFH|G;AuC^~ZEE7$>CrUrVWu!gZ9&tR8h{Pvv zcHBu8@V;q!gr4oB(5VzPS#&(ylWi?iK8Io#58W*h7@G;JEx4H_I^kKO=CN95yt4s*QT7tY*rXQQ z#_oXi3xOLmkB|=t-@ttIjiV6P1)FYtPcoe@QDeSqT=j80jWp%_IHz=ZxD4s4K3E1h zCwziO1lfy7IpzNHRv2lw8*uSf$K!n^yY0%-^6_G$EerN5x!C0v*OvIAN%2zMW`~Lr z+lc~c<*&-r(5sHeg90jM+IxQ?J^NmqibRY1n+u12V%Me&wi)PJ06NdO{}*9UMf;5< z^tc;cZ|SpW2RvRy$A^M#uw>u2cRT1gS`{s%Y*@O5b1YFtBNdZod&j!Lr{<(g3aE`!}c;2gFl` z!u#E=^`RgmiJ@?PRLT=WcHKb##>cf}7f_~ED=|}{$I!U!lCjta3y;urA*`z8;U8ZL z6FLK|r=5iuLp_YAbzJbBF0T7?<54>Uaote?LPbh9PlHhjxBK3)J!$SfI%>Zil}Fj` zJ%wq&z7144eUvXSY;PUiSN%rnJcU=ja^ z#mK14-_+YI^U$DTJgLj~f8L{!r&ePkO@n6OdtZ-D7K$NbqkzbDPbD2cP@&hN`xRYA zYdu{3dm`Pk*HPwpKsWUqfpChULF7JRzzZGxLgOxpSG%Y0Ro zY5!QM;Q;y%s>Jy`_!gn;l3=n1Oln=g+Z>0;0>w!G2&SOJq3R^@(I;FR;QGy!9cezgDKg3jW$+A((#Ty#N{3BQ~z9{NF~%@3)&OW z3)%wg4dD!?eUwXNHCIiRO$_UHxN-kf1ZsJ=2<*JzItjWL4Xn)ORWVR9HJE8v^Q$MY zVjE7OKVr#6b-|boIMf=SHjT2(8Dm!GT-bxrOK9IIhghl?AQpXAeNJtKF_POUu-)H^ z!Hq%0wTXzt?33R{q>nFTK_JsD5lsYcKxSJkl*OAJMF-#allnG!3xRUaqyIDJC@FCS zmXHl7>DmQIw2-w5BPdx0^vyR7BILf~>mq|Ko-Ea1p&_PC>+(>73$SFotI%nzNTBgk z#!O6Xg>Glq5Um}EvDZl?y=*`?^0$0b#$etF0&#i%8^R9Y&fY$=Iz2q29tE*aG+k*3W?`XN~6LUDnt_ zUth{BkQuwN!W4=X2h??OKCwL%b{G$Srsj;1pSyr<;TL>nP8eJ#%wxoFeja@6sF|W4;-gO3{t~IDWouFz!9bL5DU4!NJLbA zx(|9%a$Q9#Oh-b#xgL@yjwF4aD?c8N!!TM}K*Q?SC{|6ndmD-2U?KE>k5cWW!*KP# zN+`~__3{WDzePWvi&WHGbELf9NBjkW2bvuQLvaN}KPl>%jHFL{S5OEbpp)#2p^#el z_G>6UItc!8)w~^WRlEI6nbw=Z96{gR9g$HpDsqc0B5x@~dd9Q)Y^J>KoZJaQ6n-&~pOAxaAT*`La`Sz2A4R4ul^90U^KpZb! zIbCJ7kn4eupWvQ~bg%?h?r&J#UB^_eAsRdi5_{oa{tO{?A$9AO)H>;KJ6UJ*xpSLu zb}at5)D$NQhfc`((T+Nbn{^{&l$;0NgS8)(w%vj#?+sa73X1{B5j)!W%b7}pqY9R5 z(p4wmMeMfc<$lCb#KI6I>-}o0KvbpX-^O7T)O}Q3OSI9#=eJfDuTrD~tZnrZ*b) zbYTSGGhNIb@Eu^B(-|FG@xIWfok6eV;-#Iwsq6rGhr+lAZpm#`E9Y?kTa5uV#k`=2b&(P>{Q)!hk=*M#Jm zqKglqzbKE0H62Qp1_}ekw`sv>#Pm$sb#@)B#5EU(Ek`oHaNWT|J@cIt?QdU{P3`d9 zz)-5&|7;HZ^vB&u!jnm9wW(f&C-c8x68z(ndC~Dxc=3opkzc>Kh4{xOp0wINx#n?7 zzul4v>zVk_KW+ky@*npV7x`@dkDL7Z8UK z>$ONQ^9o5?2Gx_lP5{;-zCg?!G({>qW@o7F;?)4EbDwP7rwHnzF51C4>xO-v0c=k4 zzfNUh(=sm+zmIOXSA*1po^>SOl1cn|cAY*Nu?jpTGB8_zHJ!py6}#!|{Hb?lBf4~# z$X}=9Buu?#wAN%SlPQihe(bLnkx4c879I~L`0LpJhn?q-*#rRLh_1njhIF0U}k zTiwqj`i!Kp8j?{M za6FOU!N?+~9S{El95ofKNelh~Ux);}=JX7X1>3;@mZ=hhU=?{mPubpo^Bb5;%Z*ac z=5wbouBJL-%doD?Ls|qfOw`W5BSTtNI| zGG_^dpgdsn(rTx??hVID07xpazn|onoF7w%a|8u}N&feu{C{Cl{*U9Ye^2Ybr}cju z^Z)jUvf>wXvj0bcY#G5i0{q!&gA$VAOBr#`2)g;IxkSxY(0UqE{;bqWkFx*Q!`i z=I=-;DRi#EI^&ln0hFE$g7@bM?B-+Nfp-H)FTrASD20U$SN6M&qv_bvn-pm*G<~Fl z&hGxh_Xt-vGVBgURq*=;2q=XBiFfD|8h6@yB4|GgYnBUseMPSCGlv-(IE2rLi?9Y&^oN`O)4#^ZVkwJ4Vjt5}(dt zB?EE-7XaWQUeMQv#{7iUc~8~-d|Z+mAOqqlC0z#7IP&jGd-^9_*Xifm!LF`xo3Y2; zr&~kIVK4tk_UdJtKS!&ti+&C3Tmsb3^=nYN8gAazq&~L?Tr`b%ym)eiOk;o`q`{^J zaQ|PGKKla{2OHbg5fmuG3tSEs;#lpiThqC0NnY{}0>WUH*e6ooyKyzvKC?yhe4NCp zr~i@92TnHn^~N9KC?zS#d*B*?0#z;K@|Q>l0D_#kPEPHxNbv~VW=@q_vmeP?wI2q% zf>2E7YfLMyPafeXREy-&22!P>2sjE1I(*`)HI*!J8$WX_zyadk0KZl?8e#Whci-`^ z(h2x;S;g84l>1?k5>W)w0IysK$TrG=cp#n3m_{X^K2=W&eH5~{tI%yW0T_~sa&#XS zt(qQr9gx%4NJ6er{=v1V9zZQ@NwD4=hy!%KaX0bk-w>nBW^O0X!pD&;UM{TDtLONy zzp3$xOdMYte#;dO&|TGizups8aT^L~ls}}GGv7MuUW0$H+wfojx;q{)qj=wg@7OhS zd&#$^+#VFQ#A{N7f7W*YNjM}8T;HAjCu3;g+3X{nuSH*~3j9%5{)vUag5^e{?d%#WRwSKmpvS+tJYWE3uX=x}`3+km@o!;G zodPB+O|3##OW^KUboM=QRx|=UL05i8@M9(36~J)(l}OQp0Zat4sS5txcqX}y6E_!- z7LsMwTmvRAxSbp?Ri4kk6DnAkA!x+${!dY45?;yc3Tk{|`?%OpZZecC@3KFKnKp#> zPv!;SWd1?MFkpUqs9bU1A-=i=v_qbE;nPL(gf9iWnr^L;f45WUw~QbRLMKih>xDXO z{^tBz<;0I#|D;cTkvjjNgs9oZ3Pqu(Tg&34IsE`(*kLl9`tHMUDrQ>u-;MxX!1ZWF z@0Z%@+Pz$B7IW+J6QB(#9Or%~45%rhNd*rDTHu@MlydzbW#>oj;`r8o6N`~-8n9^; z5`l7|xun}+>-$N0x9pQYc&-2P5UI`}Qflqp1#;8xi8Vg=Hv=yKQ2Y=2=wGAyKT8_G=XLqG zIV+9JsJSLEX#6)`ES1V;8a`ENV4z$mL;Xu*CylpR2GtX;xNV?=19BbTnzdxGbG zw+Jx-nK=az^9KMaoPylvpN{-rWFgke>vlt+Ix_j@2U~%82gH}n2$uF=sy< zqu%g%W<4Ga?`xpA9UO?Gq*Sr~n~`F=wN#0PVNHB_M`6V?LfY zp!>H*C3=3I@ih4PONxuVX~&L}x7pFeyr9+Ozp;NPP!Y=j!!!XBHQUFz*A~+yNhrRL z_gBjqAv1q-{c|K7kn1-;7j0_UWG7p)n_ZoV->vlosPFF*BLz*rzqtBjQ8y`K?AH2e z7yfSo%WKcek90Z>Wu-i21|97$=#<6iRllsQ2;2cue}Uc4uEScszZ-=glTO3Hmv{M_ z0M4jjw*tg?Z zQhz*?4(B|8rckVwnyO6(N1L?1K@w?Q5{UwSgvKXv5ANaM`9joV|k80FqTfUKBh>18zHu_dJ!sdCe zf5j{L7&KwJ?s1jz3!nZgUo7)vIE#1oA|uGBZtR-4tux=C99Txp$G?*K&{MFNcw{Fs%WCT%hvmHb9t!hoJ_#y+;i|*@07hq^$$n!K=;C2B?t2ae(DYUa zsgGT^>#FxopEps#8BTex&ZVqen4$7caZ>!j26SRGg+uu=!}N5OKHs$S6=!G+`d?x_ zl4iA05QLaSE{8-1E)k#GU|b~Ns$GTaJNC${p^nn1I7mrM5}{>eQd%6n*l*Ux^vhmT z0ixNe){HHB8iL0nknZwe_GT-OO3l{+qPO7K~2H3?!cvpo>O+p}`tbg8i<`832lZpE5#$h4n|s z0;I-@gb4tVHdg`AwxtoP{O`giP<dlKOQ}=j10`bo8#4vyUTLKXAO$Kn+UQBAFlYVJR@p*` zfty{={3Jz;k(p?i+&T@5^A=PNQDD?7u{D+1)ib?aZY<)xCXbb9cm@d)5HB zclv#e1kW8vBH5&77ZBg8_GqY}=8^V1;asJ=i!({3Ea(v0MlY0^L#o(mvrzLIA%q4B_ zNXF|7Zaj*=I3T9|-L<{NuSgD{+?%VTBOWFo`h=T|W5 zc}?#RMX^+NC80K*ob&E$p?5po;|fJxQj5mXe3PdpczB*@qzNUf_pf5=(+QBJmxk5I z_pc$^7OY0~a@x)gf{%PRDTHv$oZ~!sw=SD=gZJ>hByXMhSnbSHw!z(=K;aDc&rFC# z4z#x=0JVo~8k=bWu>Mw5me|*kAoo+2>_S#qx+}Z}_^DwyWFgRN?4dfDY*D_J*kR$Wq zFlKuQm7`y#{Q+ew=3h z`j?MJJQx=uwJDh-Dv}LlT?V$jeZNOo7Y)LLY|+`XsW?I^Vg)8SWx|EqJw`s&04_zpc>RjGH_idxt89f2uCz1$}PVPqFyK-}I?rzQ%sM%iO5J z%)qyK9g~#pVv+r;AH|>LX|3Dn8Y6D9_sGmdTvzz0ig`mG1%p&{Cr}El27ddx#XUje zgt{B&@;c&L1)HgZgMyB664a?1_rjhRcki;_VWzd)#0;-CDaN}@IjN9qRo(&tm*B12 zZdC@C0Iux{O}UyJ8NBB9sWsx}yt;~BdcMpBjrRsy zGdg@0MK+@@z9z)R zR*2JC!hISBdVR}G_aAbS|wuZ&&r z=Po*?6bbV#Uv)+_3|WJSLqiT2^C0cbGu-alDNz^vC67m6xrB{MBIC;V&7?{cCaDla z%7%iT7-xH)yY4Bxp{@*Py}V*wj^3n?uy%%`?_ToH7=`oYEgrXy#u(p+R-hPO?Kup2 zx5#;X?cp!5Cz&?Z5xcT3Avt1EJ=TT@)RQzzkYZgnJB93%cR02a+`#UwT{&(}PP33O+4g>t>${xE`Qr91bD(s!^V3$d`Axqs^o z|4b@k&4R@2tbPb9gKKk@u*ZlH-zIgU#A5}t7OXf_u&v>knQBZD%DHV(x%k#)%f{7b zgX>iPmetC%|5JXAc=rO>ft56xW&Jaqe?;+5S|-WcA82!UJ(GqJGJ;PQnPhivKRl@8 zq3H?!&n9sK2XtIMf<+T;0$hxY!$x6!=OSEM(` zIGd;iU{{oe?^Jp&#RCuZ;|GuOKOWsZ6vzb)1&9{;34WBLpEwEdW%k)j(tkY}A-W>n zK&^<9`f^RB-ygQ^-~5^jZ4!I3rtxxh>Q5 z_CbnfX(Bg3fgue&&&3(ys=S~Mzsi5Fvk|U1j5q)mYOt9MkO5p+bRgC9Ula%c>80Ae zpalw9JfE#qM%C*ayjz8`#|W{RrObKNlofMRU4xsjd0ac7G$2>a0u^6DaT%Vyo+{s{bDkGAc>4L=ee7D zC&|Jd8xoQ(pXljq5MCNNeCJ)+B3w642*Vt>)p08y|0Vas-djlkhU<~2erl@T*8B?H zaG-f@+M!S1NKWk3q!zO8y$wFMKb@gL*{rXq-84*kS_V&Tc@bQhEUBhMPJ~bLPB`=( zRQhW_cT4zi1ig^7D&Irl32U}q<5dF!_LfT|K9Ock4bR@yYEC{^4yd}^@NsqDtDVnqek&*& zPoKXWg?pxUZy%JL=<_mE{~#?r`>E>Hzf{Ds|Df_h5GW0D+%t zz_tV}!I^tHR=H%GFq})AxcFHJ2U9h_rU9BfN{?*uZJ_=BWLtVPE47ac7kVJaWQNG_ zZMU9o;K+QH2FX-i2WXx4$}diSlC8F{L#6QybA(c{A$$9D$lHUja@MJ{TTFt#56M$W z{6L>LX1pm)m9N&KmB#5o#6#|#QRv2LRfS-O&8!N~5kF5Q@1ZlzmnRA?J6h_*Ayf|< zF~l>jIW{Qk!XF$Vk9bb*v>c-qLmh<5-0$O-a-ppG0%ZKO7>6KOO8P07s-XLEv`wEJ6@sMef#2_W8f|v57V#e6t5e~XL?V>{M83PnUl%UaD zjtZTIh^x}2&qJPS)CBGSM2Q%W zsM~Dbw?BgKLR~9u5c^cVNKsnHT~>lMQNaSfUf3T81>}?A#ynkskpWdLUo^DgS^&txpoL1l1 zHwmrEx|(^plP>w5uWdVIsKkr5Tp+kCaFwy^r4_AB6v&4wR z{g=jqHWT-qKI9~q*e6x1<_P}K?CA}!D1BR-Y4`byg%~M&mVVD3wcn|c#RUo>ZrvTJkCakA)e~YT^MVD(AXr9UMu(vDedx2d{r?Uie(k`$PQcRFSDTJ3Xxh$t5o}pAB zAuK~NDUUIyEU~ej?>6t`<)T=)&wWe5Zo6E(s~)|Y?>s&28~motTrW1)9Ixu@oQsQT zhY4o)rh5u4QaZ*v-HrZ4B9^BedMwLkM@b;#M%g~t(hE3#Ew){Ox}1j)r|f1)i86kA zjifB9Bd@cTvXyp81f~TVjhSpZX@cS8R*+yXqHQ9>9wex3Sj>VIT7bWr2gb|?V>I4D z4rfp{A8^m8xyx@yS1YkzD;!$aD&ZbszHEC))m786mD!>hs^X9|&GN9A)$*j;ZnKZC zcr1}(%uFh znkg4&PiTBL`0Qf3v{W&LhL=&9Dcp3RgwjENi*7<;l5K5Tzhe-Gz*e~6?b3j=a?9fHFR61@@=)}8RV#+s%U||S-jC#wm?g^ z{+-TNdJT5r_U;^N|NQa$+unGwom+SL{pL>{DbrbWu65~0eZnXsgsi=NGUZZyYZEGy z=uq_cjx3dLMJueiX*h+z{>CaMbyL?DCVT~~qokR5Ffq6Th(Db4*C$Zf)0$L*d?FLa z+0h5e`teTG`{}ORT4$cSHyw0ggXiu0NU>Dh>Rybs;@jz*xihbPACM#D@TKIhCWd83 zZxhtl26{LJNi8bZwLioU$2|G@IGwIAc#CinJ!mG2*3vp_5&U5k>4&q{`svM$R9~O* zcV|$RqLte>*C9;XR`%)p=Wbe+n5>1b2I8e0Tc$l0C^`g6!B}H9>4!NLEH)mmAZ@zw zsyW*eq{G7PGiN9EBWAE|=RAIH-aA=dur$^kY7V_2DyEK9wq))`?5q3)G&yQS)xE@s z1y0%_(z33*7vYfOw*SNcWi|C+tk;%y$W`0h1f<|H1=FZ1?PuVjM()a7M=6~ zNpNIpnOQ%Cdq;FH=E6|ytY4-PT#cTmF_l#~dxmq!_3bV+we(sxQlfhNl3SRY=B6z2j6$8-?{>gC|weNNQP zfiqk0_f>}@hBKRzK@owPo=mI7wg0U-9$lDrUHik06`f|)dy{>+F?+gp?^LB1Oxmh_ zkuNuV^53W?7WB@--}i)JZ_S(KIFr_+1rxHV$9mxqW@610>(D@R)m56gG)%#ZZ3(Jh z7Ui-BG}L&U%~_&!>f&^2)e{$M)e?zJAz7g+)%tJ3+>5?!mfJaKW%0Vi#(-R1PHryt zDcYQy@jaXmXyI?2k{0B(rH5;KskVc#u+CK9HOiIohOXADAWG}k74@{TUP)^R%qCwYbDTw1JwyNRYgf3I!E)qihCdYAepTE>h0KR1@kgUyvXx%N{73 zg_$)5H%=sp5af36;gbBo)AY#m&=9OW%&S(+oTSdm$P&x5;1%^F+{WE4r=N(cj~Uh`KUgp||l?#QU<{$GViFGAXv> z3C<$0xmzxYTIMv;lDbV4w;Bwv^`>nsVxjr5C!kk3G*k)Q`pE|>(~z|!;Ed-zZ{jbW zv>AVto=8g4aLQ3J*DYAhpoR>1ryt_`Hrt^#Gw4veGaBHy=Zi5l>z%#RmKXdu`{It{UK_z|d1`9~T&k?NZesqh~B5PiYJPY4mLenLeLeGxqjGgk+i!HV&*YfR@qVk2N zs>s51aw+-;{&G+ajN=770%FfMvFk*oEQ zkLV~hWi6&?Cn~sRYpoRf;u}xDOW}a>LI&P&P&3YP*aoi>Gh-Q8fjJC}c0{+-vrNyzO-~ER^uXPX9g8?2}A*bcnzQdK^!=xXQSGn_<^YTq&D_NgIh(R;04zt^$vso~7IH)@u)h z!AEt4!5rR@+nmkn#M7E!93Ce93ZnT!^G{2~fo(Su2x0E8(+YkhiW}K@zhm~KZPtD4 zv2r+j^Ob5lI%Ug&n5D=bgC%0rHz;~%C`-j*ujci8Z`WOy*1VzSi?k_+qX^qfO_vg< zG^%aiN*R}X@5S1$)Z6LB#*eF4;X1QP=rpcFZ974;TVFRVwxFtD>g^)D&1w^iOY@S9+oiiazHG*Fz6$##m%Yn=zF4^$vlu;=%gU<0Hkp*8b)&J1 z-lcrV^mVi2cI=M6?2eBC)co0Cvf75J9E+=9j&|b~D%aiB;Oyq*jiy(@IaiLfNZZeUI+K&Np<W&9p zJT=s?;<=MNGsfg6(G-{<=|_jwie(QgGa7Kp@637WQq;(E`$(NZ&hg*hBXyrdH_OKe z-wZPw7`rPLjlGsXyW$|3xlm_bR@gL%3gHW}cDqhuw^_80jNN|u#w@OsWZXC(;wf^5 z-c_?_*V|3!By~6eZ#WPTdNo%H5UsK_n{T3AABU>l?=Ts4`t7~qe2_e!Ef$=ROn5<( z%iU3SFt$b8MdsjHtg>g^t73$Gkhg`iySRgWDRV4*n$;$WHx&0S5g?v=ldy(OXz#Oi z*li7oZlmt|YXaP}qc#MFfNrX`AIL_)_D?C z&S1Li^vPD76$_j;q>M9ZkYpb|NZuf`7L5^D+Bc z;?I0?#|Va2`*QnY1bc^fzRf>t`?46~9vh4V5Opecs6spxQE@*o(EAZ*k@iU|)aIC7 zZ=Ru#GWY5&~xh0or z=@F2VoGOi$z1$=xa$UwN;4d;37>;oZJxVSINRn!=GDJg7mgIngZ~;@&?MlS{9Lf_K z0ujQ}b5YiNHNjVnN-dLkeDju{0ju5|(0m4oBd;TWZ9J{;48f$75EB_CRV75o3!)zc znzcb1K8iH$CEeFTICEDFXtE$5hAprQiXN*Ve$A<(w6bZ*UENKNvs%?PdfW@|lot9= zo;oac(+KYE+6??3j*E=T+n!qd?z;zG(jD=dPXt|vBI*zp4peaQq6`L)RTVG4na2EB~nQ+ z*G4C>VPE;wPJNoy!@XMczeBwA%nsuU0HFFz?^5&tuh}xbYqg)#Tw?se?CddCXKy5a zQF}DOowrvF-iV)-R4#D`#1fGuZ$JHnR4(=b#aQJYMO6)#kn*il4xEzd%d-dWuWSyb zAIC&LnHD~n1eHE}RxyPER%y<&I&R*;R|rn3nYBH2>hJa7+mZb+LZj%c%}95FFF5J^6{Vwf#>s-u zCgl0pf$OxP2a)~+d#3}&Wz%R(2?r5&VDsLKWt*}$=3yE?cSdX;wfnx-h)k20fYZfG zl9V{Ea!GhqU8nKu)l$5L9QIg!N=D$^b1y`ocE``?uA#Q4N*Us(UxL-fjRP;X9*m-N zR-L1Eq&lA7>ZR&56bYZ$`np;`TRue3a*+0_<}i0ts)c+(i=yKfp12Uys#n)JGZ|j& zkV;95>rn~6uUaY8TcW=j+8a)^+ROQPwjEtfGMSv9s2*21cA=+ky%1I+s@s)d&R5_r zbkyvz#G#+Xt(NrC$z=kR6 zQR|sQgK^oWG~aFGw0U}3+HdMqCe9GswsS2B!344TXZXn+3^lZ>NyZuRU{)0ThMUmR z^*hxwA)$%vp-p;uJXH?=`WsUB6Y-HD*m8DXLvQ|dU5yFKAC}svQMwy0yY^y9cir|S zM6wW$Cp(xG@UU8f5!M12nZDO}`C#`1eGNGJ{O>0R?eZm3u9?|BlO=^CFx8@#}K3XC2*N!>2G4_FoO7`waq%Icn3L1 zSHI3`yW(p^Bl^+r{MNiKD!9a)JF>1tK8Azf3irmV+C)@zuKkQE2F*>!KA`C6Ie$^@ z>_J@ltx;uWt?w%38z-*@h1J^~*4aja2I^Ag+P*Oywhvo2gZa0STV!RIKN$2hD+X%D zG1@|k)YSPKxL3^Oe6tRD31<6LAEvD*+fZq~`&#A@xQGY6tEjdfVzr{?ohk0VHDI=P zudNR*gm9~|xn?s9vdsT%AY{?bg>`3Memugnakb?!oxbnk+?+gsaGC~K>H0X1*q>IS zOSS|(Oml{_l73<%B`DW;T>)BXMl?DeHyr&ZxMcX>U9gYAsPZH zOkzW+%MWR~zMK0rm#x#z=7KuyM$CB73B)&;)>`pN{?qlmQ71=+ms8)6aG?ox!4k9)B3``rD$UkRPH)O$fCxs(4C_J z7M(VkjeSgVd1Evi5_|~C9AdaHS!~rMh|y(owORnVrK=~M>wYil$70Fn8+-51SJ00O z@f58LQUuo=*GPbElVwoaTy*n+&*|2p)@oK66B^kMPHOr@LGq6i7L5=G+i{Dp=Qo!| zo7OA+I&#iChRh?ju3)bLLASJZkL8pQXI|S0Xk6uq14@PTz|nwYDmoN}g?p_KAyRNj zt`gB>Dd*!G`Rp-w5*wb*`+jbM0b`!+?mJD=XhA@WdYmF*iD``1L!Sw`pvbBso+B9! zIT$M3`QC;ojF-9B$*o(&S6byGt604#V2KAldtgMZ1D%U3w(ZcOUrnS0 z9F|m`SJ_^9(nvu2Eu@4V=yRt7b~+V#h&hUGe0U)4^lV-d(E8 z(}(E<>4oSvV#07Gz4CyKK`D~gxew7H)tBtgh}PIeg|T&9E~jBz@$-;j5o;P-i{e>g zJl>wx);mOtiXeQuvVYsS^4e|^X7|T4TWq~@dsmW3?}x6DP1ZKD^#h8`v8{HUSB2+! z&;os_F&tQs`5bOs7-TOp;Snqj8=op~JF55Up%%r@6Gg#R#&w#w)c>`N!)_1}p3XUI z(Co2o%+l*)b&}+$Lu@-yoiDdhHgH8>r`DplTF1HG_q`e{gY*%KAANb^tn#i&gyo@W zZaMg1a?2^BwX^L$*i_gueNP^?(lKS`{(GT4#C!p!0A~UZ9I3I@DW``w!=+L?Zu(j$Jx3>A{|eq?38sl> zkDWFng3P{qoMgUmQVy^9&1%5#PxZqjuV647T9K0#w=5wKg3F?^K-U44%B+@+50UXE zC7xo8JWJBZC&vb<%WOyEv$Vc@sk0x&Z@2)kgU5XsBw#>=?W|+h-A@>eA>P^+Zu&U` zwG4edoQtBGIL+A;gXOUpWx4b^mTow}EBNjz;F+0%9@_Tc%{bpI2Qmn8z~8IrOlZIQ z<7Un<0XjsK3tv=C-;tu@a@_64H;46V#7f^o-XsyK4l-y!#y_m{zH^oR;Tu*gyu{jdrLat@}Je!;Ro> zE$<|bvLk+P&2Bz7Y#iliQ{R#uiZ1Q1W0dlCOXGT-(E*YL&;gD^T?PTWIEc~H`zHvq zZ}_C(G7|;_Cpjw1=iLYN5{{4kxyp+nUIWHMjih#ytfVW^Pu<=}M&WrfN%W7Ys2?UC z6*D?Nx`Mg8Sc%V`8q5pbz4vy5-~#l-9|~;0%M(cVCG1CAyR2_MYf+Y&Il_E=J?q;3 zAuK(j?eLnC7`7?dDrBKtvWR^66|2OzW5K{l1O+>MQ8Dg70mRKJIxb_9YXSzks}g{| zSc!vgxlYgd$MT+PQp#l4w*Yfw~T{_|pwmBFRup zk|CpuL$F@iXkeWfQfs?`J{Bu_(tZMgzMD%|hy*@F+o)KGT!=#6S#2&@8Y{$QUVl^J z%#QBly)Q;4L+&BvF0Eft(cRQG-#Z_$Zs~RZuCL{@1 z=dG5M-JFLhygAu?6g#7H&}c)R5Wqq&gxk%h{gN$$dHJ}f7z@PzGs7W|x-gl7C{$); zpp$s5FMtrEIv{8583m#8~w1pw_KspMdM6c+7*2H5=Q)-YnqV7cF(2wh_zpBkug;D;*J>TkJ#fu z9~tA|T+zA5ZK6k3RTLg8DqA@47!x49erNHoeWt+glWXs?-p^=nY!*}V>gw@(d`1}L z9d(M*`4K!r`<4F9sn{YytfVRJc3T2}JiIFFx+4o9zx_Hu;_{z8#^NH?7))LosJ0_8 zt<@olOnwF$`wq69V(m(2F<;*}73%8vBziJ@Io^p_TGWYUVc$P^Ybsh6nRMIRChgQP z)Zq8${<1hFMlq|*aCI_`{wc3y>j(D(tqYZO%OGY>}zKJZw{DI-!gaourd_I)==% zWIH3`JdAJ|Sq9spSBgl~{aGfsmC^IV#5e=T30SAGE zAwZFHqXmWyfr7AZVUlrd!rI}6t_vFG8@MLP3sN-V{=z7OI@_P3a(KUzv4H?$mdR^|tCt__qUl6r4E9zsZ;==586Ja6rLv zNPnM_nXU~c&igS~Mvd;I07%Rft`3zPHy_ATci9(B zWh`~Wv7?!ZUY`qFPh|F>X8n8&29uadGrp6uP?kDe=NybZOpiz^A|Q>PJ}8w=6Kmns0uAi^d#-~g#sLv0GbIXZNp$^ zfTx~Ynr=sM)Uzs=#*c&=u;ADYO2PzI=a;GsB9=aJYx!fo6Kd~YJ0(N8x{G0vBPS)H zn_m9K-~vyhF9VoQgGW-hDiMGJ=vGg7flmP^84zZfP3?sPy1Z3KwBPn}qU(>t9r?rX zt)RlE=qeA;#-Z&m_<(6}_bzGHZi-W~PR zMt^C5Q#>mBPQU!knvI#~CPPU-hLLTnTF0$M`?ER%66+g^L>WiRYj42;bz`OE_V^$# zLB03k4@Y8xib|QFfcxI8}{AMAOnVZ&IJ@(}c?QbeBqSBCK_174x zt4HNlqt=&h;^&g}mD%FOfa&KR0jC!IRlGPNQgu)L_acAbPb_NfeROg4wqkN;1}5Hh zuZmzYH3tzTn!zIsBbzHc0HGyEoX)UTN8;87XDO~}*yF&3?a7V{1UQkZ3- z1U^Wh$%;c%`+=fDK**2%^b_5EhY<1Jf7P7*f9k#e9R&XgDgVWGn&AHL56b_(tpDSe zm8%LcBhXcRW5jA$;u05NPQ{n@eU4yw5r#3)FcC~xtKA^^)BtSWD^TqQSob$YhCuc7 zShWWo+!CD}w2#0~8g(nU;vC;H81)yxfMW`dBo`FAx&#J7s4~w&z6uN$FuNtlM@Tw9 zfqr+ja4a@b2N?I>u`aaHf-u+v;>)%GdhLbLMoOYH4v1h=Fi;_C4aL?q{gpqT34s=? z$P?>O<0)@?gn4}n$kvPumu8#V8AfYjiSd;*@JGQR>|)_C0ds|OyxrLz7O_Ziv8Ycc zJTp!&eI7ky{<NS-vaGDb6B{AHCPYN#{&par(iR>4>-wAP=KzK# z3?7b60FF>m#kdk&AiE0HuHb{8oG*;xLyn}P4wz#IZTKbeWH=MV8_`I0eRVp2n!PaS zGZkT6%mG}rA9!j>()l>dA)dqV9?8D@icn9xn}G7!gyy9VG}#gRP2qvSSQU16`M$|F z_X7lu@Q0y@{1Y-*&f9{Bfv;D65rfygwrvgbS_M1Ak$_NnQXc1lv%~Zeq>_bz1@CM3 z>IHuQ4Nl@KMCn;XI|hpE?-s6Sm@N7~(+sccnfJ-^4mG_HC#6DPre8OAtIQ}Je65zK7tP9?!Dex;e3!p%~4_l?(-A3HCns>H0SC)Ikj(=Yv z0LD6dt=fyDR)GD(NkYD^t_qH6WH%?`z|;zMR1Eg74Z%6n=nsI6Uq>Pa(3+AYX;OPV zJA|o20DEQ+2t*d-7&6&ydsoXLJEAI0!b9n-ox|9bk^3f{W@-!E5OwxDO_$rG! zZ4r8;2ERy)7GPNEs_LrZHER?zIGV}Nn&R})Q(149KciTcZp+U(qOgr&kH$cIA=H*d z^2*;cr!CsG$vDSc3|<$oYuaog>E26Bm_MW|?~+aW8M9SK9Tc_#i`B z$%2Fa@%RlUEeB?7a+VwGBWS6UYU;XKWZcb5P(>!!-ckRBK~&PFLMUcF_I>t8mNUEC zpS6HgpS}ay2P(S=XApiwt@T1WC6JXtJyhJnWEKz;FHBrATTDfu^XPJwyK{6Fo#CTY z>~iW; zETz~eoqI%%wiTmBGTY1PS5DAFDfrOK#}EE=J4J4piHosU@m5AwAj?QH?q-^tBksQ5 zWfqfARs}Nw|0)#uPy?ACXY*)8+GP%I@;GIWZj)3DR?=hU-I|1x^lSXQL zJMZXji6Ur$WPc^{Q7<{37>|y7cG7HNsVK3-9D4Ke&EtvMwAx4#h;BHfvQ6}ukWKWXT z3M+n^B@rJXqv~h*#e^+LuYQHK1PqE~3g!i|9S%a|Gt@A&L{zBqmOQwJX2&t;c(JWC$K^JSa<~ z&Fm4PPA@-7%64vMV}dUHPgi5{w=AtvY}H-41&k)6&>J*NH4IE+564{8^j2bcwb8lm zr>r-mVZO9Gt%92xHuy7>%t6!Be!t-_@PWpE+IaWxOgLBLWgVTZD~#48IPVjWr@J!` zI#Gj`g09Z)<5~YLfn;5%L*6UAzJFaSY(xZmI!t!Aom2B`8Tl+(;#0{>gtB;y2Tu%UCeZC_D;W0F8QnD2#~N|Zk9M(C$i|JXqCnyVe<=NK8jETEm8cUHzIs!z`CP(iTz6m1fQ-y>pGJhV9Vxk$AB6&6#r1z~<)>FAX{8S{__F-7Dws@;wmhHW% zzDxzLSSVn!+zttMp7G(Naj5X0dF&G7qZqe+e<|nvLo;a*kjKNYmb#yd=TlQ6rJzC2 zaPYO_tF^eW*J$+IVU~N5;C_-;x!ypQUfQd3ha_b!&p9cowcN=~MyG*nrthS+_M1i{ zy=&q+Uoz`I+0@v!U5;8!Q)|4Vx8ufuy*PIt6PL)T?(uN00y|g3B>A%BIOqIC{k@1T z;a#s-JCpMfz?5?q4(h<5_;$nHLp{m530DnM&mH%=hm{O)b=olq@E~2rI z5XQEVXI0O2cOtv5vksg!WYjAX%{3C5B}z=fhY!-_*0_|+a$r3f+Mnp0)OGQ5Tw*37 zX1Rk7*xeimEj0jck0uHkq-OcJKOjhrr9Sr|eUhv675nt_l?sd6otd(L@5=}27c;kB zNx@XW!w_Trv$0!xDK^)V?=f`l(Kg@|ROyUbez&?^b&uFE@6q6~$wjyPWQ{uYBgCH9GQ*YS93 z{GOtUeRf1x)+VUb0m4KeCi#OOMxPaF7R7rj=;Ctzh-0q#6UCgY8f3yrLlrIBf{KQ^ zIyAVwckwRMlBsy)4x5YG^s}xtL-Yb(%l6G4F|p&O+!YvQ#R_f~Hi7BZlWCN@47Or3 zmUvbPon&sJR~PT0Bd>H@l(p*ijNHuX@}KQ~_<3d*6^DgnhPd$!c};l6^+<+$^>-=b zP3;EtL?xL|;7bC6+F&h;+R3=JqJ(mg9gzE(x3*`}6`f7(KCt(3c+BJWEMhA7duoCN*;PFH#?VOuhQ5*cLs*Z);TSubmU`eLP`y z*Th&|L(wySvpc8sl5yrn67w7XCSyIR zPslP(2iuEw)-CNpwVo$u|spXIV#XTInXU>l! z7-S72$VKg%e;SRlGhAx$epxwh);$v!g^v%b&b Uow_#-Rsmx$HL@}!>$}DM2bF`CZU6uP literal 0 HcmV?d00001 diff --git a/algos/eq/Picture_FIR_response.png b/algos/eq/Picture_FIR_response.png new file mode 100644 index 0000000000000000000000000000000000000000..9cbc688f65b8aa6e45acbaed2845abf3ed659617 GIT binary patch literal 53684 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 `giXHsS9$RI+cEp$2H)k$lG7sJt}jne&*Q41 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⪙ku!@(%-6kP9wN# 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¬u#0p-GvhT&LA8tSei1> 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 Zl3HAzPb>H8td77x$_nc8IkLBX{ukI<^4I_X literal 0 HcmV?d00001 diff --git a/algos/eq/Picture_FIR_response_absolute.png b/algos/eq/Picture_FIR_response_absolute.png new file mode 100644 index 0000000000000000000000000000000000000000..35b615f0986be6f6a193e55b4262cfdbe1810304 GIT binary patch literal 51106 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 Q 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

+Z{T`j1;f7NA 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

Ni)B*E>hu^-xl&ztH&D5h4#dh>Z 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�FzQ8-hub=ks7DVnRPl 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�w>X8Cpb7YVg`V9F!A{ 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 T-l9?h`0u2Sp?0N~UHJb8bctWz literal 0 HcmV?d00001 diff --git a/algos/eq/Picture_response_with_smoothing.png b/algos/eq/Picture_response_with_smoothing.png new file mode 100644 index 0000000000000000000000000000000000000000..b9d1c7b591c39cfd83815eb4516d6a594849da21 GIT binary patch literal 66261 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 z zn2;jTMrdDP8EW|dqwB51qHOmsUK#}HR2V=I$pJx>?ozsup+QPSkOt|H29-v-JBO4G zQF3UcLt0X#uE=Z^JV>$4a*SL5k&e-3$!&hwRJQj7?Qgm?x;o(E8#Knb zyr5?l{y2C+pBxtJvbz3QKfI?@s`vN8sly`~xWO|zu7!3(?D+8Iu}m-bF^}U19=3xP z$3Dct_OX=f>U~MijxI}}nwdC_&Fn3iNBK9>4Zpq&52BAd%_Hu^;wlW5#G@Qq9X5=z z`9@YWNW5%&2eRQ29PzKB_q@{&4XzVo2fN1i&Slkl?9|CC8>31G$ZH-46e%1QMmvbn zCB}Z;VCo4N*;5s*6u+a45qk`2y@)yFKl+gE*>?n3k2Uye} z(CiE7;chOEX-f0cy^{r~w)}QX9y+vd;A}Mu5Jsekzf{ED?@gtpVg+GKZnu z#^oXtP3PB_JyD#K{iS{~Tp05k&ai_r$IF@IMX+aS4a zbRd??D|U3YIk43hEJN_%#K==GTuBgflyjI95F27&M{fOO&5Oâ*be^^5}KnM3cYy;ni4nW137CC&{cbKKvnB@Z7eQ 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 literal 0 HcmV?d00001 diff --git a/algos/eq/Picture_right_channel_FIR_absolute_response.png b/algos/eq/Picture_right_channel_FIR_absolute_response.png new file mode 100644 index 0000000000000000000000000000000000000000..50450729a2e00c12b02ec90eda1673454b6a5345 GIT binary patch literal 50603 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

w?3UP6AoezBMl9x43 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 HVdMKRQoy-c literal 0 HcmV?d00001 diff --git a/algos/eq/Picture_right_channel_response.png b/algos/eq/Picture_right_channel_response.png new file mode 100644 index 0000000000000000000000000000000000000000..e995b01aeb8c1d8a7c65b65c0285320bfd08202d GIT binary patch literal 65771 zcmbrmbx@RH7e0)Hl%xtGUD7Sxxim<#l#+``cT0nGOM{dME46ehNG#pmE8X3{2jBOd z`F%6rAK%RP%rJtp>^{$ZpL3n-y3V3AwB8DcnbW_ z%2Kcl@Xr%x4UiPl&q1;+;0IJINfk*Xq{>+A+Ye~K&zKJK`p!s5xW6C2o^;!PH%CHx zC{&P<)bcRi%|iFl(!Rd0ZfaXtI)AXgY20p{tT||G+Me}3XfczPc_&1J6`t#oO!Hp4 zGM9!Z&RANC!3Bdp*o9CEgHD1G^YDJd+loDHeqPKukwhRi=O(^k!+bwYc&K?paLDsO zkm+0Qe=mHDq+t#9|6CXtiV!Bo|6Hi3^spEIy^sS5!C3#jo=9S{q5bCy`J5Y^68N7> zN6TgFtx4Z;o3pL!{S|^;fUf3x)P z(e}sp@59@RK$KS5&hbHUmj-b7=hcTi$vEGC7P;QcpS`nRXsp?tu9SX?^O`Qz&?#cx z|KYC6yf;C9;BaG=Y-+{Wex^#6&u*U4ecmzbTrkJySfSzQ4=EzUzBS@j_LX6Vx5HLp zs$#iui}}G~%k0(YsD|fyJZODF*CZKONt>ML1LvhyU$EdsNbSnkV_!=vE1Qjua01%( zK9=(F{Uw<77|hwn9ax-+`n=p+eA34NmB-(dVqstad7W-L_F!HQ`QPW?-SD?vMNf9z zAI177JzV8Hj0pYx_KgM_6@+`&&oeZBud;#Z@b&(}|3UZuysoWR^kP0g*~optRYOxV zKZ3{jVVyxd-v9n2XSCW%4Z5i2f34}c5<(191-DTI20zd~6A-sw6j9N8m!o=zE`Aws zy9p9cn5nk1nL=xF+Y_RL-QQod!F%Fqd5Jg6ss~30@3wW@M*FswAC?|&{AYP%g!cuY zWO+$xX-sXGT^#Ei{#TK2KGjqBhdIbVjt}1D%UMr(T`aioG|RahHh8N2^gZrnP;zvv zeDkcteNb=%LKEdryNYx{n0EzioH2#pQ>#14q z-K92@MgIq1=%O^9XhDR_zCIY7?)D(4mhtk%3)7%~35aY286lwc!e!aM{!h z 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 K^?bCY|NjF9wUv(m literal 0 HcmV?d00001 diff --git a/algos/eq/Picture_simulated_IIR_FIR_frequency_response.png b/algos/eq/Picture_simulated_IIR_FIR_frequency_response.png new file mode 100644 index 0000000000000000000000000000000000000000..edd732a2ef1404f92b28862b19485f5185723582 GIT binary patch literal 73901 zcmd?Q^;cW%)&)uhcQ5YlT3mt_3WcH#R!S*Bixzixw-#yeLh(S+QkAdaDFNDjTHS0$x0~kX4gKLaL0#yfsAzUZdM9zjH!D!fAi}d(!>6=pz!+L;fpy zS#3At-ArUJ3Z?7&x%LOygR%*0-{xAqkR&aYb}SqbhqUw+UIBr?_Wu6xOc6*}db(|T zdV1Ew?-HHoBtJj0eaX36ug-RJRcIt1kT~fVKhXDUeb4&>3nkE$APxTEpQ~10{MQh^ z$9t{s)6ke<|GDCQ{hSc|&pqB3%mL_JkM9B>Cu|KO`Oj5I_qFD@<)YWa7su)2Q+j|XFt+TWbpn&Pr@aJ1Lj&hXkV%5WOgV!6A!w~_t3eRq7S z(By=KfPrr>SH6Az-P##R8l3y*Zz2ny+kg2Nt=@TB09XRxvnCt$}^Nh;c^Szl|)l_b)A+oA>VDR|X*=GGI`SzgY%%=O^ zbd8p$x{LK(gV2LyiFjcH;;!&Oc20C^{D&4xW~}>|F#F2_?r+yN+MlLtZA*aBgd2=2 z*A)Ai3v4WBie_DQCpGs()hNbnuSXqDuTQ162ifeZCi2C!=iH|hW1$P#4Nm3Tinc|K zjg9cC-wkPJ@TJioS`O>|WTtP}VNahuyJ|^HNZ@_{2T7Tcz{doig@wiIe99tC#DSh! z?dwMp3Q=zpuOsBH7^;%<+sOGMKI`GU@M)*6=^}rt*}BSUrw|(x-#ek-cjpE*8yz+a z-WOElLRNX_8MV=6{_GAe8`{5Q15u6+=n8Bej{A7L%!>9iY;N{`Ex5%O?$4Gq#4BHJ z6=siSmBdE(8kQS3k7fysD^94o{lfvKhO`uq0B(aDWw`Re={l728`^V-nq{25H*jj$NX zB0m4~@aH3lLsXRP?)ps5#)h+{yeAM9*A4%Z`s&6;?z`$wMP+3qF{3=5=ew;*Y+6B* zBQktmz$Zw~w{e6hB|T2@&QC+hRjnjWgEQVKZ0J&GYHE7n8e%baogXal?EbJ=Y73tH z^*Ou3g1QHUM~*Sq=<2&a`YmFqJ@n*5pMDsd!E~B{1&*-oG~;e~E)14Ls=lqrH(F`h zj&kqaAv37v;n7f0NWDF&*=VM&@y+w<*xdABEEt^&87lOl15HF+{KQu)gG5LpI5_zB zH$5(mlzg_7caY=>Eei|k&UmSugF~f#o=?5+gVe(JbOKV+R56|NVw{n?zZ&a_<4hI4*(UcyUmByN z)KoKIk9&H0@M1;_a&iJ(LGA7B!3^t9>b>;J4Drv6jrze5O`hG!O0za<`@==q$;rvX zYV02`Va{7`m!kOBSz$%=VKFgwygzt~hI5vTv_Q*m=irslj*bpmZf^C-k?hM$w|j9o zX#+|F37*jsKSM`fPmJd7VcdZ7Jev?z|_=K(|cQ1jdTWlQ;6lUNAs;Uwmyb%u{XhT(^o+;!aoi+%T7!hi>yanO_q{zNQ;ytJj>$`Dbe=B_t zzwvJ`(XJ@6K=+e%%UkHTTzHN#S-lsw0z{L^V!MlzgQG;fO*y%zN7=aJ1%_m*v7E^! zdC?K+vpbYc$qqCwE5n+zVf5`Lcn6_VKreRqa>&zUic0Qis0Nup0R;o#&?o2+uGVn6ryY zQRUA*Ja`|PQ8`~GyaBYeay^3~sxC^lAPBHLl!!#w= zbu&V8^gK-uA4rnqrZKvAa>*Hd3UOjR$owCR)CtelAPAw+)LiozP@f?c*Ho0P+54Cn z5<+k}_iG3lk`rt@I~9STFWl5|gt6j;i-K$Tl$0WS)A*>k9v9k=@DK%3DinVmGA7N# zt{5o_{%RVN;*plCOhP7UN(c$g>#SFu+Szb&v(ash9Sx88K5J!yl_g?_u>hpv*p zpugQDf6ccO_sM&kz#g#Jeur^7BOaIMQNd|d`PeGBraeF9*l#{iad~+2v3*j8Aa?kb zN`!&*FZdw_6v>WR{IgT=56{zWDiUI1bk72Rc1ag>YwTc0vN5J?d~Xst^4A_&lNcF6 zu*r+>H|3?N>S=({dD?DQ{lL{;?`RMV`2d+34SM`7$4@^-zT;K_;gR%N^Y66hgW49u zJ61b+{LnM2_Mns}k6%=Yt%{7?+e;^Rbj2c596@#LzrDQ;YHnCrT6*&N^Jl$vZF<9by0YC&vE7Slw4(r5ACO>40yFYWboPp&hKR zGw+U3Jz5MAPr+viM$vcwHPep#c>CN5^B7%Q0E9t;M8RjcPOy%4%2HBHQSfzHwS`Jr zE)&i=q}lEN{l2Q4Gi;kb@C{Z!Vi?N_CfNSyQvHZx-~KT~&Vh`{Dc}Z=A;ZxYuto|J zz#<=4&8xJt=7-J|q6pl4;8jwU08F@&SE*#5SE&yORR5YXr=qIFwHWw=87wU~pBgZ3 zs&z;@>Z8rIQI=kZih`F-W5y$cMZqq>_4*S4bw&eY+ykcXmX>?=0r0aqO}*OUz6ee7 zErwl7;6ptBeEUOLOp55Ikn+f9`55MgEP8z!tnI((%AObnN~JG7nhF=+RO5gqL^D?< zeV776d;Rqs8{Mz5(ex#bss#M;6&hCidOAu3R{b2OfLD9y<2nGl&@7J{7a$x#YC$Uk z4ZCs)ctbJt4AzQxoFBHAIpI!QLZ`uiHLl1;2mIp#C8oSeQ1e|!Exn>yh?7>-6QgoE zb1lN{Ufowk;-KlfC!(%6m`Z|jLxqD-DUG>;H&jaHJOwxj&1JO+BxaZ~a8mq8fLV>Y z1qBC(*N&-SV{>U_q_ENXfB&2jD$JS{sC)F1Xj^u~^*fI<_PclQfCO38nsxbaoCukrVs<%+5QyaBd=nL8R7rc5|A8ogAHf*FS8_h_v;Z9Hv=9Fz`yAc`tX z`~eIX6^NQK4OKe!5R!uPZR82IOi`UYBM9IBm*o|47?>+}Yg)B^8%r1Qxyue@{AZ z9^c3WBIn|LOv;i5JF*#$=me123ckRKqR0eZl~_$-46t=qLaF#tt^YCrn+FS+D5AL?;ENd&J$bu39r4qZeTwtTDdn#&~ zwfl6<9R(u_?){{040*>RN<2Rw;0+dqW-zmRUVksoRVW{#ENuYj+kYI}I4M^rbXIQ_Xh;15}qe zrvLSBU~lP3i|9lF3w|l6q^j5D;N$`;LfEi2{ftTZFvb2RN*)m)Tp>k){LL<DLiVPD4mrG$I5IHrnYUn_w)SuQLWjA0$ z^kmIoyp(f1+zHwXBR`?iW3&9?s$8_y$X)as*tGjdXPA`n21aD~1zy^RCal{t?8j)5 zRszq#_$CStX{Y2m0qo30sm7)=^f`m6hZEy!(()WxDjx4Ssd^@)ED{Tt`|dZu1}92O za?hqvUg}SZ&@v9dFoRl@|Ic=|AqczxsD`=Pg8y&05WFVL|IvIZV^Yex`YD4+(1RM# ztjy%h_syMQM1AAEiMWdbwdgql5r;RAT5bw-ZnkX4|?IeCxzB{Gw_65g#$W82;y#nY4I_e zc|xpy>ChDQuWf8#0(rYEmD0cr3a%Z`@If~_dSZII zbdQY@Q&Up|VZqJAV|l9D;y;-y;;mKOW8f|I^FzvPLjYS5jw3BCZCZX0sV0La@TqNOJ4#OrhsJPy{iJww|){CdTQ|hy&$U(x%CHy9%LpMNA|f=;X=p^&yj&DK=cb&))(^l_5uyAw6$n&zr)hF`Ga2*# zH0~^`DMxV_8A484LH{id`5p#H^8?Xxw@+jQ)>#XxV|!2hII82$kKIU@y{)qv(FP{s zu`~~^r|%TjZg;FG5=I$etoiMYeVK?asiacxZm>u&CGp~>c*PpK{>he)S;p&$C_8p1 zB4>%$3}vA>keqe<9R;RiikG){u;d+GYDZt6>LlSCX9(?ab%)R`W6wX?H$rseKY&2i zwm;*oOK@+-kCtbSsdIC4!Oac1;MywJC?)?=YdMw9dsAhHOH zQCE7*|6zqKZ$V8%B`3r z_=CT1|3RMsh7nBqWEVq%j%+5|4E9cBWe2sr>E~q8*}WrNBuWW6wwhZG{}(hFQW#a5 ztZzfeM$k(+fb6>mL0s6pR#L68G2c%Mnx&}y9)vUC>h>X1iLO|^Uv7O0dlyTs}-Ibw}?Dsuew5xecWUG)ppOgTalv)3=+U`2HF`W9jhp1EA zmEdX~>HmU?4RaURHbLXc!9jUy?pm_G-};Qi(Ry2GMVd|Qxo4B6alVlZAAnN?1p)j$ z+qVlLc4}a;KYOuiJl%B=D?$@N%<+ut=+giZt; zPzY>t{T!yPtEUsTAFSIrJ=H%du>?=LoC0HZ|G4`R>;ssKe;sS?^ylt|d7n6`{&=}~ z@#nqe3)D=Uu40Sn;1p;K$(TczBdoZ70S~>DZ$mCF(<<$8PG|!tgG#>#aFz8DxDL;x z{XVwE7WE4oH*07AFT9ejLCBmwtpJg7eJ-Yp=982>SQB}fAwVw{R3lOFKM8&|)&A=4c1rqT#*Kl4XI4_6c zvcOUKw)_p<|js&12}+M&hhs`!xIOKk9UWxbq5OmFD<&C3-qSjaP=V1b6CPe>th|aJcHV^z5-M7YM^XneN-?EhzG#pj)i$~CUjUqMPY zc}T%`Z%|shq_C4yU(%Y&>WylTe~DoAIZ+S+PcO^6im1HjJ0)SB3zJj#z+i`=iMW6w zef+;scdi7C{fg7S!zK%Sz?|WT5#jreOv`7iEa%X>A*5Hn($FEX|w4&*`p|4vl<$AtNu3|~`J zOiCdm&1W8;h$xVIc}5u>lLGlcg1e7E70LsRkD+Dk7p0`klI;Xg$D3NC=Q9o*All)s|lA^;!!Jd)?syMOx$rp*C+obmN5 z{;!;k!F7m*KPShUa3qWQQg5`qOH}PVjt4tI^irOQ`bDb)nmQ2EU1`?g>n^sEgLJsZ zU!Vel^e+XH6!0yQy%M5weN(wzxvEod{~!|PaUJ>5hkjXla_tgq-{f#tOxyJOPiA67S@Jr zOa3#rW>yq;ynTbVvCleeS}NHUcDx%y+kaesjak}(cR$%j5BpH98ejPKS5e?Uqz0gH zLL>cLihXJBu%75*>rZam4%RuaD)Q*@`enb8s_diXnne@VcBo>c`Y7P`XWHRnZ?w?p7`9v z{po~e3wmrE|FIP(36*D9PVn~sMJv_`y$M-?__3*{PplPBTI#)Sa?y6KUuv(jV+v-1 zIApiuesh9$er3*!?36Sz^gnvlW6kXtx`bEREU6`jT~~%2y@RpV6CM>s1e8C~32lk1 zxgq!l9@uJiooh?JeHpZWlTqe+!=j>O)ZY;g3rB-ychB22-}iTF=u;n)p64ZLJGI$( zpsqSeem2sO%k8V@1CRr^lCv|cLhnH%ePm5yJh`ZdH5aRzM|>Y?fh^_EJvwB>iT(>p zJlq3gVoCa0vLinKq8Cxuex=-g)3{YIiA%?+ODx+E@tDK(u@M`nynLW@C3t-CUC(Ne zZckS@?Ny5Jfk=SC!;|{+?mS!qx3M7I#7tw69iRq+1<;;907%l2(oTQmUG!lDeqRZ| zg5xjR>G+F|N+U(`BGP_8Q!_kO-O#(#Q%J~&h}y*Kh`xCeyg%HL*CC*u)?9zdh9QE_ zoSQ@l_U8y?a36TT6!r=7Ld&2{u?-j+n{CVS+L%#${bM5CYveoiA_fh;bE+1M19UFU zdQZ;jv#(*^reh**rL}Ody)?QnxjU9=qJceo{+CR7dgTT9Q^%dH3#Rd!!ifpy^_0fd z+>yBYCOF0dzXEx#%K>A6Pqoa~J*=(3=f*^|M=iz8Tv~v#~eo42v(F@W95GcGdf7l8@y{K0T$# zVN5|rCDp`DUJ~p9M9zj4#-MA&-_8dvuZT;^wM$O=wjs>lcT(~{9<-LiGMc$xxw$4s zR-h6Q6Eldg$C&7GT@2DK6#@0f$Epok2r3Iq_oDK7Ru<@Yq2#{n1Cq(-Ayq8#-|AG2C>S-X>%HF4x<3C$yyJp9w8l7R z8{=v+2ip#GuCEJsQ(}6C`**oj@a@0o<=QKqF<%1;#3hfmzRVGV{>!~^MS&#E5G4zg zs|2xA6B5tXx~7lb$yc?z%g3&6%eI zwhVanmh{KmHbgPK01zC%Vv!Y@TEo!OM!YrGQRv4b2>#SMDM%C;RuGC*ilXV0~K^E)^~&@%L(&K2d$uLlBmiqPX5>|_!p`ikn6 zmpz#Ul%&NN|1HtEYsRGfPOcFydRx#tsv#%}Ueg(aG)++zHd_~hzt^lVI*CIU5$;RM zwjtS=vKQ^cg1F}S`C;*lIfBzPd@DXOIu1{K4XGXh$>VBfo19~Gy+kNcAN*Rl9J`+q zfWLSKDZQeDjzK;@|M2TI$nKd7EP}@tbekm#`NE5(cP-e3sx|b-#|HJ|(C2RPt_TPL z7_(qV={zNV_!(uRHzq(Jh>~nlX{^IwB9t*|M&D>Zo1!j-c>oAQ4g#(%E#(?7H;L6L z(OsHv_G}|F|2K)pm^pJx-;yTk&{M{1QPV`gTeInqSnDPaDY=T7a$`&7rsAhWmQy1~bQhp!K?81rKQNbF2V|!Aw}w$M ziU`4{*2er!bXB#{@zjg7&@tGA_J6R_+dr+XPf}7+M85340D6A7K*JR1R^d`h$h7#} z0gX664|nY!8o_WpTFsx+9rW>EHF!8#=r+JIlDc`b33E7i@L1`J^^xQJ!Nz zkR#`Rtv0%0CSE$IrfwCejN|0(z=&4rEzs;~&J}fFoAWj5%ZP&ypQY(xtKe8|lT}{J zn3q+=rM%~-a&C4}`*qBlkHO*T`Xnnu#^bd}LV<95`y^;KO8`q@!WAtxA>plt|AgL^ zS&R$rqVApuEkR?0W77{%U!*1#%a?RM4{r||mpq5D)#Y$4|B(|1&I+W|Mql(-2fpp@ ze_p1|l;dLH^b=6Cg_43X-fbPQB0Hog&bE`d(an{!`mi;RqH@8tB@ zw0!KD=X$F5WfX~9{EP~4MaZ} z_>^I-8G6RUa(HGp-Z6-B=q+U&r^K5?4e5!Q{nC0`+>4QS(0aB_=sHd7a7J4*1dXN? zvq~GyOtf8fix((*>_2PP(^<&R)n88*^~W#jxDM)542XE0@1{>XeW+zG+Xb7v>XI)r zF7|`MJrLu6xAp(_j{EhwVc3G1 zB~nZ?zf+-yo4vgu)FJI-YRLF_qGpv7)`Nb762+_|Jg*Qt;ulW2%K%JAPuD)8GHd30 zgbGZ2F?P;~g27W3^*1;4OZDY|FZh<8Igl*H`ma~(;_RKre~Xrk{p5<%>>%=A*GNy(4455 zZI=&jgRe_{=yq0iB7JMDfnmkc7bO0~<+TmQ@G$g4(CFr8e2qdKnY{V7=qVVa>C4mo$B%2L13^m5ub(rYRe%O7J7?=T^CuYa<-aZS8GZX1llw51x$&z`M7io1KQ$o)ZU5_7vl7UQ z($H)~6e>j4+1PEm)K0|tVv=-fj`OhNxFv0-1vjBKMyr8(x@h*J(?rdZIxVNoe(u7Q zy)%vAv-BNQI$@z_Z0HVk%h^#&E9-Rb<|g-P%O{qYSdjsq-+d-*`?+FfKGZdQ>M9^a z+dX8FAJ`9?3}Vc4%;dtT2jmO`Ctnh4W2Nt3TpTQrg2(kpnPEhA?kCJGi0vDt7|K?^ zC(lO9JRShaiN1lsiPjSF%eQ-iFvanclG^yhwe9WR3;oedUj&6t$SUN=qq~G)|3$oY z9gK_4pa<)N=S2A^LiDNs>lNa~gV;!c&gE>4gVmEqCU)8ZBe5&y;_eCN|eEWDz zh!fVxlMRZwtEz*)-s&Dcmal1-3w|wIP#1eri-NW5i^W-HAa3y?z%P30yd+;{Qd0fb zTS@>WN2Ty~QbS!`ktB=NO7F}y;rU^$5ANDuO|;nXz=^|ycqeyM#uKi1Yu^mtsNEy& zPoZFsYQ-qUtkURVi-Ji#afzB_CRSLKbm7^*s^_fpiOba~v#!&T(k)JOGCL?F<^2HCM zJZo)R0aRS-s1m*MqHaXdqZIiCY zGx>ZZqo#vQ5Oh(b93y)grpSt}Mf0F=#MVH94mjs2zb++%xbTP&(8sO(pn=!Py$ zb!hkG`t8EjRVUgz0gSDgu9NCd*1cA#2TQ+3cx$yRv`zHcDC6ZAFt58%67aq+q}HNK zk1++K?c6@Zxj>{GBl<2cG?nl#$R|R7$qpdMCMonICQwY;GsK6XDmi5gl+%6O@ zYuvHJGvLErhfD46c$-9JrONB6`ohKOX$K(2xtwIwdF+gz9T!==4k)3MA*RRH zOCzw7=n)biAu>}?4~4>`VM=xh&#QfW`6|9cm?r)F*^?7R(-XDY|VYvBr~sDTvy@A1E$0A(G&FD@ zY3Kp{t50Rz1febtu+947vew%f1f*(2buv*)O9%b$EjO!|2RhqS{cQ~-&{?POnUB6F z55d%rS3|+N#|@_Nq-Fp8mNM9r@?vfpd!UJX_y>Ql@VzW*I>>5@C!=;>N3rO zT|VF)l#W{se^&|zNA(YETTuOO?7a#`D+S?-{|3C?+>^UC6}@x=zz0u-ekQHU8a%Tu ziy^6J>qqcYYKedut8f~}>_*wDJx{~RHR1^(7Z1@ib6__Jnf^xduuZ)B+~fvNv4rs- zLm*q=d)WCQ7nh_hI-e$}=|9G#n6iq2<0E2HNT5OwlMFepNYOZy?N^b zQwcDNclgLx=+ExP!jiM#*(242cVwA9djsiN)6&^@z8`Jyyf`V1hgkIa+b0z-*|Hy_V{GJh?-H|=+uV)8)Ye!Fd6KY|@^4Kg5oEmI2T zPXSt5-|8wj0>tm}D=pn`K|_e#-?IJiH}ND?F{l00?G~=>PWFRbBT8h8Sr@?xn;L0>Gm}Np40fg=A1pt z*#mQ`b|ep#_|hwoL&|tRYPD(lqA!gIRfImMk)>1i7DTqK ze59bO6Y)#}`|$?8LX_lG&R#V&8Cgv>@Z|M};Wc~xetS6{VyJ>w?G$RNcvEDPZEi4w z*FBwhd!M^%c7KXvKQc-_V2pyRtLUElMd zHbL8k$mzYxWQxV7X7G*W_ZevKD&j8XTJHy%!ar^*34Ik66bT&nVjV8r-*f#MqNL=y zxb*UBI46@bSc+oEvh3+gTDKG+%8p`hl3eGdFBD7_1J_@n&F~{1%{DV{#EtK2cLI&} zF$Wbsa59q{eLdBK6rO`K)cx&_cdnQs;tM+_ z@A3>6@QyQ$4>={HSu1AgdCST}>Jol7YGnEw-a8+$uWAdiNz}d}-J^qUzWJzS&)I!R zrEShSIt;?oB(p@pSlEw>ss2vDNhtu7Wl*BQSsXK7^9ReTVO|Fa%<<__X_X7Pf6ho+ z-b~OcCVe7FUYWtB)^|{#HZ;*m3!G#dxRg*Ve$)$Ki=hwo{v_JJpI6k6^@U2jb8l`8 zS%+xWYhF<0t)=Gv9Il8-G<(fGy?3H8Wacljks6*<7bYeOe)3M|^8K==d>ni^EG&_B zx*b10^C2qZ+s&0(aT8F980~(de%I1A4sGVOoz=#olzNsNYC-E_E-mjSG6wXDO03?y zNIWOWfICti6HYKB9oCoMH}|K%fr4y&Uj#dO`^wgjC}`)s%5G_+qaLV@gZx+x9@kb+ zvUG&aPZ0!sdbXb9yn-}Z^nAYrgG;W(#0a3pkq4bCpA*Z?2It%aGkx%;#(i6V_;bDI zJHp=&Vsq``#JyTM3%0woI|NP6rHpHp^FK=QB7sP!A4LK;ZE+5hO-|tD>2O#MyQ#YL zu8biu^`=KtEo0kQg8tZir{{|9=?IuyZ;g2G5OWDPw~U&(=m(aEkShJPMKiS+U6KLe z8A)tnGM+C~@-8vsR-q!d-o4&+9lg)0&RV$zF$cbQ=I$ArV2M&h%tmQTanwOs(YYL9 zRgQ5a)P88{khOW8mU(9MQiX1soSq;)aDHK`srQhuzJ%j*=9qMp61r-QdRO{{lyi_u zkqMVlNnQ?lIggWnXOe+Ec`te?Cpt@}U$gpA4_iuu<8O!b!?bzg^hVpuV;LK-3_ohm zYzJSRBe~G&pm9%w0J!5SJLB2iOLl_f5!E7$(vkTe`ab1$l}_6lEHIzBmDoUU@Zx#R zw@a&avX5uinA}*F$e7<)>Zpnh-<*n(AVvO-HAPI2#8U2~E14Mmw@U-m(sHJ>yK;cU zXZ}IY83uNWo>gd>9_bU{v60>FFbR^}isG%zf$c0IO=f%{JkMh+rHY^wip~VG1<`F* zl{dk|OKh?(HS6FiH}i`Kc@i$AT;=KccVXmL#Eg+1vj`%>BzA~iw<&j7mF=eT~$;%F$J1lqHq2q3C zGA}+1;hO_GUt^9MplY?n{4qvXAsJ+G+@^9$!TTiFCS~RHFy@6cgh=H=U9tCgKJ3(4 zk?2B{m<^~9K9qi0kqkAd?i& z;!4S|*)G)N6QyFxShgTWsSitF-O3wN#Ag=j`Cp_lzk$+)ITEL0$-O(78La4+4W|+Z z-7lg8PPd3edI^&<(X?{5A)OzS7yDew zAdLfrEz>C9FSiu(Xux5|tB@u92Fu1F)NV#@mqX= zf(lryO4LF5sfv*o3ExTCb6+Z_r%Qz2?Ac$5o;1_NkhsvVtS}X^uKI9*W{t2}U?>-x zv42xR_(ILtBxn0EZQjB|RHcH%N~)Rg924w0im5op@AP>iKZNz3S@8@?0 zd7`Os$(KmZi{PilN|#5=-#n?-`0dI0@PaH_1ZvLL`Q#U>W9ARHJMo@KQt+Kg_YdfvXzON(0rZ%dk-!nCy-!{N4z)(bTEj%b=TH=shFNL_?c3y zO^{*eNSi-7<7e`~q`k!ao2SkLtLJ|KrDE$`OSXoVE~j_2Lv->d>vVE{&wR(( zV60a^*n)JY6ZX;U%>0*Swp7?V5;86DEv{G$rF^k(l+F~#5b1|6Zn1yA@bn`DALFD8 z=lT&R8NaB1%tFwp~?iWt4{IMGr}$% zl=c=^hBuLdTs$+a1=l#1M})$N!N%cNmsZt{6)gFjQfV~wxxrq5MdyQ`3|$ofLa6RNsj!$RKN=Qh ztl*&Wh9`56rM4EDzjw7R$)%IGLytCZR?CG_*a( z2R&!r>=F^fJ*({>uAk}mn*jj(1(0adfL>yiOy2D>h8umDgI@-yymS0{4lL7 z*wZ8rPETkzzsGu8JAygIl!K&bo#-yu;)4he7c+b}0Ry8x< zNWuPW3YRv`;>&~t_$Hz6FKPEzO82bMB@zbhh_z~Sj*E|4VFG9`&YoFCB!yPI+WqwL zBbw*(VknN*aJ+{V7yZu#MRRp>cHz^`P2)S>dk@Nlb(cTMStcu8IpK$ymf@$o(s|~r zse1uc?1Ht}tyd=#OOl69qaRsLK#|*n8`Wg>3!i3JnZx$3A85%AxmDgSA0j@P)WfH@ zV>srdTWBS+MKQMRvOPcIL}Mkn@y-$7lL7;cMR=NYj6l>qYN1 zgXw?l9E@R<$_0uqT~?^OIj`~KL{%wTSzv0TO5#&@0zr@w2!filU*yQeM(e(p#DDLd zPHR0JEfE@rFAW)%U&LAOrQ0gZ}C4I^3sz zkVBkDJLs$D&80V=IR|?=2F*a@lWe=sIq>}odu@#Rx$CZ|c)a66 zKE)vIi@#eilteo9DnA!A(YU^GR4xXWe<^x~cpex2Sx88$h zO?(gNUu{lgs0(v@sWaqxCnlM>ckU!!i0{lQGJa0MvHjcA?3+M?Qrw%mfC{LH4_Yl5 zIrr`)#!xh~@CM6Mm2jpaWdM;%*W`M!Gep3`9haza9%LExa(Uy+a_rXftB*KRGn?U# zO9>4$m~AF|EZ}p=$-wbEG`_N0`J!G)i2S@~zQpDYPAW6pnd!bDFNDynlu8svKLdr%icPvzr^BiM_dmJKecO2 zp>thuzJD>69uY&5+=Vy8q;Eb(vJq0V!7ZFq3*SDGB=EQ+#P@zE`I7KdEkM*V-vA;s zy&3XGkNoqiEb+|ao}E>4iSs6EJ-P_vx9pEN<8%1I*epjX>l9Rl4`x%-j6wk#sxpn8MuP8v`* zT~$Pdx!n8oebQdX1FUTheV|ReFT>qm0ggwSPn+gyP!G+)x+D?CsqkixE&t2P8tUyP z>|=NkoboM;{*#J8-oaOTm*b$DSK%sbYJv1)Yx%eG{#C5*flBmr+Grtfri9}cw8OJU z@R{g(Ed^f(TX~><-S-twAT++RM5DOkI+l~rAYXs-H=wMIVO2YoctRy}5zol)^UDVN z(lX~yS!?mMucep$Hs7x)n$TPus&|ZXJ3^TXY>q(IpBZy%r)dw`6qkyKt+6UKhic*nXIA*C*u&B3}=y!C$HFNbmU>K99FeJVEVkz;p1V_F#hAF~0ta`pG^ zZAd-~(;se5isDoCvl?>4*{{8q#naeYqZbRL9P#Kp;VB4qWU`AWh>CECMcr%lL6f)5GE{|-Ekkr1km<*Vo*4^M**hVg z6YXWAWN&32(Xqf1BJ%Tt6Ns8554a6O9&!MY?%x;LyBMJ*0dSz08J4V0_QFw$AX#-f zN1LFy1%9mFPN%vrUgxSTLT@yBC5@SVn2DASw`xibnvl#b^-gQ76R^2~jT=CiIQQ8k zA_%t)Lkm`(0F0RwC-R=<{f1SYjPJYuD(rx|5iv1=pM}HKrKRT{V^F8RdRXSL_76?Q z(+C7RPwQ4=%w+^2OGMs&mF#f=BBLss^O9?iRcA&-OaZ<$IO1uZRAnV?KAFi`$-6hSvL za+_2c5lOqd`OMQqnBm+PrJWHLU{M8bUDQ{#8ijsT zS6Y?)O)C-csp6WU?V2m-%bj>c6Agw^y}Di+$J?2AhnDhaeGIJux#n(BDXlRnC{T0d zwqcAi$c^}X_kbxEZ%ZMQ)w!BqxtixZA_2XWpiBcx;t(q~^d8v%>9wS=mY;`8i}%Sr zh-HZ8?0X+mK7xW88Fgn~DFBVba29Lk7i2$Nv6S^Um*_(F&N$>}vQ{)NczHbK^w6JnTL;M`<_^>cB2v`D@SdoKAbvmG7aq2Fh`fU1a{8&CtO z8xf`qJB=g|R_q#6O1;zbjBcmTRtn1=GoDP$EzfnCVv953)py8*4WsqupCu-Q5w3_e zu|gGOryh*9+ECF;_^+%)q&D{TeBKdfOIz(CbFqmRbHq#KilV52al-M&LG8hGw)cLp zyOW-*IBKHB;PFwC-qwA?`d5GZ6_-Z(hOzEC-@WjlBbdXzS-Ih&K3tnl?)40<>*`hk zjsohKy9vRTzQszNX^Gr6tF~uu!ZNW-=!#(CJ}6D{jsDQXh{;K}ME>_FX}#*#uJHXt zDk;T|QQan)9XD3Aoia~)$*nb4*m7Xgq1#7+(-)0cnt@V5)-61TMdP85wuFG?w?lM#5G^IF<_6mUeKC1I`^b)zb+OhrsB%_is2T0k1Wn3(c#)Cf@noA z)li4rHFT2wLcNcQx}v(Airo$x=U$+{{UAxjG_xjPjN8Bjm1KF(YPTl~)7Ed+fY$5; zC_r09YoJ$K+OY^xe3e4ca@O7L&r4vPh@2 zvynOf!bvs@PYcDIGxpn*E^sihxjI_L0RmstFHZzfGtS~8Q}|z{38tn5z;p64fX5N& zH@3CZUz?LoaA&{CaXRd-k3Bm33b5d9KR_^+p&BuoL`?f})z!`W)-vNTRh_nojYk36 z?S1d7!}?4Ar<%a(G!rCgN=Q_tTLfNweblJDZ1+&NkJH!zd{h4B|W#W!iO zet%1!WQ%WlGNG4F%+TfFRO9G8hAndprM{sfDZ`MvpkD>Xe!d5;d`^dWw;r?svCRpU zH^#iXsP}o}2(S%Jq-JWa#&6pf!#MVB8G(T8=ARQPc9cTZ9~w(N8p_{qf*&tM%vKQ_ z;JsYNTs55cuh@UkCOG29K_SUi$hKsC^rl%Hwbzq%R)hsK$?K(7ulc|{G7z2A*_ zxyfM}Fh)Q#Q79~}-BvZcs6aD z&9`T>{eGU5bE13L*nYcMA;Njr7nU%^(fZrF2Ml$B@$S9-rU${R?KUYoBx9 zXYak%XMxFJrEji{)q>jA`8G(}q^>x-eV%Fh|5AsS;iQE9PzEm_KQq)71lw?R)!%d= z$ziwB1>B9XMx}|CkW+C1Hl=ykPq-500Lh}<>1go_@tu?H^7#v$8V7Q8qbdg2i0SPm zdwHS$tl4aI-{2CbF?Qsi!_-J_6yJEEV;0Uo43E??T(I+0kh#z5-#-FvC2y%Kdn-42 zE&eF?UOx%NVjo9O$t|p}qAx559jbc-rT9)*EE&e;>O<(8Fbpkv*@RV5Ks#I2e$bgcnDSiBa9>h05|V z;NF4bL9lX^>SCDXX11lKGKaSHuS>@Jb8KD8jKCf`qMMOu6y;x2NB%>D&2HLk*4BI; z)pAWfIj@V*aCgxR;YPkSy$QK@0l)Z>mq%T$kItNw!F$@g&a3jk7IDskqo&=5U|PI& z5I%Oy=)JOuEcZZZeGo>j`KFM2|E1^h)^f`*%D`IRe*80+)7RYGb+W-3 z5m3vp9uhF5TOo-kq!JvIa9~tA+?No>y2H-pZjVb>5}NpQ`RZ45$4#)NL9g1Y;pzT!UR)Km;W4o=BPUf+z#aFcxa)U_NsvLF&RoA#tZA(^nSa zi!I2m|3n6ZQ>Be&3&~@WZ=jM;EyJ6RG7lq2h5>)6XG`5}mz0 zFIO3A4{3A=_qu5SRmkw=6C&OM+z;v63+L?dIm)(?(oC!c?gHJ$HT=Z`(TXMh{fc?u zp+_NB7|vlo6PZT#KP5F9C%zCMJ;86Sh=#^v$oEM12a(4DIycLblC}6?nkR{CwC>3i z7r6;<$V3({d(w2QRKD%t7>Q7OCX$<;4gLcBqVFyYJqGoICSSU?Y(sWp!LPY2<8(QU3n^EEC&vYN% zeNLE>H)~9}Tc}der|n|Vz&^r+0%&wg*H=YvaofxC_y8vjLeHjS{o+6=A)gxuI@eI! zsPC*d^@(EtSmTyeO==&q+Oqn|lWrf%I&>xs6*X46EBkQ}G)*>!A9*%J&XV1&Oz~L7 ziUIHgIN0lvs;kj{Zh!01_O`5d)Kvw@9g|2ec;gFFa5oTl=~fFS@(sheH<7lOrQ|JH zs|%X$KQdOqd{EAOcIg?kKK$hD$o<-dk_$D{yx7$wocX5fQ7#H%1daT_?g|P-9Jik4 zGaHnuJ<>x3U1tV5FGf6QySbH}`;5@ut~y+ah#x-kmg5(7-XgwK01rp}NX8}}Topto zG`~ImyeSI8*VJZmy_LuTI+MTc9nuP4VU#L*INg_l!Fb(hm4j6Qa!--eHEGEf*LmDy zA+wL^=B~nPVPB_ZCD(HIoCj%?mNh7B7jgf62mZ6qIs6(LilCAGf~uWEIo}dc9K^1~ zQ@v1skJ;DPhiq>jx~qwfbJ{=IW5na*VYmA=)Pq$hNfhwb3kETA2e&WR+&YPq+qvq4 zj55sK2(5-EI8{OKG%0vg!M|I`B2=>eOe!p_%%j@dby+P{{nB&4Wo02Q8eok}iOkhR zd3=3VcQRKfU&Us)J-^OmP3Gx-{06_@Kk8sh8?&7<%4DEWliBipfJYg@10Q=rb4}9Z zqWx5Ftx-L+N`*M) z3a}yFw>*cxOL)JOMiErub-V^Fe4e>G;;hCBPeMDU9W5&c`aY@Gz_uW%Z}{8N>r(VV z5sIzduUpjgPh_{KUIcBBUAeW5H0PfjI#P`Wcl52=RjuXeGfSGnBa?l%*Z2Cg>R-cl zrIC1QWWhnsRu13ZVYlF91|LD;`Fv^%Dhx`%q$!_XAbXTFaXY7|P9KG|K6l#Bo)F z6%-X?lb+G__L_Pr{Z%C8Ion6i`AG2LR#%wLiCTX%68L=yO7FFX* z>b4i_1$fuA5&y010L{+F&o=m9j(t!2UTsff$p1~r4$obd`SUIm@Z?A9SzEIu5-_1^ z6bKwGB|Ez@IZ%ciQJfbR0lk=PG_jxTFjU~L`7s(oq&9X%_!GQR)z-aTF_N{+z z$MOMkNt5pmTMwxgvROSb0H= z)U4P&$>XOA%Hhr?#Vyj4uaFG^o3E*a+LQ-BeB}wW;}ylaNgy=V&5SzInT_RzyPBV>d_t$q9>B zU?SHgC?%CD;p{iDR+B2aY5I6RUm8<*>M#C7Jbry{7`w3BglD~&<|`5>)6yvy{p6sm zO`=&zb%S|;VKqr#B+F43&Ee{=Om&7vY4mUk7y^-y$OSPE(msU5u}~?fcRru1y~G1% zR=f{-?1~;IK^eBgyr8X6odHGDVt6OUvs35CT`mU$%=#Wt%`e~U)~vC;uPI~yyhp^# zEEX4U2HZZ`tvE_EytkYh&al#x3W39T2Ke8X5G{wWtoEs!_oz=|tJub`#squZ*$CP*vE6bhD1&DA36;f>N(<)OYBxVgkp*7i=$K)oaG z^L>!^u^S2(aZaC;>2lDWB|ymd*Z*-aGly2cAxD_@q~P~gr6Oc_OM;?GG>mPhyv@VF zAo6mx!V5w{*TBK7N)%rm|K%-S%PZ&IUg=o9L`LjDwh&LN2!aPf^JHgxDrrg{dQ7%Meb)OUZBv@3 z)Qg0N)!yCaTN0f0ad@MHbWlq>0nD;YB|0vBFJ=2?7i@1=is;Cm^DD)niTsv#*#!!= zA441KrCl34&+W(IpO@t3=-fy^+bCaZr1IiTkpnwS3(zWw{BkiW{endcy6tJo&zqcU z{E>>Uj>87oxN!M*47aLkCOKinOG+1V>#U|LWTsa+ahuQsEA&p)|FwxaOOR#}5EKeZ zG(1qrrm8G;^!;&3t$D{PM4KXF{c!#onOg|LF#KQd!5RzcumaVECel>-u)-(ON_uHW zi}x=SQYj(<2t^crlTD_RvOSH)T=g)4q?!g6Pu<4nhHaM@cw3(*Ugt%#pYT%sy*KY> zI+jbUJ31}morDVpx6TF1Q9zkjD1MlTfNc*8-XPr%d3#`r6GUc_X?UKM6xF+X)_#x2 zf5~6byzw#$@A~z1sw?RSJiFN0oRV7Mi5+9YECY7R1c3UK`F0nOXoy6|{~!)OxDec^ zFj2Z-Yn^Z!6i<*HAtLei8+#lqtOfHyQx@hCtQT1}b`kLmyrg39{bLwm!d=Q$uX$jh z*FT@umlM8R=_iMJ(OWMvsy7_G9NIxsHW5P-i4wIY2Gtvnd+wlp!nqOZ$EFP7r&|!? zt48=AGK$8<6=v_LxY3D0%^>`KzM1WBz;Jb${yS)gRVe`VSmmEMG@uof(itpLs2>}g zz=!AoGS0e4z-Tf{q~ev~(@&<9N^kuex1%;*=Y4$4U{~&`%-NQ!&I55JNf~ONwVOn# z1Re`oWjdOalqm{tV;(9ULB@;y^*=kQLnsgIb!ScpqSP2lLn|u2Jxs*+HJp-N1$}Fo z59G1t2_hgu*POaMg4_%lJSM1senx*FP2>-;;b)EUc#DS$cV%OV7iv4)a_%9QlFU_m zI8CNXY4!LO9oB!g2;F4WDhdQH&EF7b`9|i4WSIfIb*M1ta`a5BIL}$Z>Q^TfVifOR z8xnf}0YK$R7@H|U0ToqQk(mOB0HHqgHiHAG$4^?HG@q!Wlwzebp%{H=mA|QlS1$~c zC4@)eBM`mX8F)>At3#XM0M+__AGl?NBCgZURj=ORwrTpV5Oc$&(`Bqat#c5m8 z`cPi|*gE9qsvsU#N8?QFG0O?t5$_=p9EhK|;1Qnt&dZHVF<@s4fJ*+SlvGrTIwzay zn-IOBeIaF+_9}t>?bbahUX_%OsNc_EX{^bM@i_k}jAUmuvb$I9 z<4wrDA*b$+vnsnb(Ka&5_c&bQLP`%-5>V`#bejhO;={%0umRLojc^{^!Ay zS6nT|?!GTYbECU64mYF-BKm{vCu855QBhV(TG8`9#v`JWz{=_i6qZq*1q!siyb!Af z(l(DRHCZ{oFV|*W%b$Szir8>A;qItC4U(%aHil30fb|avtKHJLQDJudHeKQq>Ov$T zX!QhZV7Zbbp}v@=vr{S$Nh;PTt}dsuXNOMWY~hQL|KI|^IJ>VT^b!NS%?`>Zk7K*C z97E?gfJS|NgvOFB5*SSSU>;gci-6q zXFJB066I+!I*c|}tTlS_$byCiI%26W?)rDV+ZQtUk^#z?8Jl}sRU*LrbxuBn{CfYp_txog+tmT zOa)1t1fde-1xi%uPQZvvE3utYo=hxHb$osA9CLyw*}=uwx?rXhb@JFMXoV+uCRFv+ zd5+esw1DV`7d~Gc=g##M#z;!2uO+8DBlP{^1pAiBTB|_Z+Uq>tcqR`@pkR?(CQFbH zkM~g|pnH0=07sH@A)L+YxVv48?w{+db+Dhq{u1LSo^Pb)*AKZ&JPDajuB*{9V0gSY z1ihfn2=&8G3%Dak+4#Yk{wHeFz&|3{y!BcR&Eud2BJ8rS$9bd5N1p;8t`Kp1_u0zE zoqNvcsB|QE^(l|%C`m#-?&<$)>HlLwiGY&TMv~((K79d{$=`NbX|NzyPYYg6jB4Kb zYx7(ms|7x884Dmr@BFXRoZw_6O z?_*55Yrcs8xLiKN@n+yIw1g*?8Li&}D zIMJ)%8SXN=ic+yuc(7^$23~>X^}YZScj$+k072~hB<;7~M%cLJ`YN-9C$9{bqP2;E zmEZZu8ssB#E`8zPHQw7F(MnGYbY5&qPVpG#!nNd54P-mje*juW0_%w35;8vziZfOV zOK1*Opu+Q^=g$Zk4edH(P}=$Cwq{dzgyaEt89LDBM=5i^TFLarezM5?Pe{m$lOq{l zK-A=p$rs0+Ks_$4tRp}in;m|-jhIYXDSm>yV(LqS^NJmV%Q!YQdgr|>C?=jAhH zSl9L7t>c^Y=QR;KiC3OS-&)79mx4Q zrKhggG7{6b!g;lfJlog36X@z}vIQFUzS>RETa}v$es(0!LVy*K{y+h>(mD&3teVM8 z;`r3O@FW%ckPLxqb}_vb2L_3ycQt&KgDyKjP}|htfP!!3XkNt{7w5v>X&Z&{QQ;<; zpuD`+0(LoQO6=8jHSNFkg_NFhX0+tc*y(*Z342*-zdps1qmX*zrd)4dLc#m4>UTo5 z`VK~My7s4;C+FQNJl5xW`2I!M1Mz$%62r^e8}0P`XlwwXSjC39~*jXb##fxMP6AZxmuNl9Pnm?5D>LD}JNz z4C_tKEN!!Sa99vQihf570-kheCbN^Q+5y;_{@Xi&5f*jXr8_*;SUpJ=m?Y>xTMe90 z0BCwNmDIGLSHC-yJ!zIh`Q;WFvRW@W0>23h6mmH_k)?j{kV&h5d%a{^CEy%n8%DV& z=k%2!kt-nXxTo?Kxqt`9nvMw6{@f?l4O95=6k_^E(&-qN&~xEpYy>2Pi{s<_qH%?$ zU^|@XX4x0V;FsHGh~8E6wkP;j5FuBkex!5we;=F)Qxn>d*(hfi__u(Cj=s|2+;NV9 zk8y^TvZ8e|4~?Px**l=NxQl!71x$u<36x23v*L0g-KQ$&JG_G(+!~+-Kyqg%`@IE5 z%1aQi4%s7H4}bbZqJPS3=5I48u6-Bw^^#8O_eYau!F|HQ zJ_Y#Y(U?c*+UyF|;Hs#qa5-7ay{VmR&!b~A$JvED4RBcf7^$Qh^$h^mx8xe;^HtY2ToVW z?*`>27uf^EswLc^tU*}1S=!4{@)>uH4 zV;IxOoGr8FX$e)xM)ng^!9V%&CFc!sA4`K62>*nEdlRBZDgxR+hs!68=ZhvCX!6F+ z{(6acYw0=+Jny-GUu~W?i+L^_S|l?nS>a~}1{D&UuCJhNSN+=I9 zl8<}TwDV1sdlV-L%*D;w5~rWM!?ES<2EJ6mCJ{P0FO@5JfVzyHJ2{9=NDI z)<{u$#8S%l|N2}yJjb1GANJ{dezAam8_R98GUs8uigY9CZT#l`i|VJ`_2Y>FM<(?T zuX8RmdW15IY6Hpu9sc|X`eMc6ntI-Oyp@~DD{p%j>F0OD*&$nQa(M3Mh!5uPq%*Qo z$?oi~sJE#QYE?1_eqmr+oBg!*cs+2bx7HtIjLHmSH4S1Ox=PD$tV z{`~X{IkEMd{|7-eh}L_wu&>8H?shpntGf@!(zoAou3Dt`PZh5%6vd33zz@Z^&q3`K z4e2X-=dQ60>8*ZP#nYL%IsvEX>lG}U(5%e7RT};M7@j?g|Gsa7cxDzUqJp}+dz|lw zWJ2C=YMPa^f|Ib#?vKiFv%sH4hj%kMT2vO?dzmDvC(Cn`HafkveQnz z5@dFN*-OHKrn-!!7neNq#ZbPzu-P)91NXH8DT^zi)0(8krrjj8D4EEw7G|n-bi7D@ zj5EXiy%PJ?W^~*+c|zG?SdYW)Ylxz9Cn67MEP)`;NuSc^beL@x!et4*(5GO@$wSQ3Zr|sQ$-a$)Z zVGxNcplvrkj7JiHZ=lJ3-<^2z1y~xs0sqxGDm2yZNeP~Yxn^sAD+?iJ;_&lnCdlPc zrrHl9p?j~~s!akG$+=DyrT<`HmVPptH`O&}WtlkM;(5;-8+#bGp=?U&O&%+y70`>~ z|2;T${Y-^Rj+l#+D&G%!7Ugg4`?G~U*}dTG#{$3h3?2#o*Yub0jmxTKuv5if$NS~+ z3gEN-zMC21dXIwb<`C`hW6q?l?Sd|V5`U6!ko9j%+!|djg9&{$RE>W*1Ae-NJRePw zK~)$Lpc>IRxo}+P4C?v@iWJv>-qFmFVE4FxDth%b8kz{;h0#r zQ)%6JKGfN7BwJE8ijr%ncw$i7;7~jB-+jof6a|?rU&(e#Fe+1DroRJLFXP;*S^jCZfIFr!}2xjJX6>jM_5&)0;c;*H@H zj_!j0vp@VpBytq&&n92i&`FP~`TH*$p&M)C=zhU%CRL`4v=i6ecY1@HTkRz4Uv++A z?es}Q4L+D>J3f<{Did3@VcwCAee@cn+gw%4P7c*!!`_eRK3(3tF>k9CL{&lFCiUSa{q61z&C+An>+$(+ zT)W6bCW0ZhM+oAtQp#%xVvskwtmf)?ld$eeK-MGmb9^={tab~!dXwtqzjVk zam5~MLj}$(gio4D^vMiS%;S#6+sx(ZgGE#qt4Ug!Q%#Bg5=M7ld>*p!ez@B?y9}wp8 zlAWhYM*I6J-Tk>c;YnsBUcJ!9U5i4vbyq~7MiwdVFqH;5p4esMZ9YNHhxV{@(p!fV z=C6b1Sbh0%;~+^VJ_M30#ZPtOF22MbZ9Uydr!aq-nQy~#VY(i~B;P%REPIWYkgK_$ zrOlpk0Ib`6eL%xE0?<23M~~Mmd{Yc(5@?m{$2y*7uR4?8TEnCOu#KGZ;wl56UVIYK zf0*LEjD8|;CJbJ$#;CBu@bTC|daVf6)Q6o9Hy?Fs}X>?o$UyZahDvbNu z>K>5?6ZfQ=9h}xGADRXFDtQHe9~)oqrl9*XcM!nZT&EyRPbEs2bgGNz7lutB7^C>P zV@aSO!@O^rY%u39e|h9qr%*ZnzEF|vo+I22XX)TCFaCYUP&G$6h6#9Hc7=}IT$G?6&7;a*Wo!6Tj1VA>;QDtn#i|2C#(z}eX^aEfKzvez#(B|501bN~Q+v0O zk{;Lj%M;SDOHI$LyJEYGxNh}>=wZ8+$4@1 z#h6ldb0^?=rLDXP_cA%vp8f%et?f|r$v40AF(b4>=L+=(MTO&5aYk7CZQq?-jL~^h zp6x>P@UFY8y8Fvn5K^&aZvU=>B|NEjV#wljHNkAJzDyxu8(XUN$1m=an$Ht7v5|lX z)wR41FX;lOHj{tkT_&GgVsC+wdG@3B2)*WGBjb9eWqP!IeG?qz(E+4|$AL3Ua0#oc z`NWg~3J;J+tE?9C`DwoJj*@heOexH@x5Q9xO|lBPoFFKn&53Ys!XP@`#9>XQ(_xJd z#(Qmn+2h*!2{vC6KqW65bq>y^nM5bPc>KsahFB8%gMq z=EmYNqw8~pY8=|`7iMwwEx{)F<)YU=+$>lKHtP>S%G>ld!n|r*L><9%5O<0*T3nND7Niuqki4x-J z4D-G6!^>FW%W+_ zm5B_C8KS3PNu{SkhY8DVre9=|b*ba|t3M2sY`2beqfaJN2tbA*451>RxJ~EUc6~KM zDpOWU9UM3~Ci5%Ajv(O!ZH%AzE^(L(B4{mrdu~vym~;A5EU^abWdBZUVAJ>`$As)5 zMHS*F-es&u7VaL=!@qk@CP9hY#@hJ%!4OM7T#+@z!VjIXR}8P#PG3~X5g&(M3*Hv= zJS`+qy2{9MEKee+DaL&5Gdl6xmFyX!+kmA0ny?YF=D^Nw4GwxQkpT0i{r|EuUKXW8 zcQCR4;&E{4IPHyNHJx0Ywg;`a4vA6}`S5IOdkV2)@y~@I!+X4h`0^>YK@RS~-acyN zOOfvlD2Pe67YkWRH=Q9`wa?##Wkk=MN$+w|-#T}(s<8Ea-j)z&q2#3=6aIMNal-$0 zi5xlXdvGtTsu%WSEOFw>;5GVggZwb|{-nf#@*r2ASXAytAh0HSXj(=T3U+G^iBR)- zDd}-`*oE3~okCgZAu^%ZlSk;@P3q)Q~#Ojm6H6%JOhe6 z&NITdl37%xZC5d}Kn;?deBToX(oRp3Q8x$3x!3RU3v>DvvIdg%>?a69SW3rhQ(W2e0{Ni zub(tu7t@#y(In9UYFbwo+}$f;5KQ_4;mgS)UaHk*LT4d=Zm)3Q{is~)15w%R^Uu^k zV<&TML*0IqkHZTErzQnrWaaGJPjPEDSEg;exA>epO^%EFM&vUeO2$<;B$fV9sxelR zK};1LdQ*Aj3T177n*m0(g?|wu7kq#XHrFz|z|xKJ1t6r6SF}OL4^gOM8&AQ3>^{vY z7*ld}-+9ssvi%Zggr<17&`dT6gI*3H*SM(STh*cqmo=`E2e+)+rE9R~K31+9G`Qk_<{C8R&4%bKN^H#$ z+7%D=Ga#l>bCW@BDgGW8p4)kyiw(S7fEuO zxaFusrsIi2Z{{!FSMtBJa%)C;v7WO$iJyLRY2Qe5!+>L^8&HEdYdh$&qjCW@fy&0V zk5Z>fCrWvKKg`juXK=pNW69_}%V&KPeoT4Zvb2D4r-Y~PXa;ia-MJ-QciPQR?F8|82+aG2Cqo8WEo z6;LK$v(;yxlaYxN{2k}J$M&K)$C9x*Wen%tBvo}ulCOpmQu-XQUQy7?k2)qIg`l&Bo}nkMnzfJU zCY$ojeP4v$V!(JCPd%Q`h)to|F2+5RWvZ{z0S!9bwI*vKB3jJ)7# z5u3;8bWB=Pk^Pxm{yf!5d7jxGHLogmcKE*bA(6eVTJnCFo6#}G8)U=o>|#5B`n#0~ zIm&BHI~^ApE=iL&CAhB+lMPD(NGAj~!?puo`gW5ys5Ffxq9s9wr@0up=RK}1+C-pv zp}+K>#jmLqV}Aoq-&o>_8)-)STXoV2yw`9;|paawhpP2-NxY|{F7zYRr z6c#nij zuSvwZrHW8>pn<2vl$AHP#_@31lxIT{fR)lc8FjPf@WIRla0TKQH%ixZ^57>XPnl|~ z26z7U4rkJA{<@6)2gf0{lgBwQ;4|4A!Y)M)i2QbYoZW(FO!U_ zig?{He(`wd(W)mV2anZ=bsWOctJJnr&GGPUtLZ&AYvAI$e z?k{A{h^*hPD?ATid*a+0b2-{Ayzp(%xOT{sq~tR6k@|B*0F2<*A*p_F#XK(0lCs@p*q-(Vj|8oy2b20Pe&4-RCSat80#$_ z$WV(u>pt3&J;;c~-(7gAgp7Gv^JngkRM(fVH?VOz@cS?1UuERJ)HIv^^Ez*s0au6x zckFD;8s(n^MA4^hHm~siSxQ9T*lwlad~-Wy)3LO zX2)LBG@A~pUwzTc2mIqU{z!ASQU&n{d40{mCYOw+eBdo<-r6p$s3Yg{@Uch@sv-9m zM4GC$B>`>KxJj;svFR6eo$iMb(^?C#fLwpszY$>6wSMVj>h{pof^hAJ6)G$P*Tr7{KM*$( z%p}Jg(I{6N9=}BLPBuRgskk=pz65?akv|%&se;TT(Fm)cWFyRNa1#$u$GjA;Mfm2u zT7F2M>LMEsSkRrtAN*yJq~7S_QWZ|CmAIn7c|5xPRM>{A>=lnntK*Y$5a4^dZJimm z;L<%pN35q(2W@gL5_%Oc%bU##rKT+wnhepkj9x3EF`k)+W;UuW!;vgpc`jowyxiKA zbTm~gg)j3*?%dQ;msx@NzvUnd4c~k?&^4wxGv%^2PxMEE=>|W{Vlj19DKkKu{UMIT z28W3;abaKN7wFXhFn9}fB0AU1PoG1Jz?)rNl!x+l{=q!HVgq~pv}=XCm)7T#OIX29 z@EWcTsRV@TEpy-cA&n9sDFwi0s)Pao17mY35ylDfCsy;HcU~f4+d;^yqHW~ZVbp6* z)mriMyEIJ~KZ%l9ekl$?zdek*E##1OGZYOTXxbILyi6Cax-j52FRsJ{QAsC_M`k}z zz!{-+>IdKtj|MEz_iNr5x8Hr%Wqipvi#aeVQNIUR6M_=Gvb~@Uo^xKk+{eL}Zozn+ zH55R{v;2>R6dC2cKP_g98ZTD>2YtSi?IG!pMl3L3^P98!Qa6%$*sL1nT$)BrNfZUS zO=ZO;%T)lfdbA@+!E~l~S>-`3*AaQUw<)Z|?3R|MO_iAtn6DSlqpGy%Q>*NOO(8rT z@~a0U;hk>KpDkD4+7&94r9`hrHUQiDDQ9s|DmL#^!JAeMUVm1A3PDrpRV)yLfL1v+ z*GiuRvsK_-ZPML76v-S$8n2<-cAD(luX+10=~Ju+q-MDc6J1ri&89*0N~b5#*CCvZ zePhR*S;!sB1PI@slJM-N2)+6ikR`FGo@^I_L5D1Ff2H>2W&YW$@Y`pNjCkuBz^_#; zcbV>R+j$`v_p{yjaAFG#i0IC5Y3+?=qn21B69^G`V6O}c4o0chQEzTI=X>#Z<(*qR zANM|n8-9-Aql#q>VXtZ;i(WLAl9kcNz@!o-TMiwS+3pwuC~u*_Iw3?!75Z=KXqU}t z0`BYEpYcjYtAuV6n;nMx-)P8y6=Lr0n)f7kb8n5nTua`=d$MYL1p@hZFNQ_gQ*e6+rf1v|{+K zePVvOLCwFf$XPO6k2nA9x3x$mBg&GlZSu9tN{&|_)n02+D$JB#Ua(gwLiM@f4_-5q zvrY;izp4J1UPQ;nDkB?3odnVg9tNAPSbqN{Xt$I@TDmm2kpgpKts&J2Ytv>j4Iq$9w#D30)o&mA1U5J9JIgXe3f-Tk&LK}CJvKz$}_ZJ%vpqV^BtdzH{@aZ z+sVGaj_$o!{Ve{~l&|D7OxiNKHx)C(OF6fQ-Z*F)ZFPOf_@n_Rv`ejUJU_iS8uN;u z@jcp_2U%l^^BP0CVt78w<;lP3QCc8%>)e_$j-hz@I zn?IDge>B&soB7m4s*(K0cZMuHWV5Pe5ZkU2KJDRp#NiVwqC_e5*YlJ;3@d!h5-* zN}`L-k2BS%^>tupe~gL?G<}=vLjAE(iCH@%c8_(=CXk3YUw*zVP);-G8)4*I>Mzb{iCeQE0 zdav%D4BhH6bi+)4y_D}@RwOxLX!)0lix91~wU&S9&+Q!-Xo@1eUjfhGs|PH+v@Z$z z<$k0wNb!B1J`d$}{^r(}0`xPCYVSjOo6U_t0Di!{3Enh5MLn;^xt^*U1YmT!S<0l7 z$LSkENAk(z2xeP1x8XE*yf(vyY6=P939FYLCg2$ImqW8>zMN3*)WrewpT!)5%eKKz zasveeH9&AeWUf_2r0%u=F#u_F82%GWT(k%vhC;=ZuzwbeDUk{}BGomj1g~4WK_Ydn zSrQ<#c;9oi3E()ZDFt{7`(q80U-yC_dR-YNHBnq4eZpeuElEM2Erg(-tXafk)Rp2U z)Nn0sS&~apD}gi=NtLq=fX+X6TMbZGtr(r@qyD{y|Jv6!RwcF75bFk+m;}k5Y!6xf z6myIGZrL@vNA7btC4Ovpa22#FR?iWH*P)m0mEPin+ob9n5Ipj@+p$PA88SPx zt-LG-=(ck34#7I^H}J+AdYjKa$zf%taP7=-dg7|3z^x*^ht;B!M!ZgGb{IGE=Z!X&84|yKH!pQQ1_X*!1dkLl&-8^poO3KcvXWOrE{6AYv8Mg$l z1NOXs$qzi4QKvN58~|%h)Pb=M=+E(+ZS1!95|kHsRgwz?p6w}Haw6qt&-$7cE^O70 zrBIoacA?@T#j}w}#Xv|aR#+cw;EyK@>fHTvbl+n|e63xUqh9Rv#D;$yen6pf{*pE{ zr6HdMfuDW+*^_ow*lKeZ&sL|smgmILbc$v3nql-jt^tx7EzDyD`Rj@JF*QJLvSnSl zSTmtf0=UP11JQKmK)z+(4JQD2IJ9`_3pZ6lL!*y1?vHzYCv+g-}PRU}RQmB}2Jy?8^6-NGQ_;BY)lm@ABxlx=P~fUv644kki99h(e1T22u+q@@7g+900Pi z)^4U#D-6A|oRvos&(j+KbCv z%H^3#YI75>8+F)tF7D^cY>i6}hmE|H;%wp~qP4!?p|w3E{p5(S7MwDcW5u8kIk&JL zDN^9ams&mgof6E*xcJ5zH}F*c^JnH&aO8UH@rv-og;Fqt*iTNyN~r6Ht;K`gd(yjK ze}W!9biNFkH@JR7whBj+A4TW5$z2XXpo%4y;m(JSUzNMlM?O$9R19?Lkh5uMO~60l zDw?1ws2MH;fmVx*27PtMb^JNlJ4oMy3Yhdt@i-h_ZR)1+#5-Fy0!8RrHgH|tgiJ;Y z-~2uae6+ZuecnR=iogiCP2K=Glu62o=Oed6e65v+=I+lOgG=mGqPklK+IXVZIbXYD zf)ko19idDg7)d~L1tX`2gKnO$i?Jk^@ndsY;DPc{#M+jrxx+VW4M%{cyeUfaG^3%ob|7UeQQ87`6PZpccQrCB*52a<#+F^ z^YJc6*%LQ-49TK4J{k6=8)Jxof+*#-|(b>`)1TSSqV*gW>S z@u@f-3{HQ9a z8rz)4?l6#igk7=`*7JxxG27E5d4luabgzl6$Y1oen{lFji9&0D9#t`C^8c;U!Pvqc>Wt)i6^$-hz2In zcm<05P)mDG5DXOvW8Zr2aN2yO7(-t4ql*qY)97FdKjJBP z%{LJw#9hycCsB`uD;*^lFVVb}sbYow5KmA>+^}Zhp;FoGP)N=tk^Hk2cC@j8;7`c{ z`@A~o+X>#!?nuMezP%yLeN)S>)!A^Y9wHe#Yn3Suc&v)ubIPZKoF5#%@l(s&jK)(7 zRr9km4J0A*bB<#m2_LBrz@o)d$B5M>@K)C&oiEXEf@%;uT(&c zpbB>3fT$#oPmT)YCvuz?k)$U@TRD)cee|p=%x)DR&D#OzkIPM9B>=(H6PZIDspx0i z6zi*wwDCb{3?ru_gKkZt=>(t)-?Q(uFx8nhDV<>qF1po!Lr`lKo~N5|Jce)Md_tkv zRCnSoLhmUNQLueilv!oJ)py=(U|jA^AnNJqJv;+R36Sh;DmbM!(;2%xp>NfRr{5RG zIv~Da)F88VRqp7}l2Og^!J4(h2p+AjNz1e(+0R2tdH9z!G5Jly*u;;0AF2cD%na5p z#8uX|`XjWB#CHj6$I;4%&$Q1IA6!N8AuIRBBD@1Be)sj^q*quQ^gVbyDr+H3SZT~G z%4^j4!PoktbbNx;5!U<4hV~&t3@qzW#&kyX1h@$i%{&H)Vp8Rrf@;uPKC^%lT|y-^5q5 zX@U!=9bSyS)LF84ZxUxB#YUDewMajELTRe?STjX|;`10v+RE=4kd1>aIza39k)?N8 zB;rPQYF5p)ec>SNh!D-2=KO14x=)QCZV;ut>GI~M%yb{t#mTqtYHm)A{r6t;@ORmQIpa<#_WGMM`^!KCn^U$CCt^$Hhlz(0!Yto>=^Xo10Vl zSH%24(;2yJS;s?jD)n1p`0=%zWBFX1^3j!6ua~IvHtW^x?VGA4%4=oF_Fj?iNo#3{ z9%|zQhI#f;@-T%R{>imc=M;{UkQQ*_fkiA|coi3i#J%`2K*qKW%w+WmWC>dPn0)aA<4eXHDmVK%ZOcmH%` z2%G&en_MPA-g0lEOGhU>&$rM-UH5+Sh@2hG^FIXuSuy^p7*`!B0xp>%S-m?`d5fAOdAj(K3Slt=lePV_l-T>oPpTKaGi14O32=17mAN3>!^9 zV#>DEC-z57RbZ9Evd9dVkWg9xj_O68XIt{Ux=va1jbk&zs5f(7AuY~6M+Kgd$g5HRC^RK_NaJ2e%OlEOcfHH{>w?16CjIc_GbUfBwa+81-$T0GhN^w(){qR zl4Jk$me%ujpL1=f{=dHpcHUR@1noSuD){@r0kb8tydEQyNML#BWnlfFVUdO}M}0(1 zknSh+K}wkaJR{r3e?QwbpqcVeWVZb?MHbKmr zVF-xeUCY}&kG zQ4?3~RinhR?~I9&V2CBNgqrURjQi=2P`HyqtOq*tWT#bwzWd7RhJ zFH`=Frc1l9=`w-}LV?q=Lq*$U(G>7>Vuna{g?kHS6PUbl@cyqj(Oeu4k?G*besq1U zICiiB8oX%6YKJZ z-9e7)r<-lDPyS4bO^K!DBv+gYo&N;EgyjTDqGWt~jbt46EB;eLyCKAAXuSxHeDa~} z8~n|=s(8O{ z+Y)OQ=`-qtNZ%Ga`Lw`tsD)lWrw4LC-~yzOhPyn3=?q+QiF5^|Y{C_RE$jtn5HUH6#ZxRH|hEqgAb z64)M}h=%MCV29)u#6pjn2;b^T^ivLL?V3LpQ zhvv}%bivIZ%^bQ#()|=~mOqExAU)LXd2B}JfCsfG(4&gQ`<5fl&c^?JLW0ug4oa;= z^&!ojr70Uj*z`oTh4~|P5dW80z+60@;3GRr{hpj~BH-yv3jUSMt@Nu#=Wy>1=P0qf zt%Z|JOzirjVgNueb`2p<6Ocf{-Xk#`DU2n5b%{AOaGzz_e~UJ$dy0*SMX(CwN&s&mX zCXffiyakKHFLnuJ` z*Wdc??NGxfKyKCOTpGCR#}p7@(j3TBHwfOXJ5Z>R0}kRY^9YQ z{HBRb0X$H?-jxc2Z=?&R0%1tQ7lTdwfE|oX;lW=qHj{8=bBjHja8iht$pPrs*E3?V zYj1f@%K}sx1#{S9L!n!AvckMsKqmx6dv2qt*B4Y)Qd4f0m&kJ=A;M_QgMj_(m=NMGU^c|0=AKJLN2wwY1h zoowPAIsW;9I;@W%#+z1`kT3F4J{PkU{?zf9brWTcQ}m1{1HdjnB2=gJp#YTST^W<= zREsXU@P6&HdfG^^RXLP?>)RI~m_&P&h?g}3*3R9<ia<~>egx1yE~c@F^izR#wM=2sfG zSrMsM_IAdz8{fS)XsYn1WTlr~M2CyGrWQ%na((J!Syfe+ zeL3^@EkkNRFW?Ntj)*Uh4hTrTqzRNb)pPCE(l73?+M-vLE5mVVR8pZgN!r89yH938V9EDz=3o!h=3_G&Bs#C>d` z{OrNz4ip_6PXeL2P{oEoQ?A>==WkpV7c@=X=%;b`oPI&EzuV3~?$i7Emi%6|95nEE z{hQP&}BVJxn`x%2mXmb@`zsE4%jE|>}kXLGaeNM>UI4fDw}g|GJ+ay0C6mFYtD z4Gf64;k32-X616;@K%<$V&2pD6&_GhdAlAv0&L6>o) z_6_#;pgE|sEBe2+`_qf9Z$};I>_HihhLzzFwHbjXNcDDU+Jm&O^&$?wxb+3yc}>)T zSe8Uw4ymRb2uAR_AdH>#f1}3ZNgfE?_n$Rcgz;l6R#j6CJ150jnuGevzN3c#Z9O5o z&Q+&1;cLV&Q2|q}`%7AbWXcS+1|_dYD^;RO>g@{5H=Du$OMt^diYNESlP_R_o@1<* z$8A6ZQv&xkIEVQx{<1%02M>UI%FdS^KaXui;b)7Vw(~Itl-d+2L$ri}fm+VDoc>Q} zKf)`B0HE=ydzFpPyM{v4{K&zM7ve~(_HZ!pIWVP6Sk;@TANZQafRIFHw7QA`{>2i1|Iz z4ajY9NFLt~Vuixh00WgV^m`Tw=VJ-ZU?0+3i}s_|8p0N@xo=Qts)@R~AgT9}{!9NS znK5#K?^G!O+6NfDMKL#feAk3l>Jw$JBiH@6zJ+Siaa({i1acW5LMsS|G&JYA1EgknJ z9s40RPx{%6#aaOP6}liBNLtgY0GdjFu1^Y+A5B&QIe)^V)sac~%^$9s_wLAUsvBTf zk>4|{w6~z^a*|QNoE6K_qUw`@S-;5lT1mtbEf}OZXBD&tlJDt^!AZ8#W#I56*(Jz$x3PhK3X!Sg zs!7uZ<_8vO2+|@BiOpBGGG#l$AdR2F?YiU*6WawdFCjhzT>@C1>Jx3Z6pWwaxWNWt za~n8VV!hwUt;xhzw6glA{Vt*E8N%*lf17_kJv(IqvW3p0R1@YZArt&8JU-XdoOU** z@WOv)8o3?7V%Y%wr7{;g1@)X0faN9X*u))+Qx9&+^Px@QFWXj2}@AvrV^Uvc&P_QK7 zRZTY#yo|UEk@9_`PH`KPr!35dmse$d4Qw6usU~8kRsmQ^S5};+d9OOz!!0Ph5Vjm* z%QBBL*-frlyX0XR&q^dgfFt_I;U#mW3s)I80%0G^6fA@vs`~`kGr+zMtX>Yiw@FW~ z)$K{y)_rRqd$t@sVJMo|++2_E+dxQTEShLC|SxGb85rr!7pmd;Z%FPDHh- zn)66UA_nlNIrK|pyy6z)D&Sh(0jAr$Et)@J6UlN-7~766U#@6Ea{rPNQVs}+Gtyf4fFu@@3|}kQ7a^U^V^lNv6RVDMoMlbYroU< z4*|^p73t6yVq@^84&0wiS}2zSj{Ln-rKDb=xu1=E!m~tb+Q`$`Sd+uF)FdqKp@0l_ z@8(CDczRe*u{~O3A!1@xGI}p3F<|D=KO94z&0mjU##`?t`Dnn~m zdDN(S0dD_P6`cx4)#y&t$@c01vEx7K(ygh`T%Q-xq9J{97!1+n8GsWi_8#EjdACNI zIYXd4G~-#lJe2;7Q>}JxDT561Sbsz;RS2+%^r+-wiTjZ&^wxGLhZRWmEmXOKw@b4z zE3MyQ^^nm3lc#}qAu3*Hnsv_4?;VNpNX?E5CZ3f6X*K_OC9E+~xoRkfgH#v#qxSskX7z67nWE1!MwE?9!tT1I)@|({iL&-e&X9 zE$6<$`*n+P$191Yl`gv$zA5e}g=wj)=J7rV9M3eSuBqI4BP8!mNq|N2B^9%*K(oJ+ zkklzw^ff?Y=qHrIIcBttrW9*H+GcEXBXIGKe#@?5k<05@IlZ3mW85Za1}EP`LNPwoFF>5@Bz9)uvRTXaO;K z@IPm=jyJZT+Qt9GFpZ%xF)?C5LtmSnBQ{fzC=4eTG=2rxY_JjAVt{ud!=Re4mo!y9PZw0{Y&}(I&Q0$qdAJ@+hI^SV z*UsL+AeBrcfx#lo!mwPc_SNkNxzWb!!+i&h_}WAD1;BW0lj=8ApXRBM4R2o-pX!tp zAoZ!MhTMPjND;v-@3%WOCn=S$(M4yM4pt2IwyezBs-;_-gD*xqp zbPnac#E&-xggj&s5Je896VXv$sN1NnG3oqte2ibtF|cf__>6bphs{ouq>+g;CG!?f z5Zpu8un?dB>m8qm(%DTXw$9t}Q(P_Ws6WSJ@pLB?B@(rf!Sxc9@~Y!cS122vfrrxv zw5`EOi*Oj=(tt3*-%A@xa*lp#P$@s6HtzN~LWID%NV$g?%;V`O@Ty@yP9U}XfD75McK!oh^Y-;ki+XrITL`B1 z7k^^p>mb_}nZ zGMt?Jds|4i>B*^B`?f;8bCu#r>nFvG1(vY8S1%tfT5P3N%7p%Qyit(kr;dz@r~n9O zc#ALA;$LD6YEc2oDgedonI}U1Yu-GXb=Bqw$5eLnA4QegT4VFSQ~}20b7BhpZ4rxE z4q)9`Y^~6LFD+7QdbakLN@sKX177}qHDub2CIw`oT@SxX{8SNVJ!(yhJl7RoB*#D$p3RXpzcM#9~uX( zr9W51Q>(RGc#30Hu<|AvFvqQYzozgd`nNcxx|Kq*A-EwP8A?0&q6_OPgAes;;b}SOIIERXDZeHsnSz+U z$uQCVuJvMBA*yv*De^O>HO0^eW76H&a$n_(zIK6Hc*S^K@7%RhhukV|$e{RgmSKWb zDkTozwoA5s1+%R1C50bizic>9vd+BuF&EDju0xiP5mcvxK6RtL-#2Kb?TAJs^-9iL z5H|f4wn%u=QA4HrrG|>@!95=dSnE)D2+6XEy9b5q9t-XeqpQ#&BNqLM_p?{`cAy-o z$uw7Tq-voFWqWYqzJ)HchALN1K-Y^zMpAzrbxS}l_l23BB-*6w;4__T>7E@3-wQ#n z%i{RYOcy7b^|i`VUK!iC5z<~08+Aa2R;u;%U+)}ySQ-gQNx8Sq5EA4o$k%Jf3zVI< zz%+W-)}LjCQ_}`4=mFT9{JIAz-$gD`bbMmP{Ry@f2)3Rjp4g?ZY{c z%8&#!Z>w99Qc~J*`Mjj9*uhCT+!`_ny*b0me=x=CkK6KWp4+opWLm~nl<#rNQ!HL- z^Om(?e%BkBM(6trka*8as9rb*{=P~LX1V7BR_XN({_WrdmM#fXRp!2U&VT5Pp2qlY z%cFvSjScA1dD#mTkSU=XJKz=E2-3IHGLZH{(g3iQ5OuLX!X+QZD}u57>r2p&BWMC3 z{OT$Q=qXGQ5Ai3w zazhIAT_{@v!w?61Jzm@C;5qM+hI8!Um5t4^Kn1*_)`g3822C6E?1_jwHwTZg4^8zDJh3vihoT^hpRTi1dfAIg8(oGRZpEEkK@JP zoO(=g^~{^kK#aBR6BPaXVYTe!;cI$Q;N?)c?ij;%v+ox0u%O};uuy-2$ApW7I3NMd1xqJq_m7+Y9q>xqTYAt z4CwR7Dt5~SB}qSw#oqo*<4Qbnd&Ze!;S>(r=T>oX2}BYAF^)exJJ6JtD9hZ>sfFCyP%**k!Ku#B;Kgn)A0L%}8>1I6 zmB^KkkWVh=RchKy_pD)6MYp(I%yU&m!U9;f!Qv_&_5n;DyAx1wO_t>#kgUQreX(9G z0CZ7A$S-+gWlM@VKK(6KQ`!wi-OQdK2Z$l7jjHfFd8${2spS*0DxM(cv3Pw>IdSU% zmEIndm$DE9Q5_gq_K_GxWehVmFyNlA5F$rf(fWx~-lu4qpxO>>dyAV=$x9aHd*b>; z)?LYd_8g$h%fMDE(?au50FDYG|Bh3iaMrZqCOU!F&j)G5C4&$oU!5KNQ#ufSJyw`- zb9IIn{5xu8VPPRgZqgP&)wvC5%fx(R_$WyiWBYhW5_m5E@|@JJ(7ub4_@kg?REg*= zW#s9_&307+yGRtyY`>)?1tmv0vn({PDc)ci(f>{6OM zR@y`BQfWELm~09U>LWZ{w>>gObW`aA$MEnQ%bLUywyfy)*0icjuRuIDjsjsz!^1Bc zZ6uWs|NV=)AKx(bzt73CqD_2hdRWV*kcsp3^_j_Rp96zxDWKb>vs5A$n(zlk{!V0N z0`(|b_wjL*IQcUKEj1egTCFz_iGg?i+n+{UT>S8`I+&du^FQ&1>W6{)z0Jr{7_l-f zQT{{VHrsz_QH5x|a7P%LH72dx9Mg27FmPItBZ(C4pYpkV2z>Z#OB0LlZ)F*au%)sA zaEgwq+2^mCi8}t6J-yq7G#I~EJIb=w%W#&xu6!Fp^}bq8+aczCj1v6qc%&p@sx$C|qS_>$f?cA@g*d$-Bt zwf}>pMUxCnSDo--*_qa{<7aA5p|ha1k{5$aT8ImRX^Y1{h*^YO)p?6PR1b|RPQ|Nn z9((;hySWb8xn|gmv`tTzD!VV;GtG=rn5Zmc59XFWf1#DHwzR~r0!B898qXd10>Hz= zv(^aUt$MDsk7Qm}^Zir14Hbe_6ueV|W_&G^tgF;1C{sYK5zo@8?CVFmLHGX17r-L-qd*n%$#KFB(4g ze3+!;Jn4+@&2i;?1g#HJM>tvY|uif3p-9_uvucp*Hu>Z?_R-o$(G6`k{udDgF$Wzs&hH>f? zbbJ*JioMt!T);_%tQ*iRBAoi?;sLB;tq&ak$*}s)#pS+ket;%0f{Hx>Yms<+B4QWD zzM>kw=s9*VSn{*keWw90CuiMr<2*N>?)sVNUZwlJ@7 z&ewl~Ofo6#;`QHntOt)o=Qsv9MpLdk!s-sl->I@z>BH5oKgxLj8C#Dd;yQV3>>=>z z9Ob zB+sUknCKLkh^_m^r*Yv_EW@zvn#oA`L%u0X8MBvO3Sc>4_9mq4~I;%o!1T~n%Pu#cFZ3gy}KYduRMpd(zO(-BCK*Qk-||JR?I zBYo?G2$NrQru?bKo(_zzN(M317yCL*9(PAUeX3H)jn}Kl#mXC$^`z`R z?pMg>L{qN4*nW?mDC@_dsUh$3F{|-Mh=ZWMzqJ0)=Wp)lzvT?netfxe?0o!pw`}JL z5Ki~pEulY9w4QiWQ+J)rJKFtuBg5bfKWTvvsx0+u=l?+L>^}jTsv9RXqcKSazo) zcc}Gg9?DA!QoX9ez=u#~ZIF(po8Z#`JD; zu(f|H*_srARqi@-Y%^az4!JcE`^}$j-8YmUqyFQleEQUEdmhPCt&Y~wdxy(0_v|1#i z0n+}e1%+JQ)Xpgh%F!L5n5fg3glg6k)o542jhr>mgb!c8G|lzTkk1QMqE++h1`Sgy zJw-H8Z$;yfl`np3WyFe=rR2BZBIrWh)wJoN-1q8> z;4w9y{NBP=gkYqM4do_mhvw2dVs=FYg?q%zeaQR`m=;z_Ia>l^Js1|__4IzlS#%^y zFQ0tw+C2Zi75B%!m~y`GEQ?hrUtJBFD5 ze&6E?+;P!dJOrfX^_pS3Nyt+V9Mv8wJqK1xv8oX#*gEUazbylGy+2Om%Y-e{^hf*q zV@&!lsJ0A=U?(1m_L>T#AT0r4p?YR%ObWWzp(oj*J09QCSwtPi=rznz80GSVjyIKx zqdk)^Y?xmk!+}_=RWG?O7c$@O|Wgb)OIQ)(M<-rg@b7h*_FGe&E44F)%jpozuyT1rg+y zkp9U4$4Ji&F_zm*nk7{mC!Ap|(qD0Zw=dq;ik_T5ruC96rsb1Wbx&OcKTfThe7k-_ z9%HhLXdsvQBD1isU;MGLu>27?1N?)^7l9%n^W?W7WwsO}SqB#O;88sQLbQnHLoNuw zy;ns(`@n-Lsl>Ac++_njkG zwalT1&ETb?O3Aj2KGzA@*U^E6QduokpgMaXB8O1bGtAj?jvq8x2cNCy8TjNt&cmZV z`IdV+V2lCa#_=M2zNVUde+<@o1!Y10`iWc&gQFljEzy3}QZMj(4lT7Z1pawzqIrwaqKFn9gqTk0eeaRTF3 z7zZY;D=l)u299ry5`QMUoFwuhCg#vy%sBNJONMZB@aAu0hs6$@`l8v)O`_hkT3yZ~ z47~aWm>3_G;|M354s(4a{r4^AI|7?SW`pL?+<_|e_0^vm^?yY^Jj#2^US+qHEmRdv zPvVD|BFUq9or6mB#;)zs!Gei+pHOk zCzt7zOi0~3`AcEd1Bmk3d?%<)sFm|$zt%3a?ZdV$YpCEVKKt=ip|AjbWFTd1hTpLj&fp^s7(80zN`7D4Rl(UdZf0ihM>7loZi{c=9uh>xpW&DMcV zAAYkLo1LW_P!g4I&NS+U*(M|GqTAsyAKhc%F+PuN82GFK)u&PVpf96O66-G?2ZhKP zA%O#Ty_Jtx%&!bRF!sOymFJJd-FE2-=UbfLA^x!B3ftrA6w8`lE;!xqr5@oFeSOvq z52y5+9QR1rr%DJ!SN_JObgqd-@FzOburD=7K2ihv1C0jJ;PHZoY2fTq5JFfsx>dHt zDj+d7#-5~}Q5z_Blos?<-YR^AuMaq3*PEQSj*|v zhrHv@o~z|MuJZ`MW?@#d>ji-fgq?`iy^-SYTM$yAOuk=$8%Znsn(o&3SYuhyshNRq z&*19KbBCzz4epISr=^J5(6V@@0 z!w`aXXQgtNz!kteVzA$!-h8lF8bSIB7Y~kFN|bi^seJ$K=&a zSj9o;`FyPOIzvhDQ%zpGJ!F5ihDLhCp`7H3_f2nD@c77ZhN$`a?51lBD# zg<4#GWP(7TYf5T&;M8~4;!Qv%tHbET{o~gkYE(Iahw+tc&V*Rz70*QvL}mQQZq z*$%X@4UNM)B0)8&lPgdq#fwKphUIkMQfG2_aEyY#pCSI~GJXLP4WCE@=)(|_cl?%` z0Qdz5F6ofzO_U`ApQP|+5ym5@V20OAk~;eJRDaVeU^bR&6~09qmMcV-hL+C+!R2$>;h-;{Q@d zG4sG_sU1Q2RHt$I{RK2c$|PtsWk{hCT;QPI1t&|8)K1zh)rmlc(z;T zCAYD8K!V=~)W>L`B-&)@Y1v-+O?}pLG#S_Oi3~2^F#vMQ zPzt6}{^E7t*X^0GnNXY9=anMUYD|$)t@*KXr$AfX?2uy2wqGde3CjNrd)L$?=-Blf z*zmIMAK3W=A}Z08L0g?c$FFht1owY4a8Cx%rTnT2Kc8k&)GJYNcM;FYD;-IY&JU9E z->1JX&g4Z>f!O*4Z+^ziBVn;5G@+-_x*|=@9o~(_Z~-{X;0&v&H?~c-lCtyCaNiJS zL`mx!?Uw5FXxmzUMT3wYN%si@#&g%XL!AETnFF<=QraW|DiTOq@3_X98I*)%mwt((>|`xQ&c@~UZ>q&54$$gCLZquG_qXW3lO zV@YRq)5GGJK|iQclw)f7g}*=XeKtYx1dO);7?{07)ge`5D4*q$Q$Q3->;CE5^n->a zl_Y%PVJRl{5Q;0(RC*}`TFqlDAkz(4LOTvOx#~eEgR?9g`vSL(V1Me zB~>Udq}g-aBl@^z-6&$v4^uLg{g;x&EWDj>Jd}|U#Bg>`H@s0`!d(A-%ZRyd5_Y{f z+14VJy?UahcN4p8R7{Q%P-nuh^jn;!Z6i=}LC2+1-W%T>W^4gNx?{7)-_Zu7L^W5Y z20mv*<>o5_#T5=#LT5G+Fa(pUnzA&1ki zV&2d64mY4S61U09sUtBb?8}>t`sgIc&d>0yYnz5x1}LbdX%wf>kJM-18O9zISxbMcl9=?-fEK~_ zPOP3Hz4NV#JX4(bFN#lp@sxLcD%zlzrvIsZ`Oh`OTo>j$-Nv4lhj9IAlGwt(_oM>V zbI7tAIC~7KD~S=P*u3Oe{Mwm7Y~J~G_k+Y@fO7tcq{nZ?EeD_hRAFv&-gT&u{pm3Q z){GqpquOU_DXv!H;&>h|nuzyPz?GDa&NGGa8Jj_nf$UzFSBVvMNEW}^VpZSyXI95^ zX}!NOadAA0lisE82&r_pioZq7vJzATJ7FEY>EK-WC(AsfQW9~-R1!5IHyd$9Ev}C= zg%C9lr=TCNW7=wM6`NxnC0#0Q6&EX)yRL&qVcF9cxyZc}aT8e8&GNB8lOeXBJo! zAh}wfal})pn29sqa`$c1a^X;ZR4c)d{>Jx|<9FYwYE}wG5E~)*zRvTpnZQ4sL0x8L z=7Y3)_R+s+-Svku2#y7}GQ5!TgoyE6jrmshrK-JWsUPi!HDx-o{D45a{P?|fS0_37 zQnmimpq={G>X3`0393G904>Wr)!qdVKHu%B@3l8+TL%sg9>tjg$XbgNi5xqRQq2qK;*s=Q|kU2$v~s<(}!kSa1?d-k^a~ zT>0W97W@Rudmp{~Ya@D=)oDX-6jWh91KT9V0;+M5!_a?Xh{Q9Ln{wRdAqFHlhXzLB zR7xTjdWi^mO%KF7oLIu)=-sL<4kiP?YfIc4`NCqRpa~X)?&NGetzkRns3S`CNE!%W za#NmV-G`eh@qN&TVBt~_~|G1mcc zM9a31Nvo(5S2q*lH4AfoywJ)bJJJ3Yy{G}F!epoj<}xEPm!ZZK_nu*iMIkWHkx{W& zj!@O%I%OZLdk}~~X}R{{;F1|bJOgyjbB1MzI`(n|1SG(bF9Wda6Tth1Zjj71=*^$s zt415cg0w#;xDc3y{!!rLZ(7QA1M2$5wxTAXBqHE2F3KRpHM;` zjsUC+wpN@1jn%IQZ#kY*I?+$P(W|v=|3uyt_o&JL!0JL*|Guh{J(Jcplh3q$_9da*=7ou~<8POET4k*%T zyJ*}0Su8#IGLPCfG=-Y13KW8zov6xoz>YzCN20B_gS-fQ;w+FB7v%$MACVPDJ#&|( zPRnV`Rsfd*q?73R;;~HKk2Gu^s`>}U8Jsqzk15S9h+a-`zc$eLKW<6E-EExpt;HdWHxjB@EtvZ^r^ILpxk08rT8w3H(K(IX~tfL&~ z>3xC4{Xq0<1SbNwd6Mh>o&u-DX`bYMyIiJxUJQ%iMI<3JVub!t4{@qKtb!w#F_4%7 zV&;x>pD_pAnFC~#^#SiPHH}E&s%eG^+~|rtkk)-Q$&dI5jE7CJAcl^mKsv4R<=JvC z^q2gK9QOcSOXn+L`(gopTIMFbL30*Fx?3qAnKjy3iqRtEGncz)My}&b*QxbW{Gjv) zpgS0C;+l9-`BZLE6wQK=w}IKGmy$x_^=X7`qY=2WCT?*}JrRll@%-VVZXb70EEb)L z^wQclZWO9<9nXPIz=TwQV+iM{Tt)aCaju+Cd?KQpl2_GA1tshgzbwQk%}Y3gKfz5} z_r#uG?#6r<7{}{+O~{Z490>58kj4@kl5Jh?Q9Eun&BS6M%7XDOk)}+@cZC{6oxIOu zr1~A+-WP3Si7@4II(6l^9jEIe6GWpb4{f-LITH_XeFY6;-vixiJplSyzEq`C@QlwZHb&X=r6mu&rk0Rd1W2W_gaub`#Um9{2 zH(NEwRaCyz-FCHgylREDWs-TuSdLAM^BS`kZt5&b&8SQaLDS-=-CwoO;+@ge3^9~g zy>#IJtL`iM7Ax1{&KyU&uSA7KvnhStG?#oERB%2B`LqsV8Ks+8^eJJ(QYT6A58D1T zka_^e!Ylg#4nj%x4ArNj7iTMMJk`HClq2=fg_Gu0KZmnnUvxf&K)(gU{Z) z@iw1suAma68UggPCnAVy9VaW1m7O~g_aK@V;?>_buKosRjhSIsy=Q8ZC2>quVDkYL z7)AFX`#RK9u;UI}1w2gHeRyW*U9G)SBzpAKa!6C7oDJNj%+>i$+33rTWDx30?ZsRf|RQoVV`O5l$<|>41$IqMXEtz%!&ML4r05| zY*}Ik60|>;1OQ`+Uh}PUNMev2cjGm;wi-_do3Lh;RVC3T-2!+xazw`AZ`lq(Ef; zoJzX$U=j`b(b@wP(Ge?9*N#l>mKXTtO_<@ZT&Fvw_RE&af!-WFuRSIO3P=H#kzA>i6GQ`i0c^186Jl5B5sUrQ~$a4jrOW4L0{gw|;T%LTet+cE9s@1t8#m-@(`CJ4f(UhH_~4Qz?Aw^ye zKBetZ@0;Q4EQrNz=>k&cyWHD3&s#&77+h5cGSxx4(C|;er|t4iZ*2Ol7w$$ki02Is z4i1dUIz&I;F@B-zMT--=YrowqwRe=e+tBVUY;y39z8_<#!WSYr`pG_hEvdUIb_d(7 zb)gM>x<{WCUrR$cOCt86urdemFtwi#B7I5G4>5nBTRI>{tAE=;jFf50FGEG%LmWju z75(?OZWpQqWd{n*T9zc>QHUAkne3fcs5o@G)A(Wf{5w}J);&%w=T=wayNP0PjB=zW zR=AA>-UNUm&Uy)wU35Up5UFmsk&esc8~39pR#jpNtON zk(ouOn`@KKWq@8B)@a!eMVqP(uC6*CGlOPDsBJ}qw-zzn`sw{2UwRi^TKm$D4cWQQ zCwnURvQ;9)$76IXS-=~coZ=o#G_M+%zGyI&67A61tUZ^i+ZuBOO4@hFn8>;C8m|>^ zym7SL7eSi1MnXgdSPFJnD@<0;wRNLmkC1qh_H;Sp>o3iCF#YE5SNs=E{b4m!S{&l92M1Ww-`w2JLLs zB77W!!K`QbwY0PpvQlCr731pgDKi3M;`&?a>>Ia&YJfWyO+NJ<$8Ypa<7eFvDN8n& zcG4S{4j`J`*dO9TU%!pEkSNtIIFnlcLS};1+SC}W`ZX`94a``;EK#MChwUHYvPpf?z-2<&RcR(f|)PxDwKWdyCIsm>~Q|duj`jz5Vd@d8xP@*=<-p}x_Ms; zlRE!f?c_x%GkTQW9_a+zm`)f_i~S@CrTxti9VQrCB&F&T`M zVyI{WpU=3~+gUhM`Q9#pyzhjpn0wC?MNH;_SCw$NLN%|P8IrhE*5Co`4;M)cOUp*;{uTHU64NT-i3BT z1@gZ0I%`$}7LQZuM50$!)ngdrvSqHO{~l+8y^ZPQXL@bVmn2S!`zCe!>(5@d}YvImURtiL~MTiz+9a%%G3ts{_B!^qJ@p;D7jC0uhn#LlkYOg32OJobAf6Gjd$# z>Jkdz?3I=b9;N)R!yed!61DQ3_(gOebj64kEPN^S=t;kL7L?u}o?k5q+MG9rxi7P+ z_k)`lP6qwxm4US8{JNbbDSW$*175qKo3;z#P{|OM2IVV;!#0p9MUY;8R^W8GD6pcJ zMkk4Ggwj#FT=tq8V4Z4NKVl1_-|9GXm^>Q_AN=}~rppvFJYQ8Ti_&>5DTnf(KX_1A zON#kHc5trsqKpg1i4)FfQ4Py_zbk;My9qV8?IJH9t0>^k1pxbBmeM}0U`Ai#2?(e1dI$;%oC-e%cw;?B z_Sp0+zJPmRO*QA15B>zM zZiy1rfWj89-d&fhTT!|HsgQ(J=pJMQX=!PiWK5EGBd4BNvTVsm{SXDvPS;}xA5P(< zLb7{&ejcVl4{~(5WO6VWjpQ|#p%_>~V@#yKpr>j%)oCC8!!!YKPVgR9>KB!vOhyE& zWX9#-ZA6NndCHo|%ju*~wiq)hXDv)zIp1eGP^Sxngav!I@y$D`X5gC8p<~rl6FInh zXWm(<56*{nsdb+Qt;53CxAz9BIWlFvI77F_Tn3(!A3R+c!|`*Fkn%cP3+UPQ-x+x7 zJ-77aSJ{Nt!ZT~}4>+|>pq>Zru(Aq$mEmQnynhy8U7&-BDzy^l-pSaYTM}j@D-T?d zw*kb63IC5l#&#%(p!fWzAqZWE_(*Pj@v80YOr!0`BqU);)XP!iDjBzZIcL*uvEAZMe* znfGNA$K7LH`Y+OsNt)ACY#x^}7hwo%`qqF_J*B}cw0J8PDXIjSr@GgW1N3f2GKXW0 zYF5pzMEG6Vf55V$u`aQdcV962i{zY}5Y9Fs%j5Tz6-H9j&R zV+=BN{rdims z43hWel#Pn@OFEIzrP}vVM^E-P!No0E5-xf@xS*75b*l5fH3+mb1|KbCZM+WMg3C3> zr_-?Z&k6`i-oTrA_{1CzRtU?b;!Y)U4kG5RK&J*2lPmpzBR z1@mwehck)a=jX#n1G=lX2bCG|On zSC&@?h@2HracQ78-Dpip_Zr1LC5NlXLu+$!7FQIMXi?8$^}Qe3q_N%X^eO)&G8Z$= zL@IRYSYp3g)hkdN4?K*4CUf`N=;-*`t2vYf1=s8g2@47QuzTJ2URl=-?&EiTex2!7 zRjC5PUv_gr>6@H;tGk@cp`a~3{!zjC6Q|Yaxb@lgrlX5l4 zp#W+cia&CYs)*bfF)aQ%rZg)v$XVKYyyS(RLD*#l?f6UBNH~TL$GlCAx@D?>t1Ly! z+bw;UtO~pU>%B=$pAbfs+;UVe=Tq_)8Cw0f*ca-Yx*UERt)h2gC`TxO>_&0o00N9m zQKL4~<)TN<#rDsC=#X2WR1@&la~}`LMO#fgcMYuR13cyksSxYvFfMX%>ZNiHGqTaAg6cUNbh(-csA+jQ?MFD;vTb2I=;`Vv_oaf&kmOK)cF1{i zCLsDVH~XuGi=6ocM4YLikfY7TFLKji21ySYxqMdBI^L^<=>iQ#%(7lT{tN6>~O!{YTY6e%*?x z$s&%cO$+~K6F=8jQEw~qwcjxXGePM50gA2>X& zj%<9|LoD#6_MSZRRy9of&g*1)eSupZX4kZWUUBAe4v!0%<9jJ+IqPwr(kLWcB3@?~ zZ^P?fIFxWOQP`=MBcr;*$;CBOlS1h9PRITw5v7&0d=HY$#L*ekzbBBt$NS4oJ!F|Z zG&$*H6y4!z#m#{gZo8}uR|zca$t<~9Cq<`g{vA`$C3N*ZANJu_XH$=I`nj4Qj-fCY z+(RynyTgz1U{_CMnv+Rtp;b1HI+P*RhQ{;-QH?_YT-K@a*aJ9(yArb`Rudw{V_%2~ zMCecwpP)yoW<07wDFbo?I(UW1DvOhYW4-)LzMctM=+UoJ6OVq8y1rI-5mh7=s&T*+ z;n$N0-B3Uou6xfq$6nvKmsCEt-QcnF=$^d~7UH(^C~iO^`+R&sbe8d9_4}(Y$=u7x z6ZTPz&X~zfR-qMMC^leaj6H+65O4qI8znamXizV;f!=&1VmekuVVt79e{+gaV!9+1 zk!4m5bL}B#T1;sHfiWfq9%Wr%;K(o18*(UTVRk_zrzaZVADX<3Njiz7g>VY`;E&-P zF-}5<(#!PRQSpfT<`sHE{9 zKfl>JU}gv{(Q|OxExdj0pF=*pdor{^%&gIb1|GF^wfCq&a`JJ8cgK|R|J7(AMH|p9 zbX^b5vIt2$ZxaVWq}Ee&OmQcUI%|jJZjyPdl8=&dHl3YLakTHJG-uYQ{ZGjc6`(V#WFFgv=iDl!hDo)T7W$@eoshrc z`oN%Cy3>kl@eZN7o0P5&H;le1ZuPH$r^oyA^evQ8c2VXIcuqaD8r}6$1;1?P75%Vn zkdnNHL+e4xbu6$DQ)rF}(3r7fw?1`U{`cA415>g!=@$-Sgavar?f8;ls$QkDRyM&I zKMkK{6~yjQAi?$mx;c66PJdUi`_gA0#lGN6(H%WW0DHcBPyq_68n{&SBYPzjVp zkl(z2v+&rww2&{$K&N-elpeir>0zSmA%yMk{`oPKwN;P`$eOr9FN<%L|~T*~PIM0GZz9C}?9aT{WV^DyL2< z2C(Or-8_!hN9pQOO;j-c^BCyNn_Z>66_^V0dKkT8HD374QRjf(>`*FZg1_d7n&!YU zs)!`z2dejrg=#X~TCo-NNGv)o4&w=DEqmf0A zMfO@alO&owcMN}{qk>$SaJ9M^TY8@H$Ls61t7>|Bw`URwH3*|3t@7~bXchJHO!Hh` z&;(NYGEauYDdV4{UX?42n4-n0>z0oJgWP?x4;n;r+r4nYLXUpBEnq+Tb`z zHaM=b8<0e#^WI{VAS!+M9oOh}DP3w5mF^wa-%DR=$ZLw96)h#Xb=jbck}9}gk6WXj zd!A>O@l5U06M04h2^oUNX4r*gNniaWXvfVYewpY{S<1>5_TkwT+SfkXNi3MYv%epJ zWN&LjHe|cnY%EXvD02grwRGcM?pYBjPQ9PKvg_VYU2SHCb{{Wyr~0jlIypND9I%qN z31DQ(eEKTz)3}00^nPxz&e)FPXYr26t_@-5XHq!(YA!bpJuCm08_) z`Bm!>k<{h15&TGe&+>tW6j>ur_JOqJEZ@9@X0Ho%CEr1-=tg+vNRyXI-S;IG7Up@` zJ+r!%K=x2Y?YW1)A`Hj}qD4*XR^*LJFb^-(xs0sID#VXGXfSk=UoMLGzvsG8d)l?x zB%{C1YDP{kXEbs|^K1Y8x|!1$spreFsghVGC+F|718?}#i{C_0QTZg`{OX=(UwCAO zK}48B?sM(wYNR8gjpqR6$dhs(d1G8DEb@g zE3Np2&{Z=ubTKDxPb$?POq#&dZhlIM8rj>OnN!W}n;WlGNRr&xzcCw9VfXss!{FtY zB}>H%D!c}+opfrXN+cViYem=CZglof%@3E)NaXu1jq55&gxku-5OTawj0nDfQ6u2{ z*5PZPN#*xkfbtoZRal#JrD!0uK-<7idZO!HL9>k-FJ@mLHJMW1D(O_}z~?V2SLqXD z2b5~aZ`KLYp)rJ_DqX37IGz$m%Ny3O$=X(gQyN|7uKnx)GM6=gCd;hx4+ zr>f0=e1$(FxGZ3|Mjn+rEQTt*hEvIcecg#p3qu?PMPgdr?=?7Yw4<*y-hU&83hQ{* zyn5tIw+-5NVI)!7W0ZZLyq0XLNRs>g;~H|qT;(fs6|H=+%l+8(8-+d5pnIgv+4n3YFagiaI$3iIR> zyfVKWp<#HJ@T=xAvkfFCqV{5im@m3_QYR^0fbx^xT{{WZm6U5(kVAIv+-IFt8^Wmp z?l%09AJ8A>i=;xboDXR^+eY3ba~0KMUqP|7V{On=@_NHk*M;ez9dj*&l=nX;D~lht z0_xe{Pip%I04n_^F>6V3p=u;`{ftx*Phg{f{Qv%`dVD`>e3k2OJp@{h3KU~w^(wK{ zhf~@Y9!Zz96g5uQgugbAk@=z$82RFLiX|h65y)C%3)%%*neh`JWf_zj?>!M${Ag~= zXv;|SJntgoCrsA+p&PN%z1c#Q1!>~1V)op;9WdtPlo^O(+LWweAqy}CXegDPmDxj=r1=0n6_2hi#F1= z;eDUy$2{It&Gwj6As|)IPx&E}PL5Dq19|e}akL6MN#)gr*P04`r@+H_6p}f6kbiXG zuMy=xtD`fw)5|}5;-mKa@djN(lj*PJ^Y-ZG9t;V0wIJRDiJGSTXv<)2kpQ8Q$UzWO z$|pp|;3LZkMsQsZMsU}T%QImt@1wo!pq}-@coyhgP4GP>yB^X_jub%txs=@a#z^@X z)EOs@BhFx@6&{VuB?=5K_kKV_zR`+g^ET0RG4nliD1s!C;&+dT+!S4zoqTTOtW&o+ z-u;uEs_YT8C0p5Ns-6xQVSap}v=$hp+pMz0$of$et*){>4XhN=F|NpQ52J4hZ3?%- z9V8`qjvytEsFl{jecx;QMxD3nZs^!uUJ^wT`ft?)Dg9md2k!fQ>@CTS@hB3je?0h9 z{whH3M1OKAOsCtk{;szIh2J|u3>!Z971wE5}knkd7Y7M;%VCt?1<@N`8uRQ`ux`{sVasZfOrjq}V9UkFkP zqB|7&S%i`x-CJkY5koc4qZx1E9JRX@TGYznyaFM`7%JI1QJ-aKyf>?$s$T7*s z0;4x#y?cj2Y%Ogi=$495T z!h*zuIMMH|FIzi4H(TqOtwG_km0ERsN<_Q+oEV{Y_nW)akktUGX$j5AKoSA^i|Feo zJr>Z6zF781EQyp7d|l=xm{DZ*AT4(=PqtDMs9Gi7ztkniR4a3PAT~r*cY&wdzfFZ3 zN-PEh4FU{{_fkrER}?1cjo+C?+mtQo})vBfjtoc zVvMMomMC4rLyc#3^4Ge`hr*s0tbLYGUM4H6*RGu0mqbXqQb57YXv-pe25NXW?2`q}`Fw|Hw{XqfSkV_>vtXI)Ce836N= z>GhfJb*r~G#a%8l7#w?H#bfXQz5uKZL*ely04lT)16QD;zRO821 z{db>SFf$^sZ=2vmI7;eu(yc+h{E%YSKXi(!ndsk8=xm&i zXWR-;)uLr6m~#Q}vVBJO*VjCHLF-x;G3i|?_Tbu6h|Kb+e`tL&l(zdd?x0m){hhRb z@Yr2GA2aARWLuPUk+tD-55sM@AO2nXL(A*O3IODf1BQwMG37y}UpfR^`ORGqBLx)2 zslkGCK7V%F>ie9S5@tJV zVs0vdawkdJs4V-XNd?qfKTkiR%>{uwMa4>m8eM{T!t^(0or+C!VTp}ODk zRSP%;DRZMYYqqqD6y9Cut6QiyyZfk8+y@3Ni$tS8NO5f`ab@O{-lErm!Mk$fUgz!h z1%c^A(Caxaaj}cksM!)_@(Hcyt{xN>&Qb`syKio+CleAmQLz_l=Hg|Xt6Vz*@q||3G zMcF0I5c4o;5Em$MU&-YBJWS5-TMl%f3M1qEk7IyZsoxNuOr4#Z;iAZoq(YKP^!^;;zj4`?LS_A#x9Lh8jiY0 zg65Fy>vmk+DxU_zm*P~{Vco;eCh z?VejmlK}LCgtl7&k(uON4Pj<&sA+>E|7E+O9qo>S=>HhB{bjf%Y}|Tt2vE5mEb1$ zJ8cu$Fpe(T`gi)(Ld;JtUVYI#N6!72;r!3z<|RBY9lg}`R4x-_7epU%1?tIK?2mTD zSi9Ro9Xf&tC@NYj3k2>>p_`i}KH$W~_qu@H5ysSV%V*eL`OzzZxiBLaBwLxiXED3v&5AH!CnB=caf@}xyV{&qBe(dW%CBHH@yPL;>`oy>}Za0>v`<|olP0v|7~ zb!hE|ecO?gG-4jxA5^m`3+mp%Tb?5U53hTobH^$ULpp>kt;;6q-uo4uNgeg<8OtF% zPcV$JfUkO0_+UeB*+5np7&(j+A4qo8)@Qwdp$#)Q5Lh@YR^aVCAXic&{l(0wyzpeY zC_0M|T4pCC{<=V|zh4v$KSr55>@j?SWNb0P zim&Hw{;cQ9oGsNS0{$=d-q@Z@-#1C-ldU!6i4X^C0e$|{FCbm^&eI=rv7zL++5LB8 zevBo4MrI%0v#51jPRDmBKz;eY#^c%?jem{D08JC-A7_m~90>F6p;MDtV`~Vbl=tzL zpRhHeoKSu^9dCaP>p6VD7&`U{{~sh?9yR*F97}yYB3kc;!u;up^Iq>nH7NHWMihQd zoD|U}&HivdnlXtkr~_f>V~qp;AhHMr8I^cSo7DFK;u=^ZkT21Zxyw?S(Gfk675uc{ zO)A|}W=AM=xQu6_;=m3#?n8nK5k~gUqbutf41X)^$#T2M@r!6XQOhjoBkq~TayH3N zTE#cwk7#%ISTf6^v_@tIkVOEDcBAyN6Vl)3B{8J53&s7*v%XlPt;)aZY1(f#g)5gN z&_61zgBqGu^d5}fK7Rh9`g?&rW>O*2L&`xO1vf+uE~0%WXbgHS6l87)_vn?xX}vBe z+`L!l&6OwPTI(LJHx!3ILmadh1YHnZU{u2kne=+a^ z)Ji49nU~-&=u?BhcuiD;^5-ZxAmunu`SOq%%k#eN15%_eA>Pz4E*92(ek7G|uekOn zY{GQ>Z<=TWEtLkcKR>`=f*%NPi&S-m2cOJoJ^yow?;VGjv=y4IU#%xAU4 zWWTLucrI0@fBOBj&dYEvzg_HB`>|v~oP+rZu_;E*L^A6WcIp^7Cm5uo4yVRJjz%ED z-EV$~?{D@j>&Urgx~w7zd=0JPVJ4&@JkZn$6qoAnqKNJf9fZfKs# zLX6;UM<2s*YQKh{WUok1u)V(xe&@pio>d4Ol=%J=`9Di?ixw42Wc4k@Q@_xYrH9Gf ze(i{TZ2gimmys|jl`8hc;|Rp@Jjo#Rn+h$4;`IhCZ3II>(S>bQBG+3`Iy5sCT!@mm z$a~$4lnzDLf@JKln5p8R-YLm`{7TQJF|GaXwA#nTs@bW8<#*mUw_9AtYeD^Wfr2Vf@m| z@1#)Tv;3>uKjd-_H=nQqsvU`)5b{2UK;Nz~rM(wlJtFqn;1-`2Ly6T4P^Z*ct;(ae zj^wxYuo3_l>9Q%0y0!{�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

&7EDHRohbBvroqX!c4Ng>spXNBLz+Hi3m ze(WaVmRZR?bj!ri#YqVr+ISFhDj-RO9Zr#$8EC&&?t|1e$c{h#?tz?X;q#1pb~4b+!W7sx4t|uzSNu!_}KN4>&iH6^= zCcut=V9ur9<_sLrrppnIi1U4aVc3hw4od$0SsJV*(hB{og(Bh_3IB0q98bzNlu`a| z0i^^Y!-nBdT9$72D|oN5FNy8D%|782Xt}vfu+Q450^7J>{k^Ah z6aH%3bBrm#*Tp6o;ii!ZS$Qo|(sp}ssv z=f;Ea=i=Lx^O54-fKlNODhxfJ-|i1}ZhVIx+1$Uzq>eRdO9v-YTO_7cS%R4j%B_Et z;0FYswAJFfEiW%Vti zlN{>IvwvuU-#^ATR$Toyual<*n>9Kr{b5LE3VZ7ohC()__ zUyRiHS$E+M)6J^qa{PGi-M0@(>goc`p_vcY=3m#$Qj?E<5Uu<0%M3l`3^$tLs5|+! zNiULs+KGjTSynMZ4VY(S5kVlRncq_n@=vY3l1%0Dc_5ep{UJ4K${9l}Gx@=)PFx4kx<^qFK% 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�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 literal 0 HcmV?d00001 diff --git a/algos/eq/Picture_speaker_meas.jpg b/algos/eq/Picture_speaker_meas.jpg new file mode 100644 index 0000000000000000000000000000000000000000..414a3139331c5aac5c0e58628954cb1949f9e772 GIT binary patch literal 116075 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�tz@S;f}Q?5rDKPv5kvFHiTdSmNe+3-)n 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

}X&N%q$ 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 a3;k7ZN26aXiG)@uUoMUfE54?>n*Kl1FPJ0% literal 0 HcmV?d00001 diff --git a/algos/eq/Picture_tested_speaker_frequency_response.png b/algos/eq/Picture_tested_speaker_frequency_response.png new file mode 100644 index 0000000000000000000000000000000000000000..ec1cb73856aead222566f65412206ff89da779df GIT binary patch literal 66862 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 z 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 +digital. In both cases use of calibrated reference microphone is +needed. + +Preparations +************ + +The device should allow remote ssh without password for the automatic +scripts to work. Since the developers have usually their public and +private keys setup only this is needed. Find out the IP address from +ifconfig command output on your device. + +.. code-block:: bash + + ssh-copy-id -i ~/.ssh/id_rsa.pub user@aa.bb.cc.dd + +For ssh to work with low delay the development PC and tuned device +should be on the same local IP network. You can check that remote +playback works to DUT with example command: + +.. code-block:: bash + + ssh user@aa.bb.cc.dd "aplay -l" + +Since the tests are done with low-level ALSA aplay and arecord +utilities it is recommended to temporarily rename in DUT the audio +servers to disable them. Kill manually the processes or reboot to +avoid them continue running. The audio servers can be disabled from OS +system control in more elegant way but it is harder to remember how to +do it and restore to normal vs. the brute force way. + +.. code-block:: bash + + cd /usr/bin + sudo mv pulseaudio pulseaudio.disabled + sudo mv pipewire pipewire.disabled + + +Frequency response measurement +****************************** + +Note: More professional audio analyzer systems are recommended to be +used for final tuning. The procedures described in this document are +for coarse initial settings. Final tuning, especially if dependence +to regulations and standards need to be done with care in professional +environment with calibrated measurement equipment. + +To measure speakers an omnidirectional USB measurement microphone is +recommended, e.g. UMM6 [2]_ or UMIK-1 [3]_. Such microphones are +inexpensive and do not necessarily have a flat frequency response but +the manufacturers provide a serial number based downloadable +calibration file for them. The calibration can be applied to these +measurements in SOF as well by referencing the downloaded calibration +data to measurement script. + +Next step up are analog condenser measurement microphones with a +high-end USB sound card that can provide the 48V phantom voltage. But +analog microphones add more calibration consideration for analog +level. The measurement microphones can be also calibrated for absolute +level with dedicated microphone calibrators those can output into the +sealed compartment a reference 94 dBSPL tone. + +The tools for measurement and EQ design are in located in directory +$SOF_WORKSPACE/sof/tools/tune/eq. The test setup is such that the DUT +device plays back the measurement wav file via ssh commands and the +development PC connected USB microphone captures the output. To +achieve this the configuration files for playback and capture need to +be edited. + +The capture device UMM6 is hw:3.0 (card 3, device 0), this can be seen +from output of arecord command on a the development PC example. We +also know that this device supports one capture channel. + +.. code-block:: bash + + arecord -l + **** List of CAPTURE Hardware Devices **** + card 0: PCH [HDA Intel PCH], device 0: ALC257 Analog [ALC257 Analog] + Subdevices: 1/1 + Subdevice #0: subdevice #0 + card 1: Ultra [Fast Track Ultra], device 0: USB Audio [USB Audio] + Subdevices: 1/1 + Subdevice #0: subdevice #0 + card 2: Audio [ThinkPad Dock USB Audio], device 0: USB Audio [USB Audio] + Subdevices: 1/1 + Subdevice #0: subdevice #0 + card 3: UMM6 [UMM-6], device 0: USB Audio [USB Audio] + Subdevices: 1/1 + Subdevice #0: subdevice #0 + +The settings file + +.. code-block:: bash + + $ cat mls_rec_config.txt + %% Recording device configuration + + rec.ssh = 0; % Set to 1 for remote capture + rec.user = ''; % Set to user@domain for ssh + rec.dir = '/tmp'; % Directory for temporary files + rec.dev = 'hw:3,0'; % Audio capture device + rec.nch = 1; % Number audio capture channels to use + + % Use '' if calibration is not needed. Otherwise set to + % e.g. '1234567.txt'. Such calibration data format is supported for + % some reasonably priced measurement microphones. The ASCII text + % calibration data file is the measured frequency response of the used + % microphone. Lines in the beginning those start with character " are + % treated as comment. The successive lines should be + % number pairs. Their unit must be Hz and dB. + rec.cal = ''; + +Similarly check with remote aplay command the playback devices and +then edit the playback settings. + +.. code-block:: bash + + ssh user@aa.bb.cc.dd "aplay -l" + **** List of PLAYBACK Hardware Devices **** + card 0: sofglkda7219max [sof-glkda7219max], device 0: Speakers (*) [] + Subdevices: 1/1 + Subdevice #0: subdevice #0 + card 0: sofglkda7219max [sof-glkda7219max], device 1: Headset (*) [] + Subdevices: 1/1 + Subdevice #0: subdevice #0 + card 0: sofglkda7219max [sof-glkda7219max], device 5: HDMI1 (*) [] + Subdevices: 1/1 + Subdevice #0: subdevice #0 + card 0: sofglkda7219max [sof-glkda7219max], device 6: HDMI2 (*) [] + Subdevices: 1/1 + Subdevice #0: subdevice #0 + card 0: sofglkda7219max [sof-glkda7219max], device 7: HDMI3 (*) [] + Subdevices: 1/1 + Subdevice #0: subdevice #0 + +On the DUT the speakers are provided by device hw:0,0. It's known that +there's two playback channels in the device. + +.. code-block:: bash + + $ cat mls_play_config.txt + play.ssh = 1; % Set to use remote ssh commands + play.user = 'user@aa.bb.cc.dd'; % Set user@domain for ssh + play.dir = '/tmp'; % directory for temporary files + play.dev = 'hw:0,0'; % Audio device for playback + play.nch = 2; % Number of playback channels to test + +Next the measurement orientation and measurement microphone place is +considered. A notebook could be placed on top of a table symmetrically +where the measurement microphone location should be symmetrical to +display center axis. The microphone location could be near the center +of user’s ears. If the measurement microphone capture is too silent or +disturbed by ambient noise the microphone should be placed closer into +near field. + +.. figure:: Picture_speaker_meas.jpg + :width: 600 + + On-axis measurement position for bottom located speakers. + +Since this example device is a convertible type with a near 360 degree +display hinge there are several usage orientations. It was chosen to +measure the speakers from about their firing axis. Since the response +is impacted by orientation this was felt as safest choice. It also +gave the flattest looking frequency response. + +The MLS measurement tolerates some noise but the more silent the +environment is the better it is. An anechoic chamber would be ideal +naturally. The used MLS signal sets stress for the speakers so start +with a low volume setting with “alsamixer -Dhw:0”. Find the speaker +playback volume control PGA or volume controlin speaker amplifier and +start with e.g. 50%. + +Start Octave and launch the measurement + +.. code-block:: octave + + [f, m] = mls_freq_resp('DUT'); + +If the script warns about too silent audio increase the volume and/or +bring the microphone closer to the device. If the device has small +speakers and test signal playback sounds like at being near to their +capability limit, it is best to ignore the warning. The speakers may +permanently damage if the playback is too loud. + +If problems the script contains a self test for quick integrity +check. The self test measures a recursive filter that simulates a +non-flat response. The measurement and theoretical response that’s +computed directly from filter coefficients should match. + +.. code-block:: octave + + [f, m] = mls_freq_resp('selftest'); + +The test signal contains two chirps and a few times repeated +pseudo-random numbers sequence. The chirps are used to locate and +extract the MLS part. The MLS sequence has such a characteristic the +the correlation with itself is minimal. The sufficient length of the +sequence is used to suppress room reverberation from the +measurement. It provides nearly similar measured frequency responses +as achieved in anechoic conditions. As in anechoic chamber the setup +should be as much as possible like free-field. The desk/stand where +the device is measured should be away from reflecting surfaces. + +This MLS measurement would naturally also benefit from doing in +anechoic chamber since the MLS technique cannot eliminate all reverb +impact form measurement. Though usually in chambers there’s +professional equipment available like Audio Precision ® and other. If +such are available this measurement step with SOF can be avoided and +continued from next section for data import for tuning. + +.. figure:: Picture_raw_frequency_response.png + :width: 600 + + Frequency response measurement. The first channel is aligned to 0 + dB at 1 kHz. The second channel is shown with true offset + vs. first. + +After a successful measurement a plot with frequency (Hz) and +magnitude (dB) as x and y axis will be shown. The variable f will +contain the frequency response and variable m the magnitude. If the +number of measured channels was larger than 1 the m is a matrix. The +result can be saved for equalizer design into a .mat file. + +.. code-block:: octave + + save example_dut.mat f m + +Equalizer design +**************** + +It can be seen from the picture that the output of speakers is weak at +below 200 Hz. There’s two resonances, first at about 700 Hz and second +at about 5 kHz (better visible on table orientation). The response is +within -10 .. +10 dB in about 300 - 13000 Hz range. The equalization +should not be applied outside these frequencies to avoid a large loss +of SPL. It can be also seen that the left and right speaker have +slightly different frequency response. + +Next the measurement data is imported to SOF. It can be done by load +of previously saved file or importing e.g. in MS Excel format from +other equipment. The matrix columns for frequency and channel specific +levels need to be known. + +The tool in SOF is a set of functions to be used in user created +script. Therefore programming knowledge is needed. The benefit of +using script is the procedure is easy to repeat and documented by +itself. + +FIR equalizer +************* + +The finite impulse response (FIR) filter type has the advantages that +design for any finite time impulse response / frequency response is +simple and robust. The filters do not oscillate by design so the +rounding errors do not appear as noise. The rounding of coefficients +into a fixed word length only impairs slightly the response but the +effect can be usually ignored. Therefore the FIR equalizers especially +when used with 24 and 32 bit audio format are compatible with studio +like 24 bit audio quality. + +Due finite response (often limited by DSP resources) the FIR filters +are not practical for lowest frequencies unless very long filters are +used. The longer the filter is the more DSP RAM and MCPS the +processing consumes. However FIR filters are great for mid and high +frequencies equalization. The next example equalizes those frequencies +for the previously done measurement. + +The initial script for tuning is shown below. Alternatively for other +equipment the data import could be done in Excel format and use +function xlsread(); to read a matrix and then extract the frequency +and magnitude columns. + +.. code-block:: octave + + %% Load measurement data, variable f and m + load example_dut.mat; + + %% EQ settings + eq1 = eq_defaults(); % Get defaults + eq1.fs = 48e3; % Set sample rate + eq1.norm_type = 'loudness'; % Normalize criteria can be loudness/peak/1k + eq1.norm_offs_db = -3; % Offset in dB to normalize, -3dB loudness + eq1.logsmooth_plot = 1.0; % Smooth over 1.0 octaves + eq1.logsmooth_eq = 1.0; % Smooth over 1.0 octaves + eq1.enable_fir = 1; % By default both FIR and IIR disabled + eq1.fir_beta = 3.0; % Lower beta is more accurate but be careful + eq1.fir_length = 90; % Minimize this vs. fmin/fmax choice + eq1.fir_autoband = 0; % Select manually frequency limits + eq1.fmin_fir = 700; % Equalization starts from 800 Hz + eq1.fmax_fir = 13e3; % Equalization ends at 13 kHz + eq1.fir_minph = 1; % Check result carefully if 1 is used, 0 is safe + eq2 = eq1; % Copy settings to second EQ + + %% Design left channel EQ + eq1.raw_f = f; % Measurement Hz + eq1.raw_m_db = m(:,1); % Measurement dB, left ch + eq1 = eq_compute(eq1); + eq_plot(eq1, 10); + +The run of this script creates these plots. Note the choice of 1.0 +octaves smoothing for both plotting and EQ target derivation. It’s +best to start carefully with such a high amount of smoothing to avoid +to equalize highly uncertain details of frequency response. + +The smoothed version of the response becomes very flat in the +equalized version. However the simulated raw response still contains a +lot of ripple especially at high bands. It’s an industry standard to +use ⅓ octaves smoothing since it quite well matches human ear +psycho-acoustics. Therefore ⅓ octaves should be the smallest feasible +width of octaves smoothing to use. + +.. figure:: Picture_response_with_smoothing.png + :width: 600 + + Imported frequency response with and without octaves + smoothing. Note that the strong 1.0 octaves wide smoothing + “flattens” most of the narrow (high Q) resonances and leaves the + two mentioned resonances at 700 Hz and 4 kHz. + +.. figure:: Picture_FIR_right_channel_equalized.png + :width: 600 + + Simulated frequency response after equalization + +.. figure:: Picture_FIR_response.png + :width: 600 + + Frequency response of equalizer. The blue curve is the ideal + inverse response including the smoothing. The red curve is the band + limited and filter design parameters constrained actual EQ + response. The y-axis is offset in such way that 1 kHz frequency is + shifted to 0 dB. Try the impact of filter length to see how it + impacts the accuracy and find a fair compromise. + +.. figure:: Picture_FIR_response_absolute.png + :width: 600 + + Frequency response of equalizer. This curve shows the absolute gain + of the equalization. It can be seen that the normalization of + loudness (-3 dB) does some fairly high gain above 10 kHz. The + attenuation of frequencies below 200 Hz may or may not be + sufficient to give signal headroom for this boost. Need to watch + out for distortion in playback, if observed the loudness need to be + decreased. + +.. figure:: Picture_FIR_impulse_response.png + :width: 600 + + Impulse response of equalizer. The chosen minimum phase + non-symmetrical impulse response can be seen in the shape. A linear + phase response would have symmetrical pre- and post oscillation in + the impulse response. + +Add of right channel measurement import and EQ design is done by +adding these lines to above script. + + +.. code-block:: octave + + %% Design right channel EQ + eq2.raw_f = f; % Measurement Hz + eq2.raw_m_db = m(:,2); % Measurement dB, right ch + eq2 = eq_compute(eq2); + eq_plot(eq2, 20); + +The resulting EQ can be seen from these plots. If the left and right +channel results are different need to know if it is due to +non-symmetrical mechanics. If there’s designed non-symmetry it’s safe +to go ahead and design different EQ for left and right channels. If +the hardware is symmetrical then it is likely to better to equalize +e.g. average response of left and right instead. + +Note: The left and right responses are quite similar. The mechanics & +acoustics is likely symmetrical so a common EQ could be the best +choice. The average of left and right response could be suitable to +use. However in this in this case the design is done as stereo for +tutorial purpose. + +.. figure:: Picture_right_channel_response.png + :width: 600 + + Import right channel frequency response. + + +.. figure:: Picture_FIR_right_channel_equalized.png + :width: 600 + + Simulated response of equalizer. + +.. figure:: Picture_right_channel_FIR_absolute_response.png + :width: 600 + + Frequency response of the right channel filter. Notice the difference to left channel filter. + +The next step is to check the stereo EQ design. The left and right +channels should as equalized have similar loudness. Since the SOF tool +currently does not add much help to multi-channel design this step +needs some additional own code. + +.. code-block:: octave + + %% Stereo EQ + figure(30); + l_ch = eq1.m_db+eq1.fir_eq_db; + r_ch = eq2.m_db+eq2.fir_eq_db; + semilogx(eq1.f, l_ch, eq2.f, r_ch); + grid on; + axis([100 20e3 -20 10]); + xlabel('Frequency (Hz)'); + ylabel('Magnitude (dB)'); + + %% Calculate level offset at 1 - 4 kHz from RMS + idx0 = find(eq1.f < 4e3); + idx = find(eq1.f(idx0) > 1e3); + l_lev = 20*log10(sqrt(mean(10.^(l_ch(idx)/10)))); + r_lev = 20*log10(sqrt(mean(10.^(r_ch(idx)/10)))); + fprintf('L ch level %3.1f dB\n', l_lev); + fprintf('R ch level %3.1f dB\n', r_lev); + delta_lev = l_lev-r_lev; + fprintf('delta %3.1f dB\n', delta_lev); + +The plot shows the raw data plus EQ impact. Since the offset is hard +to judge from the non-smoothed plot (the smoothed data is +unfortunately for this purpose 1 kHz, 0 dB aligned) the offset is +computed from RMS level difference in 1 - 4 kHz band. In this example +the difference was 0.2 dB. The offset is next added to right channel +align. + +.. code-block:: octave + + %% Design right channel EQ + eq2.norm_offs_db = -3 + 0.2; % Offset in dB to normalize, -3dB plus L-R + eq2.raw_f = f; % Measurement Hz + eq2.raw_m_db = m(:,2); % Measurement dB, right ch + eq2 = eq_compute(eq2); + eq_plot(eq2, 20); + + +.. figure:: Picture_simulated_left_and_right_channel_responses.png + :width: 600 + + Simulated frequency responses of left and right speaker channels. + +The complete tuning script is shown below for completeness. It can be a +starting point for your own stereo speaker equalizer design case! + + +.. code-block:: octave + + %% Load measurement data, variable f and m + load example_dut.mat; + + %% EQ settings + eq1 = eq_defaults(); % Get defaults + eq1.fs = 48e3; % Set sample rate + eq1.norm_type = 'loudness'; % Normalize criteria can be loudness/peak/1k + eq1.norm_offs_db = -3; % Offset in dB to normalize, -3dB loudness + eq1.logsmooth_plot = 1.0; % Smooth over 1.0 octaves + eq1.logsmooth_eq = 1.0; % Smooth over 1.0 octaves + eq1.enable_fir = 1; % By default both FIR and IIR disabled + eq1.fir_beta = 3.0; % Lower beta is more accurate but be careful + eq1.fir_length = 90; % Minimize this vs. fmin/fmax choice + eq1.fir_autoband = 0; % Select manually frequency limits + eq1.fmin_fir = 700; % Equalization starts from 800 Hz + eq1.fmax_fir = 13e3; % Equalization ends at 20 kHz + eq1.fir_minph = 1; % Check result carefully if 1 is used, 0 is safe + eq2 = eq1; % Copy settings to second EQ + + %% Design left channel EQ + eq1.raw_f = f; % Measurement Hz + eq1.raw_m_db = m(:,1); % Measurement dB, left ch + eq1 = eq_compute(eq1); + eq_plot(eq1, 10); + + %% Design right channel EQ + eq2.norm_offs_db = -3 + 0.2; % Offset in dB to normalize, -3dB plus L-R + eq2.raw_f = f; % Measurement Hz + eq2.raw_m_db = m(:,2); % Measurement dB, right ch + eq2 = eq_compute(eq2); + eq_plot(eq2, 20); + + %% Stereo EQ + figure(30); + l_ch = eq1.m_db+eq1.fir_eq_db; + r_ch = eq2.m_db+eq2.fir_eq_db; + semilogx(eq1.f, l_ch, eq2.f, r_ch); + grid on; + axis([100 20e3 -20 10]); + xlabel('Frequency (Hz)'); + ylabel('Magnitude (dB)'); + + %% Calculate level offset at 1 - 4 kHz from RMS + idx0 = find(eq1.f < 4e3); + idx = find(eq1.f(idx0) > 1e3); + l_lev = 20*log10(sqrt(mean(10.^(l_ch(idx)/10)))); + r_lev = 20*log10(sqrt(mean(10.^(r_ch(idx)/10)))); + fprintf('L ch level %3.1f dB\n', l_lev); + fprintf('R ch level %3.1f dB\n', r_lev); + delta_lev = l_lev-r_lev; + fprintf('delta %3.1f dB\n', delta_lev); + +IIR equalizer +************* + +Infinite impulse response (IIR) filter is the other main filter type +for equalization. Here it’s described after FIR because despite the +simpler look (much lower filter orders needed) using them needs more +expertise. An IIR design can fail fatally if not used with care and +plenty of testing. Therefore it is recommended to use simple low order +filters and do the more complex response manipulation with FIR. The +risks of IIR are in stability (unwanted loud oscillation), noise, and +loss of SNR due to scaling need. However IIR filters are great for +enhancing frequency response at lowest frequencies and generally doing +stronger adjustment. + +The tool in SOF does not support automatic design. Instead the design +is manual with parametric first and second order blocks. The second +order blocks are called often bi-quads. The parametric blocks are +specified by their type (high-pass, low-pass, low-shelf, high-shelf, +peak/notch). The shelving and peaking filters are second order. The +high-pass and low-pass filters can be first or second order. Therefore +the parametric blocks are called with abbreviations HP1, HP2, LP1, +LP2, LS2, HS2, and PN2. All parametric blocks have a resonant +frequency parameter in Hz. The shelving filters and peaking filters +have also gain in Decibels as parameter. Finally the peaking filter +has a Q-value parameter. The higher the Q-value is the narrower is the +resonance. The syntax for describing parametric EQ is shown below: + +.. code-block:: octave + + eq1.peq = [ eq1.PEQ_HP2 200 0 0 ; ... + eq1.PEQ_PN2 750 -5.0 1.3 ; ... + eq1.PEQ_PN2 5000 -4.0 0.6 ; ... + ]; + + +The example can be equalized with IIR only. First, since there is very +little output from the speaker below 200 Hz we can with second order +high-pass suppress the not audible frequencies from output. It +increases the headroom for equalization a lot since typical music and +speech content has large energy there. Then, a peaking EQ is set to +attenuate the 750 Hz region by 5 dB and Q-value 1.3 for flatter +response. Finally, a peaking filter is set to attenuate the wide bump +at 5 kHz by 4 dB and Q-value 0.6. The resulting EQ is 6th order. It +also could be possible to boost the low frequencies at 400 Hz a bit +with a low-shelf but it is not done here to keep filter order +low. Boost at low frequencies creates risk for signal clipping while +the achievable bandwidth extension is not large. + +.. figure:: Picture_imported_frequency_response_for_iir.png + :width: 600 + + Simulated frequency response. The difference in parametric + low-order IIR can be seen as more remaining small ripple in the + smoothed equalized response vs. FIR. + +.. figure:: Picture_iir_filter_response_vs_ideal_target.png + :width: 600 + + IIR filter response vs. ideal target. + +.. figure:: Picture_iir_absolute_response.png + :width: 600 + + Absolute response. The loudness normalize suggests a fairly high + gain for the filter since a lot of loudness is lost due to suppress + of lowest frequencies. Need to be careful with this. + +.. figure:: Picture_iir_poles_and_zeros.png + :width: 600 + + Poles and zeros plot. In recursive filters the poles (x) need to be + inside unit circle for stable design. This plot is for 64 bit float + coefficients, fixed scaled coefficients could have issues even if + this looks OK. + +.. figure:: Picture_iir_impulse_response.png + :width: 600 + + Impulse response. The main purpose of this to do another stability + check. A stable filter decays to zero while an unstable design + might remain oscillation at steady or increasing amplitude. + +The right channel is tuned similarly. The resulting non-smoothed +left/right balance corrected responses and the complete code for +tuning are shown below. + + +.. figure:: Picture_iir_simulated_left_and_channel_responses.png + :width: 600 + + Simulated frequency responses of left and right speakers with + IIR equalizer. + + +.. code-block:: octave + + %% Load measurement data, variable f and m + load example_dut.mat; + + %% EQ settings + eq1 = eq_defaults(); % Get defaults + eq1.fs = 48e3; % Set sample rate + eq1.norm_type = 'loudness'; % Normalize criteria can be loudness/peak/1k + eq1.norm_offs_db = -3; % Offset in dB to normalize, -3 dB loudness + eq1.logsmooth_plot = 1.0; % Smooth over 1.0 octaves + eq1.logsmooth_eq = 1.0; % Smooth over 1.0 octaves + eq1.enable_iir = 1; % By default both FIR and IIR disabled + eq2 = eq1; % Copy settings to second EQ + + %% Design left channel EQ + eq1.raw_f = f; % Measurement Hz + eq1.raw_m_db = m(:,1); % Measurement dB, left ch + eq1.peq = [ eq1.PEQ_HP2 200 0 0 ; ... + eq1.PEQ_PN2 750 -5.0 1.3 ; ... + eq1.PEQ_PN2 5000 -4.0 0.6 ; ... + ]; + eq1 = eq_compute(eq1); + eq_plot(eq1, 10); + + %% Design right channel EQ + eq2.norm_offs_db = -3 + 0.1; % Offset in dB to normalize, -3dB plus L-R + eq2.raw_f = f; % Measurement Hz + eq2.raw_m_db = m(:,2); % Measurement dB, right ch + eq2.peq = [ eq2.PEQ_HP2 200 0 0 ; ... + eq2.PEQ_PN2 750 -5.0 1.4 ; ... + eq2.PEQ_PN2 4500 -4.0 0.6 ; ... + ]; + eq2 = eq_compute(eq2); + eq_plot(eq2, 20); + + %% Stereo EQ + figure(30); + l_ch = eq1.m_db+eq1.iir_eq_db; + r_ch = eq2.m_db+eq2.iir_eq_db; + semilogx(eq1.f, l_ch, eq2.f, r_ch); + grid on; + axis([100 20e3 -20 20]); + xlabel('Frequency (Hz)'); + ylabel('Magnitude (dB)'); + + %% Calculate level offset at 1 - 4 kHz from RMS + idx0 = find(eq1.f < 4e3); + idx = find(eq1.f(idx0) > 1e3); + l_lev = 20*log10(sqrt(mean(10.^(l_ch(idx)/10)))); + r_lev = 20*log10(sqrt(mean(10.^(r_ch(idx)/10)))); + fprintf('L ch level %3.1f dB\n', l_lev); + fprintf('R ch level %3.1f dB\n', r_lev); + delta_lev = l_lev-r_lev; + fprintf('delta %3.1f dB\n', delta_lev); + +Combined IIR and FIR +******************** + +The EQ tool can support use of both types simultaneously. The IIR type +is applied first and the impact is subtracted from the target. This +allows the FIR to fine tune the response where IIR could not match +fully the target. + +For this example the IIR high shelf is left out because FIR can do it +efficiently. Instead of boosting at 2 kHz this script tests +attenuation at 700 Hz to flatten and extend a bit the flat frequency +response region down. + +Note: In current version the norm_offs_db parameter impacts both FIR +and IIR part by the given amount. Therefore the level adjust need to +be entered as 0.5*adjust. + +.. figure:: Picture_IIR_FIR_target_vs_achieved_response.png + :width: 600 + + Right channel equalization filters. The red solid plot is the combined IIR and FIR response + that matches well the smoothed target response in solid blue. The dashed yellow and purple + lines show the IIR and FIR responses. + +.. figure:: Picture_simulated_IIR_FIR_frequency_response.png + :width: 600 + + Simulated raw frequency response + +Exporting coefficients to SOF +***************************** + +The coefficients can be exported into a format for m4 topology for +automatic boot time setup. The topology file can include the m4 +scripts instead of the default “flat” response coefficients. It is +also possible to set up an equalizer with .txt or .bin format blob in +device run-time with sof-ctl utility to test the response and iterate +the design. + +The complete script for equalizers tuning and coefficients export for +the previous example is shown below. + +.. code-block:: octave + + %% Load measurement data, variable f and m + load example_dut.mat; + + %% EQ settings + eq1 = eq_defaults(); % Get defaults + eq1.fs = 48e3; % Set sample rate + eq1.norm_type = 'loudness'; % Normalize criteria can be loudness/peak/1k + eq1.norm_offs_db = -3; % Offset in dB to normalize, -3dB loudness + eq1.logsmooth_plot = 1.0; % Smooth over 1.0 octaves + eq1.logsmooth_eq = 1.0; % Smooth over 1.0 octaves + eq1.enable_fir = 1; % By default both FIR and IIR disabled + eq1.enable_iir = 1; % Enable too + eq1.fir_beta = 3.0; % Lower beta is more accurate but be careful + eq1.fir_length = 40; % Minimize this vs. fmin/fmax choice + eq1.fir_autoband = 0; % Select manually frequency limits + eq1.fmin_fir = 700; % Equalization starts from 800 Hz + eq1.fmax_fir = 13e3; % Equalization ends at 13 kHz + eq1.fir_minph = 1; % Check result carefully if 1 is used, 0 is safe + eq2 = eq1; % Copy settings to second EQ + + %% Design left channel EQ + eq1.raw_f = f; % Measurement Hz + eq1.raw_m_db = m(:,1); % Measurement dB, left ch + eq1.peq = [ eq1.PEQ_HP2 200 0 0 ; ... + eq1.PEQ_PN2 750 -5.0 1.3 ; ... + ]; + eq1 = eq_compute(eq1); + eq_plot(eq1, 10); + + %% Design right channel EQ + eq2.norm_offs_db = -3 + 0.1; % Offset in dB to normalize, -4dB plus L-R + eq2.raw_f = f; % Measurement Hz + eq2.raw_m_db = m(:,2); % Measurement dB, right ch + eq2.peq = [ eq2.PEQ_HP2 200 0 0 ; ... + eq2.PEQ_PN2 750 -5.0 1.4 ; ... + ]; + eq2 = eq_compute(eq2); + eq_plot(eq2, 20); + + %% Stereo EQ + figure(30); + l_ch = eq1.m_db+eq1.tot_eq_db; + r_ch = eq2.m_db+eq2.tot_eq_db; + semilogx(eq1.f, l_ch, eq2.f, r_ch); + grid on; + axis([100 20e3 -20 10]); + xlabel('Frequency (Hz)'); + ylabel('Magnitude (dB)'); + + %% Calculate level offset at 1 - 4 kHz from RMS + idx0 = find(eq1.f < 4e3); + idx = find(eq1.f(idx0) > 1e3); + l_lev = 20*log10(sqrt(mean(10.^(l_ch(idx)/10)))); + r_lev = 20*log10(sqrt(mean(10.^(r_ch(idx)/10)))); + fprintf('L ch level %3.1f dB\n', l_lev); + fprintf('R ch level %3.1f dB\n', r_lev); + delta_lev = l_lev-r_lev; + fprintf('delta %3.1f dB\n', delta_lev); + + %% Export FIR + fir_ascii_fn = 'dut_spk_fir.txt'; + fir_tplg_fn = 'dut_spk_fir.m4'; + fir_eq1_quant = eq_fir_blob_quant(eq1.b_fir); + fir_eq2_quant = eq_fir_blob_quant(eq2.b_fir); + channels_in_config = 2; % Setup max 2 channels EQ + assign_response = [0 1]; % Switch to response #0 and #1 + num_responses = 2; % Two responses + fir_bm = eq_fir_blob_merge(channels_in_config, ... + num_responses, ... + assign_response, ... + [fir_eq1_quant fir_eq2_quant]); + fir_bp = eq_fir_blob_pack(fir_bm); + eq_alsactl_write(fir_ascii_fn, fir_bp); + eq_tplg_write(fir_tplg_fn, fir_bp, 'FIR'); + + %% Export IIR + iir_ascii_fn = 'dut_spk_iir.txt'; + iir_tplg_fn = 'dut_spk_iir.m4'; + iir_eq1_quant = eq_iir_blob_quant(eq1.p_z, eq1.p_p, eq1.p_k); + iir_eq2_quant = eq_iir_blob_quant(eq2.p_z, eq2.p_p, eq2.p_k); + iir_bm = eq_iir_blob_merge(channels_in_config, ... + num_responses, ... + assign_response, ... + [iir_eq1_quant iir_eq2_quant]); + iir_bp = eq_iir_blob_pack(iir_bm); + eq_alsactl_write(iir_ascii_fn, iir_bp); + eq_tplg_write(iir_tplg_fn, iir_bp, 'IIR'); + +Testing the response with sof-ctl +********************************* + +The sof-ctl tool is practical for testing new EQ settings and iterate +the design without need to reboot the device. The pre-requisite is that +the DUT runs for speaker path a topology that contains the IIR and FIR +equalizers. + +First the numids of the equalizers are found out with amixer +command. The lines with prompt $ are user entered commands and other +text shown is command output. + +.. code-block:: bash + + $ amixer -Dhw:0 controls | grep EQIIR + numid=66,iface=MIXER,name='EQIIR1.0 EQIIR' + + $ amixer -Dhw:0 controls | grep EQFIR + numid=67,iface=MIXER,name='EQFIR1.0 EQFIR' + +The numids are in this device 66 and 67 for IIR and FIR. Next the +exported ALSA binary controls are passed to equalizers with sof-ctl: + +.. code-block:: bash + + $ ./sof-eqctl -n 66 -s dut_spk_iir.txt + Applying configuration "dut_spk_iir.txt" into device hw:0 control numid=66. + + 4607827,0,196,50331648,0,0,0,0,196,2,2,0,0,0,0,0,1,2,2,0,0,0,0,3260252783,2107733822, + 528275171,3238416955,528275171,0,16384,3324016838,2034846530,497901563,3275128193, + 526872106,4294967293,20454,2,2,0,0,0,0,3260252783,2107733822,528275171,3238416955, + 528275171,0,16384,3317002057,2041827532,500647939,3271629404,527641448,4294967293,20551 + + Success. + + $ ./sof-eqctl -n 67 -s dut_spk_fir.txt + Applying configuration "dut_spk_fir.txt" into device hw:0 control numid=67. + + 4607827,0,244,50331648,0,0,0,0,244,131074,0,0,0,0,65536,44,0,0,0,0,3801503801,233243489, + 4293068324,74908123,1901269,7733144,6422742,4290772934,17039467,1114313,4293328827, + 4291756033,4289658785,4291297224,4293459912,589833,4294115318,4294246391,4294442989, + 1310731,13,0,44,0,0,0,0,3785054386,221118972,13436579,74515002,8520459,10551247,10944817, + 4292018112,23789790,4291559609,4293984167,4288479207,4290576265,4293394406,131047,1179673, + 4293853177,4293853167,4294901744,851980,6,0 + + Success. + + + +.. figure:: Picture_tested_speaker_frequency_response.png + :width: 600 + + The response is simple to test acoustically by re-running + mls_freq_resp(); The overall response is now much more flat and is + very similar to previously shown simulated response. + + +Using the EQ settings in topology +********************************* + +The generated .m4 suffix files for FIR and IIR can be included or +embedded into topology m4 scripts. There are a few examples of such +topologies in $SOF_WORKSPACE/sof/tools/topology/topology1/development. +The CMakeLists.txt file builds e.g. topologies +sof-cml-rt1011-rt5682-eq.tplg and sof-hda-generic-2ch-loud.tplg those +can be used as example. + +The playback pipeline is set with -DSPKPROC=eq-iir-eq-fir-volume +or -DHSPROC=eq-iir-eq-fir-volume to contain the equalizers and volume +control components. The macros -DHSPROC_FILTER1=eq_iir_coef_pass.m4 +and -DHSPROC_FILTER2=eq_fir_coef_pass.m4 are flat default responses. + +Setting -DHSPROC_FILTER1=dut_spk_iir.m4 and +-DHSPROC_FILTER2=dut_spk_fir.m4 would set the just exported equalizer +tuning to be applied at device boot. + +Note: Unfortunately the SOF topology1 equalizers definitions at top +CMakeLists.txt are not very systematic and there may be bugs with some +platforms triggered by small topology changes. The new topology needs +extensive testing for all audio endpoints (that other existing filters +are not modified) and preferably manual inspection of topology .conf +file that the m4 parsed output matches expectation. + +The development now focuses to to topology2 and hopefully this part +can be cleaned up and made easier for product audio tuning. + +References +********** + +.. [1] AES17-2020: AES standard method for digital audio engineering - Measurement of digital audio equipment, + https://www.aes.org/publications/standards/search.cfm?docID=21 + +.. [2] Dayton audio UMM-6 USB measurement microphone, + https://www.daytonaudio.com/product/1116/umm-6-usb-measurement-microphone + +.. [3] MiniDSP UMIK-1 USB measurement microphone, + https://www.minidsp.com/products/acoustic-measurement/umik-1 diff --git a/algos/index.rst b/algos/index.rst index 34776ba9..6cd9fb9c 100644 --- a/algos/index.rst +++ b/algos/index.rst @@ -37,6 +37,7 @@ Further information on specific algorithms is forthcoming. .. toctree:: :maxdepth: 1 - src/sample_rate_conversion demux/demux.rst + eq/equalizers_tuning + src/sample_rate_conversion tdfb/time_domain_fixed_beamformer From c9ace0034bd6f7d01b35ee37306c4a5ce76104b7 Mon Sep 17 00:00:00 2001 From: Michal Wasko Date: Mon, 25 Apr 2022 09:19:05 +0200 Subject: [PATCH 221/290] arch: fw: memory management based on Zephyr Memory management description, design and flows Co-authored-by: Marcin Maka Signed-off-by: Michal Wasko --- .../firmware/sof-zephyr/rtos_layer/index.rst | 1 + .../memory_management/heap_sharing.rst | 16 ++++ .../images/dynamic_module_load.pu | 77 +++++++++++++++++++ .../images/memory_allocation.pu | 21 +++++ .../memory_allocation_from_memory_driver.pu | 26 +++++++ .../images/memory_initialization.pu | 42 ++++++++++ .../images/memory_management_layers.pu | 60 +++++++++++++++ .../rtos_layer/memory_management/index.rst | 39 ++++++++++ .../memory_management_driver.rst | 21 +++++ .../memory_management_flows.rst | 41 ++++++++++ .../memory_management/memory_zones.rst | 11 +++ .../mpp_memory_management.rst | 19 +++++ 12 files changed, 374 insertions(+) create mode 100644 architectures/firmware/sof-zephyr/rtos_layer/memory_management/heap_sharing.rst create mode 100644 architectures/firmware/sof-zephyr/rtos_layer/memory_management/images/dynamic_module_load.pu create mode 100644 architectures/firmware/sof-zephyr/rtos_layer/memory_management/images/memory_allocation.pu create mode 100644 architectures/firmware/sof-zephyr/rtos_layer/memory_management/images/memory_allocation_from_memory_driver.pu create mode 100644 architectures/firmware/sof-zephyr/rtos_layer/memory_management/images/memory_initialization.pu create mode 100644 architectures/firmware/sof-zephyr/rtos_layer/memory_management/images/memory_management_layers.pu create mode 100644 architectures/firmware/sof-zephyr/rtos_layer/memory_management/index.rst create mode 100644 architectures/firmware/sof-zephyr/rtos_layer/memory_management/memory_management_driver.rst create mode 100644 architectures/firmware/sof-zephyr/rtos_layer/memory_management/memory_management_flows.rst create mode 100644 architectures/firmware/sof-zephyr/rtos_layer/memory_management/memory_zones.rst create mode 100644 architectures/firmware/sof-zephyr/rtos_layer/memory_management/mpp_memory_management.rst diff --git a/architectures/firmware/sof-zephyr/rtos_layer/index.rst b/architectures/firmware/sof-zephyr/rtos_layer/index.rst index d65b2dab..204b057a 100644 --- a/architectures/firmware/sof-zephyr/rtos_layer/index.rst +++ b/architectures/firmware/sof-zephyr/rtos_layer/index.rst @@ -11,5 +11,6 @@ workloads. :maxdepth: 1 zephyr_kernel_overview + memory_management/index power_management io_drivers/index diff --git a/architectures/firmware/sof-zephyr/rtos_layer/memory_management/heap_sharing.rst b/architectures/firmware/sof-zephyr/rtos_layer/memory_management/heap_sharing.rst new file mode 100644 index 00000000..6819c0df --- /dev/null +++ b/architectures/firmware/sof-zephyr/rtos_layer/memory_management/heap_sharing.rst @@ -0,0 +1,16 @@ +Heap sharing +############ + +The memory heap can be: + +- private - attached to one of the DSPs, +- shared - higher level memory shared across all DSP cores + +The shared memories are co-managed by all DSP cores that have access to it. + +The data structures needed to manage shared memories are initialized by primary +core, structure location in memory map is known at the build time and access to +it is controlled by mutex. + +The mutex uses atomic operation behind and all processors co-managing this +memory heap must support atomics. diff --git a/architectures/firmware/sof-zephyr/rtos_layer/memory_management/images/dynamic_module_load.pu b/architectures/firmware/sof-zephyr/rtos_layer/memory_management/images/dynamic_module_load.pu new file mode 100644 index 00000000..02c386d0 --- /dev/null +++ b/architectures/firmware/sof-zephyr/rtos_layer/memory_management/images/dynamic_module_load.pu @@ -0,0 +1,77 @@ +@startuml + +box "Host" #LightGreen + participant "Driver" as host_driver +end box + +box "Media Processing Pipelines Layer" #LightSkyBlue + participant "Component Manager" as component_manager + participant "Library Manager" as lib_manager + participant "MPP Memory Manager" as mpp_memory_manager +end box + +box "Zephyr RTOS" #LightBlue + participant "Memory Management Driver" as memory_management_driver +end box + +box "Hardware" #LightGrey + participant "Memory" as hw_memory +end box + +host_driver -> lib_manager: Load Library + activate lib_manager + lib_manager -> mpp_memory_manager: rmalloc(MEM_ZONE_RUNTIME, flags=NULL, MEM_CAPS_LOADABLE_LIBRARY, size) + activate mpp_memory_manager + return address to store library + lib_manager --> host_driver + deactivate lib_manager + +host_driver -> lib_manager: Transfer library over DMA\nto given address + +host_driver -> component_manager: Instantiate Component + activate component_manager + + opt if Component is Loadable and it is first instance + component_manager -> lib_manager: Load component + activate lib_manager + + loop repeat for Component TEXT, RODATA + lib_manager -> lib_manager: read Component virtual address and size from manifest + + lib_manager -> memory_management_driver: sys_mm_drv_map_region(virt*, phys=NULL, size, flags=NULL) + activate memory_management_driver + memory_management_driver -> memory_management_driver: allocate free phys pages + opt power up memory banks for allocated phys pages + memory_management_driver -> hw_memory: power up memory banks + end + memory_management_driver --> lib_manager + deactivate memory_management_driver + + lib_manager -> lib_manager: read Component address offset from library manifest + lib_manager -> lib_manager: mem_copy(virt*, library_store_addr + offset, size) + lib_manager -> memory_management_driver: sys_mm_drv_update_region(virt*, size, flags= CODE / RODATA) + activate memory_management_driver + note right: update region flags to prevent overwrite + return + + end + + opt if Component has BSS + lib_manager -> memory_management_driver: sys_mm_drv_map_region(virt*, phys=NULL, bss_size, flags) + activate memory_management_driver + memory_management_driver -> memory_management_driver: allocate free phys pages + opt power up memory banks for allocated phys pages + memory_management_driver -> hw_memory: power up memory banks + end + memory_management_driver --> lib_manager + deactivate memory_management_driver + end + + lib_manager --> component_manager + deactivate lib_manager + end + + component_manager -> component_manager: Instantiate Component + component_manager --> host_driver + +@enduml diff --git a/architectures/firmware/sof-zephyr/rtos_layer/memory_management/images/memory_allocation.pu b/architectures/firmware/sof-zephyr/rtos_layer/memory_management/images/memory_allocation.pu new file mode 100644 index 00000000..82d84bf0 --- /dev/null +++ b/architectures/firmware/sof-zephyr/rtos_layer/memory_management/images/memory_allocation.pu @@ -0,0 +1,21 @@ +@startuml + +box "SOF" #LightBlue + participant "Component Management" as component_management + participant "MPP Memory Manager" as mpp_memory_manager +end box + +box "Zephyr" #LightGreen + participant "Zephyr Memory Manager" as zephyr_memory_manager +end box + +activate component_management +component_management -> mpp_memory_manager: rmalloc(mem_zone, flags, caps, size) + activate mpp_memory_manager + + mpp_memory_manager -> mpp_memory_manager: find memory heap that\nmatch zone and caps + mpp_memory_manager -> zephyr_memory_manager: k_heap_alloc (heap, size) + activate zephyr_memory_manager + return + mpp_memory_manager --> component_management +@enduml diff --git a/architectures/firmware/sof-zephyr/rtos_layer/memory_management/images/memory_allocation_from_memory_driver.pu b/architectures/firmware/sof-zephyr/rtos_layer/memory_management/images/memory_allocation_from_memory_driver.pu new file mode 100644 index 00000000..a9d10fd7 --- /dev/null +++ b/architectures/firmware/sof-zephyr/rtos_layer/memory_management/images/memory_allocation_from_memory_driver.pu @@ -0,0 +1,26 @@ +@startuml + +box "SOF" #LightBlue + participant "Library Manager" as library_manager +end box + +box "Zephyr" #LightGreen + participant "Memory Management Driver" as memory_management_driver +end box + +box "Hardware" #LightGrey + participant "Memory" as hw_memory +end box + +activate library_manager + +library_manager -> memory_management_driver: sys_mm_drv_map_region\n(virt*, phys=NULL, size, flags) + activate memory_management_driver + memory_management_driver -> memory_management_driver: allocate memory phys pages + opt if phys memory pages require power up + memory_management_driver -> hw_memory: power up memory banks + end + + return + +@enduml diff --git a/architectures/firmware/sof-zephyr/rtos_layer/memory_management/images/memory_initialization.pu b/architectures/firmware/sof-zephyr/rtos_layer/memory_management/images/memory_initialization.pu new file mode 100644 index 00000000..666e68b1 --- /dev/null +++ b/architectures/firmware/sof-zephyr/rtos_layer/memory_management/images/memory_initialization.pu @@ -0,0 +1,42 @@ +@startuml + +box "SOF" #LightBlue + participant "MPP Memory Manager" as mpp_memory_manager +end box + +box "Zephyr" #LightGreen + participant "Memory Manager" as zephyr_memory_manager + participant "Memory Management Driver" as memory_management_driver +end box + +box "Hardware" #LightGrey + participant "Memory" as hw_memory +end box + + +-> memory_management_driver: sys_mm_drv_mm_init + activate memory_management_driver + memory_management_driver -> memory_management_driver: read unused_main_mem_start_marker\nfrom linker + note right: The marker is used to\n identify where base firmware\n ends in memory (text, data, bss) + + memory_management_driver -> memory_management_driver: sys_mm_drv_unmap_region(unused_main_mem_start, unused_size) + activate memory_management_driver + opt If architecture support granular memory banks power control + memory_management_driver -> hw_memory: power down unused memory banks + deactivate memory_management_driver + end + + deactivate memory_management_driver + +-> mpp_memory_manager: mpp_mem_init + activate mpp_memory_manager + mpp_memory_manager -> mpp_memory_manager: read memory zones\nbase address and size + loop for each memory region create heap + mpp_memory_manager -> zephyr_memory_manager: k_heap_init\n(heap, mem*, size) + activate zephyr_memory_manager + return + end + + deactivate mpp_memory_manager + +@enduml diff --git a/architectures/firmware/sof-zephyr/rtos_layer/memory_management/images/memory_management_layers.pu b/architectures/firmware/sof-zephyr/rtos_layer/memory_management/images/memory_management_layers.pu new file mode 100644 index 00000000..a2218c96 --- /dev/null +++ b/architectures/firmware/sof-zephyr/rtos_layer/memory_management/images/memory_management_layers.pu @@ -0,0 +1,60 @@ +@startuml + +allowmixing + +scale max 1024 width + +component SOF { + + package "Zephyr" as ZEPHYR_RTOS { + interface "Zephyr Memory Service interface" as ZMSI + hide ZMSI methods + hide ZMSI attributes + + package "Drivers" as DRIVERS { + component "Memory Management Driver" as MEMORY_MGMT_DRIVER + } + + package "Memory Manager" as ZEPHYR_MEM_MANAGER { + component "Multi Heap" as MULTI_HEAP + component "Memory Heaps" as MEM_HEAPS + component "Memory Blocks Allocator" as MEM_BLOCK_ALLOCATOR + component "Demand Paging" as DEMAND_PAGING + + MULTI_HEAP .[hidden]right. MEM_HEAPS + MEM_HEAPS .[hidden]right. MEM_BLOCK_ALLOCATOR + MEM_BLOCK_ALLOCATOR .[hidden]right. DEMAND_PAGING + } + + component "Device Tree" as DEV_TREE + + ZMSI -[hidden]down- MEM_BLOCK_ALLOCATOR + ZEPHYR_MEM_MANAGER -[hidden]down- DRIVERS + DRIVERS -[hidden]right- DEV_TREE + } + + package "Media Processing Pipelines layer" as MPP_LAYER { + component "Pipeline Manager" as PIPELINE_MANAGER + component "Communication" as COMMUNICATION + component "Component Manager" as COMPONENT_MANAGER + component "MPP Memory Manager" as MPP_MEM_MANAGER + + PIPELINE_MANAGER -[hidden]right- COMMUNICATION + COMMUNICATION -[hidden]right- MPP_MEM_MANAGER + MPP_MEM_MANAGER -[hidden]right- COMPONENT_MANAGER + + } + + package "Application layer" as APP_LAYER { + component "Loadable Components" as LOADABLE_COMPONENTS + component "Built-in Components" as BUILT_IN_COMPONENTS + + BUILT_IN_COMPONENTS -[hidden]right- LOADABLE_COMPONENTS + } + + APP_LAYER -[hidden]down- MPP_LAYER + MPP_LAYER -[hidden]down- ZEPHYR_RTOS + +} + +@enduml diff --git a/architectures/firmware/sof-zephyr/rtos_layer/memory_management/index.rst b/architectures/firmware/sof-zephyr/rtos_layer/memory_management/index.rst new file mode 100644 index 00000000..c658ee02 --- /dev/null +++ b/architectures/firmware/sof-zephyr/rtos_layer/memory_management/index.rst @@ -0,0 +1,39 @@ +.. _memory_mgmt: + +Memory Management +################# + +Memory Management role is to provide service API for dynamic memory mapping and +allocation from available memory zones. + +Overview +******** + +The memory support functionality is delivered at two levels: + + - `Zephyr Memory Management Service `__, + + - `Memory Blocks Allocator `__, + - `Memory Management driver `__, + - `Heaps Management `__, + - `Demand Paging `__, + + - MPP Memory Management - SOF extension, + + - Memory Heaps initialization for supported memory zones, + - Memory allocation from selectable memory zones, + +.. uml:: images/memory_management_layers.pu + :caption: Example of Memory Management layers and interfaces + +Read More +********* + +.. toctree:: + :maxdepth: 1 + + memory_zones + mpp_memory_management + heap_sharing + memory_management_driver + memory_management_flows diff --git a/architectures/firmware/sof-zephyr/rtos_layer/memory_management/memory_management_driver.rst b/architectures/firmware/sof-zephyr/rtos_layer/memory_management/memory_management_driver.rst new file mode 100644 index 00000000..097c450f --- /dev/null +++ b/architectures/firmware/sof-zephyr/rtos_layer/memory_management/memory_management_driver.rst @@ -0,0 +1,21 @@ +Memory Management Driver +######################## + +The Memory Management Driver (MMD) is part of the Zephyr distributed drivers. +Each SoC may require unique Memory Management driver implementation. The MMD +shall implement common MMD interface that is exposed to kernel services. This +allows for explicit allocation and mapping of individual memory hardware pages +within the physical environment. + +All operations within Memory Management Driver are explicit. Hardware page IDs +represent real physical blocks of hardware memory. + +The MMD is responsible for identification what part of the SoC memory is used by +the base firmware (code, data, bss) and unmap the unused blocks. The unused +memory will be available for dynamic allocation. Base firmware code, read only +data and BSS are mapped in the TLB automatically with corresponding flags (CODE, +RODATA) to prevent incidental modification. + +Memory Management Driver can maintain memory power at a granular level if the +architecture support it. It has possibility to power up selected memory banks on +map requests and power down on unmap, which is a recommended flow. diff --git a/architectures/firmware/sof-zephyr/rtos_layer/memory_management/memory_management_flows.rst b/architectures/firmware/sof-zephyr/rtos_layer/memory_management/memory_management_flows.rst new file mode 100644 index 00000000..aa90ebb2 --- /dev/null +++ b/architectures/firmware/sof-zephyr/rtos_layer/memory_management/memory_management_flows.rst @@ -0,0 +1,41 @@ +Flows +##### + +Memory initialization +********************* + +Main goal of Memory initialization is to unmap unused memory after firmware load +and create heaps for supported memory zones. + +.. uml:: images/memory_initialization.pu + :caption: Memory initialization flow + +Memory allocation +***************** + +The common memory allocation is expected to use one of the available memory +zones via Zephyr Heap that was created during initialization. + +.. uml:: images/memory_allocation.pu + :caption: Memory allocation example flow + +Memory allocation directly using Memory Management Driver +********************************************************* + +In specific use cases (e.g. Dynamic Component Load) it may be required to +allocate memory directly using Memory Management Driver to control what virtual +address will be mapped to physical memory. + +.. uml:: images/memory_allocation_from_memory_driver.pu + :caption: Example memory allocation using Memory Management Driver + +Dynamic Component Load +********************** + +The loadable components are stored in Loadable Library memory zone and can be +loaded on instantiate request to System memory. The components load to System +memory is optional and integrator can indicate if the components can be executed +directly from the Loadable Library memory zone. + +.. uml:: images/dynamic_module_load.pu + :caption: Dynamic component load and instantiation flow diff --git a/architectures/firmware/sof-zephyr/rtos_layer/memory_management/memory_zones.rst b/architectures/firmware/sof-zephyr/rtos_layer/memory_management/memory_zones.rst new file mode 100644 index 00000000..5be17be8 --- /dev/null +++ b/architectures/firmware/sof-zephyr/rtos_layer/memory_management/memory_zones.rst @@ -0,0 +1,11 @@ +Memory Zones +############ + +Depending on the memory use case a different memory zone can be used for +allocation. Application and MPP layer components are using memory zones and +capabilities to identify a target memory. The memory zones mapping on physical +addresses is SoC specific. If the SoC support multiple memory types with +different characteristics, then it is up to SoC integrator to decide which +memory will be most suitable for zone mapping. For example, if SoC has access to +slow but large capacity memory then it can map it for Loadable Library memory +zone. diff --git a/architectures/firmware/sof-zephyr/rtos_layer/memory_management/mpp_memory_management.rst b/architectures/firmware/sof-zephyr/rtos_layer/memory_management/mpp_memory_management.rst new file mode 100644 index 00000000..2f079186 --- /dev/null +++ b/architectures/firmware/sof-zephyr/rtos_layer/memory_management/mpp_memory_management.rst @@ -0,0 +1,19 @@ +MPP Memory Management +##################### + +MPP Memory Management (MPP MM) is a SOF extension running on top of Zephyr +Memory Manager. The reason to create MPP MM was to add support for memory zones, +which are not natively supported by Zephyr. Zephyr by default initialize single +System Heap. + +The MPP MM roles: + + - initialization of Memory Heaps for supported memory zones, + - provide allocator API for memory allocation from different memory zones, + +Memory Heaps initialization is done based on SoC Memory Map that identify start +and end addresses of memory zones. + +.. note:: + Memory zones are expected to be defined as memory sections in a SoC linker script. + From 7be4c54a8b3cc6039572f34e507e1b5df328d1b5 Mon Sep 17 00:00:00 2001 From: Marcin Maka Date: Thu, 20 Oct 2022 12:07:53 +0200 Subject: [PATCH 222/290] arch: fw: add heap sharing concept Signed-off-by: Marcin Maka --- .../memory_management/heap_sharing.rst | 52 +++++++++++++++++-- .../memory_management/images/heaps.pu | 31 +++++++++++ 2 files changed, 78 insertions(+), 5 deletions(-) create mode 100644 architectures/firmware/sof-zephyr/rtos_layer/memory_management/images/heaps.pu diff --git a/architectures/firmware/sof-zephyr/rtos_layer/memory_management/heap_sharing.rst b/architectures/firmware/sof-zephyr/rtos_layer/memory_management/heap_sharing.rst index 6819c0df..1b7d0347 100644 --- a/architectures/firmware/sof-zephyr/rtos_layer/memory_management/heap_sharing.rst +++ b/architectures/firmware/sof-zephyr/rtos_layer/memory_management/heap_sharing.rst @@ -3,14 +3,56 @@ Heap sharing The memory heap can be: -- private - attached to one of the DSPs, +- local - used exclusively by a single DSP core, - shared - higher level memory shared across all DSP cores -The shared memories are co-managed by all DSP cores that have access to it. +.. uml:: images/heaps.pu + :caption: Memory Heaps -The data structures needed to manage shared memories are initialized by primary -core, structure location in memory map is known at the build time and access to -it is controlled by mutex. +.. note:: Introduction of MMU will require a separate local application heap per + isolated domain. + +L1 Cache Coherency +****************** + +NOTE: This section applies to Intel systems without L1 cache coherency + +A local heap is used exclusively by a single DSP core. Therefore operations on +the allocated memory buffers do not require explicit L1 cache operations nor +data cache alignment. + +All operations performed on a local heap can be executed by the associated DSP +core only. The *move-to-another-core* operation is not permitted for allocated +buffers. + +A shared heap can be configured in two ways: + +1. To provide uncache aliases of buffer addresses to the clients, +2. To provide cacheable addresses to the clients. + +Option #1 is preferred, since does not require explicit L1 cache operations +when memory is accessed by a DSP core. However, all operations directly access +L2+ memory therefore it is not suitable for a low latency high performance data +processing case. + +Option #2 provides better performance but requires explicit L1 cache operations, +which are difficult to maintain and validate, as well as data cache alignment +for both client buffers and their descriptors, which creates an overhead. This +configuration should be avoided if possible unless a coherent API is available +to share the data. + +However, a one important exception to the shared memory accessed through uncached +alias is a data buffer connected between processing components running on +different cores. Locking and cache operations price could be payed to get much +better performance of accessing the data in the buffer which may be a +significant part of light weight LL processing modules DSP cycle budget. + +Accessing Shared Memory Pool +**************************** + +The data structures needed to manage shared memories are initialized by the +primary core, structure location in memory map is known at the build time and +API is protected by the mutex. The mutex uses atomic operation behind and all processors co-managing this memory heap must support atomics. diff --git a/architectures/firmware/sof-zephyr/rtos_layer/memory_management/images/heaps.pu b/architectures/firmware/sof-zephyr/rtos_layer/memory_management/images/heaps.pu new file mode 100644 index 00000000..582b21bd --- /dev/null +++ b/architectures/firmware/sof-zephyr/rtos_layer/memory_management/images/heaps.pu @@ -0,0 +1,31 @@ +scale max 1024 width + +node "DSP Core #0 Memory Block" as core_0 { + node "Application Heap (local)" as app_0 #lightgreen { + component "Pipelines @Core #0" as ppl_0 + component "LL Modules & Tasks @Core #0" as ll_0 + component "DP Modules & Tasks @Core #0" as dp_0 + } + + node "Application Heap (shared)" as app_shared_0 #lightyellow { + component "Shared buffers" + } + + node "System Heap (shared)" as sys_0 #lightblue { + component "Devices" + } +} + +ppl_0 -[hidden]down-> ll_0 +ll_0 -[hidden]down-> dp_0 + +node "DSP Core #1 Memory Block" as core_1 { + node "Application Heap (local)" as app_1 #lightgreen { + component "Pipelines @Core #1" as ppl_1 + component "LL Modules & Tasks @Core #1" as ll_1 + component "DP Modules & Tasks @Core #1" as dp_1 + } +} + +ppl_1 -[hidden]down-> ll_1 +ll_1 -[hidden]down-> dp_1 From 50c03ea6ffc16b2b7fc8d4e9da09d6dd663ca0ae Mon Sep 17 00:00:00 2001 From: Pierre-Louis Bossart Date: Tue, 7 Feb 2023 14:35:44 -0600 Subject: [PATCH 223/290] getting_started: add information and links for HDAudio command snooping Add information provided by end-users who reversed-engineered the Windows audio driver configuration. Link: https://github.com/thesofproject/linux/issues/4176 Signed-off-by: Pierre-Louis Bossart --- getting_started/intel_debug/suggestions.rst | 41 +++++++++++++++------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/getting_started/intel_debug/suggestions.rst b/getting_started/intel_debug/suggestions.rst index 68541bc7..6c36a6b5 100644 --- a/getting_started/intel_debug/suggestions.rst +++ b/getting_started/intel_debug/suggestions.rst @@ -22,24 +22,41 @@ snd-intel-dspcfg dsp_driver=1" to ``/etc/modprobe.d/alsa-base.conf``. If no sound can be heard and jack detection is not functional, an HDaudio external codec configuration is likely. In some cases, the Linux drivers are missing configuration information and may only -enable two of the four speakers present. All of these cases are orthogonal -to SOF issues in that the SOF driver cannot compensate for codec driver -problems on its own. +enable two of the four speakers present. + +All of these cases are orthogonal to SOF issues in that the SOF driver +cannot compensate for codec driver problems on its own. The HDaudio +codec configuration is handled by the legacy HDAudio driver +(snd-hda-intel), which is not maintained directly by SOF developers. Try booting into Windows first, then reboot into Linux ****************************************************** -On some platforms, such as with an HDaudio codec connected to amplifiers -over an I2C/I2S link, the codec driver needs to perform a set of -amplifier configurations. This is often handled in Windows but not in -Linux codec drivers. A classic example of such issues is when +On some platforms, such as with an HDaudio codec connected to +amplifiers over an I2C/I2S link, the codec driver needs to perform a +set of amplifier configurations. This is often handled in Windows but +not in Linux codec drivers. A classic example of such issues is when headphone playback works, but speaker playback does not (or not on all -speakers). +speakers). Booting first in Windows then rebooting in Linux may help +setup the right configuration, but additional work is needed to patch +the Linux kernel. + +Reverse-engineer the Windows audio driver +***************************************** + +The HDaudio driver configures the codec with 'verb' commands to +e.g. setup the 'pins' or a coefficient. The exact values used are +device-specific, and in the absence of any documentation from the +codec vendor need to be reverse-engineered by snooping HDAudio +commands in a Windows environment. + +The following links provide additional information on snooping the +commands and determining what needs to be added to the Linux +kernel. These links are not maintained by SOF developers. + +* `ASUS Linux blog `_ -These types of issues also occur with the HDaudio legacy driver -and are not part of SOF bugs proper. To fix such issues, either obtain -direct support from the codec vendor, or reverse-engineer the missing -configuration by snooping HDaudio commands in a Windows environment. +* `How to sniff verbs from a Windows sound driver `_ Make sure the ME is enabled *************************** From c0a2a285c43d2f5bfe764806f6f6ef33652c4ea3 Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Thu, 16 Mar 2023 15:20:44 +0200 Subject: [PATCH 224/290] getting_started: intel_debug: Update the sof-dyndbg.conf example The current version is outdated, update it to align with what we use +p to +pmf for example. Signed-off-by: Peter Ujfalusi --- getting_started/intel_debug/suggestions.rst | 58 +++++++++++++++------ 1 file changed, 41 insertions(+), 17 deletions(-) diff --git a/getting_started/intel_debug/suggestions.rst b/getting_started/intel_debug/suggestions.rst index 6c36a6b5..7e9d2d2e 100644 --- a/getting_started/intel_debug/suggestions.rst +++ b/getting_started/intel_debug/suggestions.rst @@ -114,23 +114,47 @@ file: .. code-block:: cfg - options snd_sof_intel_byt dyndbg=+p - options snd_sof_intel_bdw dyndbg=+p - options snd_sof_intel_ipc dyndbg=+p - options snd_sof_intel_hda_common dyndbg=+p - options snd_sof_intel_hda dyndbg=+p - options snd_sof dyndbg=+p - options snd_sof_pci dyndbg=+p - options snd_sof_acpi dyndbg=+p - options snd_sof_of dyndbg=+p - options snd_sof_nocodec dyndbg=+p - options soundwire_bus dyndbg=+p - options soundwire_generic_allocation dyndbg=+p - options soundwire_cadence dyndbg=+p - options soundwire_intel_init dyndbg=+p - options soundwire_intel dyndbg=+p - options snd_soc_skl_hda_dsp dyndbg=+p - options snd_intel_dspcfg dyndbg=+p + # ACPI + options snd_sof_acpi dyndbg=+pmf + options snd_sof_acpi_intel_byt dyndbg=+pmf + options snd_sof_acpi_intel_bdw dyndbg=+pmf + options snd_sof_intel_byt dyndbg=+pmf + options snd_sof_intel_bdw dyndbg=+pmf + + # PCI + options snd_sof_pci dyndbg=+pmf + options snd_sof_pci_intel_apl dyndbg=+pmf + options snd_sof_pci_intel_cnl dyndbg=+pmf + options snd_sof_pci_intel_icl dyndbg=+pmf + options snd_sof_pci_intel_tgl dyndbg=+pmf + options snd_sof_pci_intel_mtl dyndbg=+pmf + options snd_sof_pci_intel_lnl dyndbg=+pmf + + # DSP selection + options snd_intel_dspcfg dyndbg=+pmf + options snd_intel_sdw_acpi dyndbg=+pmf + + # SOF internals + options snd_sof_intel_ipc dyndbg=+pmf + options snd_sof_intel_hda_common dyndbg=+pmf + options snd_sof_intel_hda_mlink dyndbg=+pmf + options snd_sof_intel_hda dyndbg=+pmf + options snd_sof dyndbg=+pmf + options snd_sof_nocodec dyndbg=+pmf + + # HDA + options snd_hda_intel dyndbg=+pmf + options snd-hda-codec-realtek dyndbg=+pmf + options snd-hda-codec-generic dyndbg=+pmf + options snd-hda-codec-hdmi dyndbg=+pmf + options snd-hda-codec dyndbg=+pmf + + # SoundWire core + options soundwire_bus dyndbg=+pmf + options soundwire_generic_allocation dyndbg=+pmf + options soundwire_cadence dyndbg=+pmf + options soundwire_intel_init dyndbg=+pmf + options soundwire_intel dyndbg=+pmf Note that this list is only an example. From b0d207a3d26e43522891fb51c7d9f0fda0355e44 Mon Sep 17 00:00:00 2001 From: Marcin Maka Date: Wed, 29 Mar 2023 11:00:02 +0200 Subject: [PATCH 225/290] arch: fw: cleanup links in memory management overview Initial description was unbalanced. One section contained links while the other had the links moved to the Read More section below the diagram. Now all the links are moved to the Read More. External links are annotated to let the reader know that opening results in move to another website. Signed-off-by: Marcin Maka --- .../rtos_layer/memory_management/index.rst | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/architectures/firmware/sof-zephyr/rtos_layer/memory_management/index.rst b/architectures/firmware/sof-zephyr/rtos_layer/memory_management/index.rst index c658ee02..68d4e180 100644 --- a/architectures/firmware/sof-zephyr/rtos_layer/memory_management/index.rst +++ b/architectures/firmware/sof-zephyr/rtos_layer/memory_management/index.rst @@ -11,17 +11,12 @@ Overview The memory support functionality is delivered at two levels: - - `Zephyr Memory Management Service `__, + - Zephyr Memory Management Service, which provides memory drivers, demand + paging, allocators, and heap management, - - `Memory Blocks Allocator `__, - - `Memory Management driver `__, - - `Heaps Management `__, - - `Demand Paging `__, - - - MPP Memory Management - SOF extension, - - - Memory Heaps initialization for supported memory zones, - - Memory allocation from selectable memory zones, + - MPP Memory Management - SOF extension, which provides heaps for virtual + memory mapped to physical memory on demand, and declaration of SOF specific + heaps instantiated for various memory zones, .. uml:: images/memory_management_layers.pu :caption: Example of Memory Management layers and interfaces @@ -37,3 +32,12 @@ Read More heap_sharing memory_management_driver memory_management_flows + +External Links +============== + +- `Zephyr Memory Management Service `__ +- `Memory Blocks Allocator `__ +- `Memory Management driver `__ +- `Heaps Management `__ +- `Demand Paging `__ From 4b8367202687adc72068811aa3396e4fbf698a0a Mon Sep 17 00:00:00 2001 From: Deb Taylor Date: Thu, 30 Mar 2023 17:51:06 -0400 Subject: [PATCH 226/290] Release 250 (#459) * add yaml file updates Signed-off-by: Deb * Update Release to 2.5.0 Signed-off-by: Deb --------- Signed-off-by: Deb --- release.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release.rst b/release.rst index 8c971457..72fed3a1 100755 --- a/release.rst +++ b/release.rst @@ -26,7 +26,7 @@ kernel, and documentation. Download the source code as a zip or tar.gz file: Source and Binary Releases -------------------------- -The latest SOF release is v2.4.1 (Jan 2023). +The latest SOF release is v2.5.5 (Mar 2023). View new feature information and release downloads for the latest and previous releases on GitHub. Firmware and SDK tool source code and binary From 1be34ee3b9711fba910956664538173caa693944 Mon Sep 17 00:00:00 2001 From: Deb Taylor Date: Thu, 30 Mar 2023 18:03:58 -0400 Subject: [PATCH 227/290] Rel250 (#460) * add yaml file updates Signed-off-by: Deb * Fix release mistake-2.5.0 instead of 2.5.5 Signed-off-by: Deb --------- Signed-off-by: Deb --- release.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release.rst b/release.rst index 72fed3a1..837838c3 100755 --- a/release.rst +++ b/release.rst @@ -26,7 +26,7 @@ kernel, and documentation. Download the source code as a zip or tar.gz file: Source and Binary Releases -------------------------- -The latest SOF release is v2.5.5 (Mar 2023). +The latest SOF release is v2.5.0 (Mar 2023). View new feature information and release downloads for the latest and previous releases on GitHub. Firmware and SDK tool source code and binary From f9b33e9af7cf67a198c423d8f5cfb568a2748895 Mon Sep 17 00:00:00 2001 From: Chunxu Li Date: Fri, 14 Apr 2023 14:32:29 +0800 Subject: [PATCH 228/290] Supported Platforms: add mt8186 mediatek platform information Add mt8186 mediatek platform information to the table. Included clock, memory and audio controller instances to the table Signed-off-by: Chunxu Li --- platforms/index.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/platforms/index.rst b/platforms/index.rst index 9d80e0f7..5a9a302c 100644 --- a/platforms/index.rst +++ b/platforms/index.rst @@ -31,6 +31,7 @@ Platform and board specific support is continually added to the SOF project as d "AMD Renoir", "Xtensa HiFi3", "1 @ 200-600MHz", "TBD", "20 KB LP SRAM / 1152 KB IRAM/DRAM", "1 x SP (I2S, PCM), 1 x BT (I2S, PCM), DMIC" "AMD Rembrandt", "Xtensa HiFi5", "1 @ 200-800MHz", "TBD", "1.75 MB HP SRAM / 512 KB IRAM/DRAM", "1 x SP (I2S, PCM), 1 x BT (I2S, PCM), 1 x HS(I2S, PCM), DMIC" "Mediatek mt8195", "Xtensa HiFi4", "1 @ 220 - 720MHz", "TBD", "256 KB SRAM / 16 MB DRAM", "2 x TDM Out, 1 x TDM In, DMIC" + "Mediatek mt8186", "Xtensa HiFi5", "1 @ 300 - 800MHz", "TBD", "512 KB SRAM / DRAM", "2 x I2S Out, 1 x I2S In, DMIC" When support for a new platform is being added, certain interfaces required by SOF infrastructure must be implemented. Refer to Platform API documentation From ca78c57a4c9087a0190aa8db9375f1e894967948 Mon Sep 17 00:00:00 2001 From: Jason Chen Date: Fri, 21 Apr 2023 14:09:12 +0800 Subject: [PATCH 229/290] Supported Platforms: add mt8188 mediatek platform information Add mt8188 mediatek platform information to the table. Included clock, memory and audio controller instances to the table Signed-off-by: Jason Chen --- platforms/index.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/platforms/index.rst b/platforms/index.rst index 5a9a302c..57930c4a 100644 --- a/platforms/index.rst +++ b/platforms/index.rst @@ -32,6 +32,7 @@ Platform and board specific support is continually added to the SOF project as d "AMD Rembrandt", "Xtensa HiFi5", "1 @ 200-800MHz", "TBD", "1.75 MB HP SRAM / 512 KB IRAM/DRAM", "1 x SP (I2S, PCM), 1 x BT (I2S, PCM), 1 x HS(I2S, PCM), DMIC" "Mediatek mt8195", "Xtensa HiFi4", "1 @ 220 - 720MHz", "TBD", "256 KB SRAM / 16 MB DRAM", "2 x TDM Out, 1 x TDM In, DMIC" "Mediatek mt8186", "Xtensa HiFi5", "1 @ 300 - 800MHz", "TBD", "512 KB SRAM / DRAM", "2 x I2S Out, 1 x I2S In, DMIC" + "Mediatek mt8188", "Xtensa HiFi5", "1 @ 26 - 800MHz", "TBD", "512 KB SRAM / 17 MB DRAM", "2 x TDM Out, 1 x TDM In, DMIC" When support for a new platform is being added, certain interfaces required by SOF infrastructure must be implemented. Refer to Platform API documentation From c8abaf2f4e0c117436a29e8d36be80f54da85403 Mon Sep 17 00:00:00 2001 From: Michal Wasko Date: Tue, 25 Apr 2023 11:03:22 +0200 Subject: [PATCH 230/290] docbuild: docker support Docker image and build script added Signed-off-by: Michal Wasko --- contribute/process/docbuild.rst | 34 ++++++++++++++++- scripts/docker_build/Dockerfile | 56 ++++++++++++++++++++++++++++ scripts/docker_build/docker-build.sh | 34 +++++++++++++++++ 3 files changed, 123 insertions(+), 1 deletion(-) create mode 100644 scripts/docker_build/Dockerfile create mode 100644 scripts/docker_build/docker-build.sh diff --git a/contribute/process/docbuild.rst b/contribute/process/docbuild.rst index 43f4998b..f1dd8f91 100644 --- a/contribute/process/docbuild.rst +++ b/contribute/process/docbuild.rst @@ -124,6 +124,11 @@ creating drawings: drawing syntax into an image. You need to have a Java runtime environment (JRE) installed when generating documentation. +There is a sof-docs Docker image recipe that can be used as an alternative to +installing the documentation tools on local OS. If you choose to use Docker then +please skip the tools installation steps and go directly to +:ref:`run_documentation_processors` + Depending on your Linux version, install the following tools: * For Ubuntu use: @@ -202,13 +207,18 @@ another ``make html`` and the output layout and style is changed. The ``read-the-docs`` theme is installed as part of the ``requirements.txt`` list above. +.. _run_documentation_processors: + Run documentation processors **************************** The sof-docs directory contains all the .rst source files, extra tools, and Makefile for generating a local copy of the SOF technical documentation. -* Generate the HTML output by using the following commands: +You can generate the HTML documentation by using local build tools (1) or by +Docker image (2) + +1. Generate the HTML output by using the following commands (**local build**): .. code-block:: bash @@ -228,6 +238,28 @@ If your changes are not related to any UML diagram, you can build more than 10 times faster from scratch by temporarily changing the ``plantuml_output_format`` line in :git-sof-docs-mainline:`conf.py`. +2. Generate the HTML output by using the following commands (**Docker build**): + + .. code-block:: bash + + cd thesofproject + # Build both sof (Doxygen) and sof-docs UML and reStruredText + ./sof-docs/scripts/docker_build/docker-build.sh + +The docker build script will copy the sof and sof-docs source code from host +working directory to image, build the documentation and when completed copy back +output to the host (./sof-docs/_build) + +The first docker build run will take more time due to image creation and +installation of all the necessary build tools. Each next build is much faster +and can additionally be speed up by selecting only sof-docs to build: + + .. code-block:: bash + + cd thesofproject + # Re-build only sof-docs + ./sof-docs/scripts/docker_build/docker-build.sh docs + Publish content *************** diff --git a/scripts/docker_build/Dockerfile b/scripts/docker_build/Dockerfile new file mode 100644 index 00000000..070f7209 --- /dev/null +++ b/scripts/docker_build/Dockerfile @@ -0,0 +1,56 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2023 Intel Corporation. All rights reserved. +# +# Defines a docker image that can build Sound Open Firmware documentation +# +# Usage: +# create parent directory for sof and sof-docs repository (e.g. thesofproject) +# clone sof repository to thesofproject\sof folder +# clone sof-docs repository to thesofproject\sof-docs folder +# build docker image from parent directory .\thesofproject: +# > docker build -t ubuntu-sofdocs -f ./sof-docs/scripts/docker_build/Dockerfile ./ +# run the image container: +# > docker run -d --name sofdocs_container ubuntu-sofdocs sleep infinity +# copy build output from container to host: +# > docker cp sofdocs_container:/home/thesofproject/sof/doc ./sof/ +# > docker cp sofdocs_container:/home/thesofproject/sof-docs/_build ./sof-docs/ +# stop the container: +# docker stop sofdocs_container +# +# Note: The first build can take time to setup ubuntu and install tools, +# but each next one will repeat only copy and build steps. +# + +FROM dokken/ubuntu-22.04 + +# Set image working directory +WORKDIR /home/thesofproject + +RUN apt-get update + +# Install sof-docs build tools +RUN apt-get install -y python3.6 +RUN apt-get install -y doxygen python3-pip python3-wheel make \ + default-jre graphviz cmake ninja-build + +# Copy sof-docs file with dependency tools list +COPY ./sof-docs/scripts/requirements.txt /home/thesofproject/sof-docs/scripts/requirements.txt + +# Install sof-docs requirements tools +RUN pip3 install --user -r /home/thesofproject/sof-docs/scripts/requirements.txt + +# Directly install sphinx to add 'sphinx-build' to the system +RUN apt-get install -y python3-sphinx + +# Copy sof source code from host to image +COPY ./sof/ /home/thesofproject/sof/ + +# Build API documentation from SOF source (Doxygen) +RUN cmake -S sof/doc -B sof/doc -GNinja +RUN ninja -C sof/doc -v doc + +# Copy sof-docs source code from host to image +COPY ./sof-docs/ /home/thesofproject/sof-docs/ + +# Build sof-docs, ignore eventual errors to complete image creation +RUN make -C sof-docs VERBOSE=1 html; exit 0 diff --git a/scripts/docker_build/docker-build.sh b/scripts/docker_build/docker-build.sh new file mode 100644 index 00000000..e16e7507 --- /dev/null +++ b/scripts/docker_build/docker-build.sh @@ -0,0 +1,34 @@ +#!/bin/bash +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2023 Intel Corporation. All rights reserved. + +build_docs_only="FALSE" +if [ $# -eq 1 ] && [[ $1 = "docs" ]]; then + build_docs_only="TRUE" + echo "Re-build sof-docs only." +fi + +# Build documentation using docker image +docker build -t ubuntu-sofdocs -f ./sof-docs/scripts/docker_build/Dockerfile ./ + +# Run image container to copy output. +# Add sleep infinity to keep container running. +docker run -d --rm --name sofdocs_container ubuntu-sofdocs sleep infinity + +if [ $build_docs_only = "FALSE" ]; then + echo "Copy SOF Doxygen generated documentation from container to host ./sof/doc/" + docker cp sofdocs_container:/home/thesofproject/sof/doc ./sof/ +fi + +echo "Copy SOF-DOCS generated documentation from container to host ./sof-docs/_build .." +docker cp sofdocs_container:/home/thesofproject/sof-docs/_build ./sof-docs/ + +echo "Stop the sofdocs_container" +docker stop sofdocs_container + +# It is required to prevent stacking of images for each build run +echo "Remove dangling docker images" +docker image prune --force + +echo "Press key to exit..." +read -n 1 k <&1 From e772198302117b224d71dd171686a8b4a36af147 Mon Sep 17 00:00:00 2001 From: "Dobrowolski, PawelX" Date: Fri, 28 Apr 2023 09:21:38 +0200 Subject: [PATCH 231/290] fix: typo in label Signed-off-by: Dobrowolski, PawelX --- .../firmware/sof-common/components/component-module-api.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/architectures/firmware/sof-common/components/component-module-api.rst b/architectures/firmware/sof-common/components/component-module-api.rst index 6441f421..15560b87 100644 --- a/architectures/firmware/sof-common/components/component-module-api.rst +++ b/architectures/firmware/sof-common/components/component-module-api.rst @@ -1,4 +1,4 @@ -.. apps-comp-world: +.. _apps-comp-world: Component & Module Interfaces ############################# From 2c3a550538acbb92b9f261a6710aba5fa7f59e70 Mon Sep 17 00:00:00 2001 From: "Dobrowolski, PawelX" Date: Wed, 19 Apr 2023 14:38:37 +0200 Subject: [PATCH 232/290] Getting Started: introduce loadable modules Add guide describing how loadable modules are build using LMDK (Loadable Module Development Kit). Signed-off-by: Dobrowolski, PawelX --- .../app_layer/images/app_layer_diagram.pu | 8 ++--- .../firmware/sof-zephyr/app_layer/index.rst | 33 ++++++++++++------- getting_started/index.rst | 9 +++++ .../loadable_modules/lmdk_user_guide.rst | 25 ++++++++++++++ 4 files changed, 60 insertions(+), 15 deletions(-) create mode 100644 getting_started/loadable_modules/lmdk_user_guide.rst diff --git a/architectures/firmware/sof-zephyr/app_layer/images/app_layer_diagram.pu b/architectures/firmware/sof-zephyr/app_layer/images/app_layer_diagram.pu index a3581f25..dea00068 100644 --- a/architectures/firmware/sof-zephyr/app_layer/images/app_layer_diagram.pu +++ b/architectures/firmware/sof-zephyr/app_layer/images/app_layer_diagram.pu @@ -7,7 +7,7 @@ package "SOF" { package "Application layer" as APP_CUSTOMIZATION { - package "Example Loadable Components" as LOADABLE_COMPONENTS { + package "Example Loadable Module" as LOADABLE_MODULE { component "3rd Party Post-Processing" as PROCESSING_3RD_PARTY component "WoV" as WOV_MODULE component "ACA" as ACA_MODULE @@ -18,7 +18,7 @@ package "SOF" { ACA_MODULE -[hidden]right- OTHER_MODULES } - package "Built-in Components" as BUILTIN_COMPONENTS { + package "Built-in Module" as BUILTIN_MODULE { component "Copier" as COPIER component "SRC" as SRC component "Mixers" as MIXERS @@ -31,7 +31,7 @@ package "SOF" { HISTORY_BUFFER -[hidden]right- PROBE } - BUILTIN_COMPONENTS -[hidden]down- LOADABLE_COMPONENTS + BUILTIN_MODULE -[hidden]down- LOADABLE_MODULE } package "System Services" as SYS_SERVICES { @@ -58,7 +58,7 @@ package "SOF" { } APP_CUSTOMIZATION -[hidden]down- SYS_SERVICES - BUILTIN_COMPONENTS .down. SS + BUILTIN_MODULE .down. SS PROCESSING_3RD_PARTY .down. SS WOV_MODULE .down. SS ACA_MODULE .down. SS diff --git a/architectures/firmware/sof-zephyr/app_layer/index.rst b/architectures/firmware/sof-zephyr/app_layer/index.rst index 0ee0f56e..fba32384 100644 --- a/architectures/firmware/sof-zephyr/app_layer/index.rst +++ b/architectures/firmware/sof-zephyr/app_layer/index.rst @@ -3,38 +3,49 @@ Application Layer ################# -Application Layer represents the built-in FW processing components, loadable FW -components and example templates with application libraries required for -components integration. Application layer content is assumed to be open source +Application Layer represents the built-in FW modules (processing components), loadable FW +modules and example templates with application libraries required for +modules integration. Application layer content is assumed to be open source and only proprietary 3rd party components should remain private. .. uml:: images/app_layer_diagram.pu :caption: Application Layer -Components in Application Layer -******************************* +Modules in Application Layer +**************************** -The built-in components are built together with base firmware and they have +The built-in modules are built together with base firmware and they have direct access to all firmware drivers and service APIs. When built-in module is enabled in configuration, it is guaranteed to exist in firmware binary. -The loadable components are built separately from base firmware and they are +The loadable modules are built separately from base firmware and they are loaded dynamically as a separate binary, depending on the host audio -configuration. +configuration. To build, use LMDK(Loadable Module Development Kit) +which is standalone kit containing all required files. -All the application layer components access base firmware services via System +All the application layer module access base firmware services are via the System Services ABI. -**NOTE:** The built-in components are utility components provided by base +**NOTE:** The built-in modules are utility components provided by the base firmware/kernel. -Examples of built-in components: +Examples of built-in modules: * Audio built-in components: Copiers, Mixers, Volume, SRC, etc. +Example how to build a loadable module: + +* Example Up-Down-Mixer build using :ref:`lmdk_user_guide` + Probe ===== The probe module is special module in FW infrastructure that allows to inject or extract data from a specified probe point. The traditional client platforms use HDA DMAs to transfer data in and out of such module. + +Loadable Modules +================ + +The loadable modules are build into separate binaries from the main SOF build. To communicate with them +is used native system agent and to control is used module api :ref:`apps-comp-world`. diff --git a/getting_started/index.rst b/getting_started/index.rst index a932ec3a..3d585a7c 100755 --- a/getting_started/index.rst +++ b/getting_started/index.rst @@ -75,3 +75,12 @@ This section provides guides for integrators and for users working with i.MX pla nxp/sof_imx_user_guide +Building loadable modules using LMDK +************************************ + +This section descibes process of building loadable modules using LMDK. + +.. toctree:: + :maxdepth: 1 + + loadable_modules/lmdk_user_guide diff --git a/getting_started/loadable_modules/lmdk_user_guide.rst b/getting_started/loadable_modules/lmdk_user_guide.rst new file mode 100644 index 00000000..b6085e01 --- /dev/null +++ b/getting_started/loadable_modules/lmdk_user_guide.rst @@ -0,0 +1,25 @@ +.. _lmdk_user_guide: + +Loadable modules build guide using LMDK +####################################### + +What is LMDK +************ + +LMDK(Loadable Module Development Kit) is a standalone package required to build loadable module. It is independent from SOF FW but contains necessary data structures to interact with it. + +How to build +************ + +To build example loadable library execute: +.. code-block:: bash + + $ cd libraries/example + $ mkdir build + $ cd build + + $ cmake -DRIMAGE_COMMAND="/path/to/rimage" -DSIGNING_KEY="/path/to/signing/key.pem" .. + $ cmake --build . + +Here RIMAGE_COMMAND is path to rimage executable binary, SIGNING_KEY is path to +signing key for rimage. `LMDK ` From c944238e412a1c05b7cf2cc2995a1972fbc1e760 Mon Sep 17 00:00:00 2001 From: Deb Taylor Date: Thu, 29 Jun 2023 13:23:42 -0600 Subject: [PATCH 233/290] Release update (#470) * add yaml file updates Signed-off-by: Deb * Update release tags for v2.6 Signed-off-by: Deb --------- Signed-off-by: Deb --- conf.py | 2 +- release.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/conf.py b/conf.py index 2ee473e9..8352df0c 100755 --- a/conf.py +++ b/conf.py @@ -81,7 +81,7 @@ # |version| and |release|, also used in various other places throughout the # built documents. -version = release = "2.4.1" +version = release = "2.5.0" # # The short X.Y version. diff --git a/release.rst b/release.rst index 837838c3..0fa459e4 100755 --- a/release.rst +++ b/release.rst @@ -26,7 +26,7 @@ kernel, and documentation. Download the source code as a zip or tar.gz file: Source and Binary Releases -------------------------- -The latest SOF release is v2.5.0 (Mar 2023). +The latest SOF release is v2.6.0 (June 2023). View new feature information and release downloads for the latest and previous releases on GitHub. Firmware and SDK tool source code and binary From e79c6f10a52e3e6e520f294cc853b432e0ac54a3 Mon Sep 17 00:00:00 2001 From: Alexander Boehm Date: Wed, 24 May 2023 13:24:15 +0200 Subject: [PATCH 234/290] logger: fix typos, long lines Apart from the title content: While using 'filtration' and 'filtering' interchangeably is not a real error, consistent use of one or the other seems better. Changed to 'filtering'. Signed-off-by: Alexander Boehm --- developer_guides/debugability/logger/index.rst | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/developer_guides/debugability/logger/index.rst b/developer_guides/debugability/logger/index.rst index fd53b7dd..a141d98a 100644 --- a/developer_guides/debugability/logger/index.rst +++ b/developer_guides/debugability/logger/index.rst @@ -204,18 +204,21 @@ Instance descriptions can have one of the following forms: - ``X.*`` - each component on selected pipeline *X* - ``X.Y`` - component on pipeline *X* with id *Y* -Trace level changes works in the same order as options given in a command line, and a new set overwrites old values. It allows you to easily enable verbose logs only for selected components and keep the lowest possible log level (critical) for others, as shown in the following example: +Trace level changes work in the same order as options given in a command line, and a new set overwrites old values. +It allows you to easily enable verbose logs only for selected components and keep the lowest possible log level (critical) for +others, as shown in the following example: sof-logger -l ldc_file -t -Fcritical=* -Fverbose="dai*, volume1.1" A similar example may be prepared for components on a particular pipeline: - sof-loggerr -l ldc_file -t -Fc=* -Fv=*1.* + sof-logger -l ldc_file -t -Fc=* -Fv=*1.* .. note:: To track a verbose message, select the "Trace verbose" option under the "Trace" menu from the firmware build. -Active trace filters are stored in the firmware runtime memory, so after a firmware restart (such as after power gating in sleep mode) filters settings will be reset. +Active trace filters are stored in the firmware runtime memory, so after a firmware restart (such as after power gating +in sleep mode) filters settings will be reset. Consider disabling power gating during your debug session by entering the following: @@ -231,7 +234,7 @@ Consider disabling power gating during your debug session by entering the follow cat /sys/devices/pci0000\:00/0000\:$(lspci -nn | grep "audio controller" | awk '{print $1;}')/power/runtime_status -The logger trace filtration affects only traces sent after the filter setup, +The logger trace filtering affects only traces sent after the filter setup, so traces already stored on the kernel side are not affected. Filters are set up incrementally, so when loggers are run twice with @@ -242,11 +245,11 @@ default state, a firmware reset is needed. Detailed description -------------------- -The filtration mechanism occurs on the firmware side so, after changing the -log level to verbose for each component, the DSP can be overhelmed by +The filtering mechanism occurs on the firmware side so, after changing the +log level to verbose for each component, the DSP can be overwhelmed by tracing. -Core functionality is provided by the DSP, so filtration does not work in +Core functionality is provided by the DSP, so filtering does not work in offline mode - during conversion in a previously saved input file. Communication between the firmware and logger is occurs through driver From 9da4405b6669aa92406dbe4795e54cb731ff519b Mon Sep 17 00:00:00 2001 From: Alexander Boehm Date: Wed, 24 May 2023 13:32:37 +0200 Subject: [PATCH 235/290] logger: restructure for better readability Moved trace filtering details to a dedicated section and rephrased third sub-point. Own section for 'power gating' notes plus re-wording of first two sentences. Signed-off-by: Alexander Boehm --- .../debugability/logger/index.rst | 55 +++++++++++-------- 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/developer_guides/debugability/logger/index.rst b/developer_guides/debugability/logger/index.rst index a141d98a..d3f84aeb 100644 --- a/developer_guides/debugability/logger/index.rst +++ b/developer_guides/debugability/logger/index.rst @@ -129,7 +129,7 @@ Examples .. note:: - debugfs files used by ``sof-logger`` + debugfs files used by sof-logger: - ``etrace``: direct access to the shared TRACE window of the SOF firmware - ``trace``: using DMA to stream debug trace information from SOF firmware (on @@ -214,12 +214,17 @@ A similar example may be prepared for components on a particular pipeline: sof-logger -l ldc_file -t -Fc=* -Fv=*1.* -.. note:: - To track a verbose message, select the "Trace verbose" option under the "Trace" menu from the firmware build. +Verbose and debug log levels +---------------------------- + +To enable verbose and debug trace messages, select the "Trace->Trace verbose" option in the firmware build +menuconfig (in addition to setting the proper log levels as described above). -Active trace filters are stored in the firmware runtime memory, so after a firmware restart (such as after power gating -in sleep mode) filters settings will be reset. +Disabling DSP power gating +-------------------------- +After a firmware reset (such as after power gating in suspend mode) custom filter settings will be lost. +Thus consider disabling power gating during your debug session. The way this is done is slightly different on every platform, Consider disabling power gating during your debug session by entering the following: .. code:: bash @@ -234,29 +239,31 @@ Consider disabling power gating during your debug session by entering the follow cat /sys/devices/pci0000\:00/0000\:$(lspci -nn | grep "audio controller" | awk '{print $1;}')/power/runtime_status -The logger trace filtering affects only traces sent after the filter setup, -so traces already stored on the kernel side are not affected. -Filters are set up incrementally, so when loggers are run twice with -different settings, then filters from the first run will not be restored to -the default state but will be replaced by a new one. To reset filters to the -default state, a firmware reset is needed. -Detailed description --------------------- +Trace filtering details +----------------------- + +* The filtering mechanism occurs on the firmware side so, after changing the + log level to verbose for each component, the DSP can be overwhelmed by + tracing. + +* Core functionality is provided by the DSP, so filtering does not work in + offline mode - during conversion in a previously saved input file. -The filtering mechanism occurs on the firmware side so, after changing the -log level to verbose for each component, the DSP can be overwhelmed by -tracing. +* The trace filtering affects only traces sent after the filter setup, + so traces already stored on the kernel side are not affected. If a certain log level is needed before a filter has been setup the DECLARE_TR_CTX() + macro at the beginning of the respective component's source file can be adapted. -Core functionality is provided by the DSP, so filtering does not work in -offline mode - during conversion in a previously saved input file. +* Filters are set up incrementally, so when loggers are run twice with + different settings, then filters from the first run will not be restored to + the default state but will be replaced by a new one. Active trace filters are stored in the firmware runtime memory. To reset the filters to the + default state, a firmware reset is needed. -Communication between the firmware and logger is occurs through driver -debug file systems. The logger writes new trace settings to ``sys/kernel/debug/sof/filter``. These will be used to create *IPC* messages with new -trace levels. A simple text data format is used: +* Communication between the firmware and logger occurs through the kernel debugfs. The logger writes new trace settings to ``sys/kernel/debug/sof/filter``. + These will be used to create *IPC* messages with new trace levels. A simple text data format is used: -``log1_level uuid1_id pipe1_id comp1_id; [log2_level uuid2_id pipe2_id comp2_id;]\n`` + ``log1_level uuid1_id pipe1_id comp1_id; [log2_level uuid2_id pipe2_id comp2_id;]\n`` -Any unused uuid_id should be set here to 0; other unused fields should be -set to -1. ``log_level`` must always be set to a valid value that represents ``LOG_LEVEL_*`` defined values. + Any unused uuid_id should be set here to 0; other unused fields should be + set to -1. ``log_level`` must always be set to a valid value that represents ``LOG_LEVEL_*`` defined values. From 98db4c4de00a14b8c24bd4a0238632465365a96e Mon Sep 17 00:00:00 2001 From: Alexander Boehm Date: Wed, 24 May 2023 12:02:53 +0200 Subject: [PATCH 236/290] logger: add note about dropped logs At least on i.MX8m+ sof-logger output sometimes contains errors about dropped logs, even with default verbosity settings. Increasing DMA_TRACE_LOCAL_SIZE helps, so mention that here. Signed-off-by: Alexander Boehm --- developer_guides/debugability/logger/index.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/developer_guides/debugability/logger/index.rst b/developer_guides/debugability/logger/index.rst index d3f84aeb..fcad66b9 100644 --- a/developer_guides/debugability/logger/index.rst +++ b/developer_guides/debugability/logger/index.rst @@ -150,6 +150,9 @@ Examples file and start reading from position 0 and thus be in sync with the firmware when it is resumed. + Sometimes error messages about dropped logs are printed. If that is a problem, + increasing DMA_TRACE_LOCAL_SIZE in the relevant platform.h file can be helpful. + Trace filtering *************** From c4e5285e6b2e1adc9328532d05c84b3ef9439fc3 Mon Sep 17 00:00:00 2001 From: Alexander Boehm Date: Wed, 24 May 2023 12:18:50 +0200 Subject: [PATCH 237/290] logger: add how to disable fw suspend for imx8mp Firmware suspension can be undesirable when using sof-logger, thus added how to prevent it on imx8mp. Likely can be generalized to other imx SOCs without much effort. Signed-off-by: Alexander Boehm --- developer_guides/debugability/logger/index.rst | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/developer_guides/debugability/logger/index.rst b/developer_guides/debugability/logger/index.rst index fcad66b9..17e41d1c 100644 --- a/developer_guides/debugability/logger/index.rst +++ b/developer_guides/debugability/logger/index.rst @@ -228,21 +228,23 @@ Disabling DSP power gating After a firmware reset (such as after power gating in suspend mode) custom filter settings will be lost. Thus consider disabling power gating during your debug session. The way this is done is slightly different on every platform, -Consider disabling power gating during your debug session by entering the following: +two examples follow: -.. code:: bash +1. Intel PCI based: + +.. code-block:: bash sudo su echo on >/sys/devices/pci0000\:00/0000\:$(lspci -nn | grep "audio contoller" | awk '{print $1;}')/power/control -.. note:: - The current device power status can be read by entering this command: - - .. code:: bash +2. NXP imx8mp: - cat /sys/devices/pci0000\:00/0000\:$(lspci -nn | grep "audio controller" | awk '{print $1;}')/power/runtime_status +.. code-block:: bash + sudo su + echo on>/sys/class/devlink/platform:power-domains:audiomix-pd--platform:3b6e8000.dsp/consumer/power/control +To re-enable automatic suspend use ``echo auto``, the current status can be read from the runtime_status file in these sysfs directories. Trace filtering details ----------------------- From 767dbc2a2a2d88fb0d77fd6245a8d3c5f04b01d1 Mon Sep 17 00:00:00 2001 From: Benjamin Blacher Date: Fri, 2 Jun 2023 09:36:05 +0000 Subject: [PATCH 238/290] Update install_locally to match the directory created in prepare_build_environment The directory mentioned in install_locally doesn't match the one mentioned in prepare_build_environment. This commit fixes this. --- getting_started/setup_linux/install_locally.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/getting_started/setup_linux/install_locally.rst b/getting_started/setup_linux/install_locally.rst index d70f9774..30df80af 100644 --- a/getting_started/setup_linux/install_locally.rst +++ b/getting_started/setup_linux/install_locally.rst @@ -16,7 +16,7 @@ Make sure you have `set up your development environment Date: Wed, 7 Jun 2023 09:04:18 +0000 Subject: [PATCH 239/290] Update install_locally Change other occurrences of ~/sof/linux to ~/work/sof/linux --- getting_started/setup_linux/install_locally.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/getting_started/setup_linux/install_locally.rst b/getting_started/setup_linux/install_locally.rst index 30df80af..ce50ec8f 100644 --- a/getting_started/setup_linux/install_locally.rst +++ b/getting_started/setup_linux/install_locally.rst @@ -116,7 +116,7 @@ If you run into issues or no longer need the custom kernel, you can remove it. .. code-block:: bash - cd ~/sof/linux + cd ~/work/sof/linux sudo rm /boot/*-$(make kernelversion) sudo rm -rf /lib/modules/$(make kernelversion) sudo update-grub @@ -125,7 +125,7 @@ If you run into issues or no longer need the custom kernel, you can remove it. .. code-block:: bash - cd ~/sof/linux + cd ~/work/sof/linux sudo rm /boot/*-$(make kernelversion)* sudo rm -rf /lib/modules/$(make kernelversion) sudo grubby --remove-kernel=/boot/vmlinuz-$(make kernelversion) From 60a41cf68d6478e9de5a7cc262900e71900b92a8 Mon Sep 17 00:00:00 2001 From: Jyri Sarha Date: Wed, 5 Jul 2023 10:24:21 +0300 Subject: [PATCH 240/290] getting_started: Digital mic issue: Fix arecord options Fixes broken "arecord -Dhw:0,6 -c4 -r48000 -sS32_LE -d 10 test.wav" to "arecord -Dhw:0,6 -c4 -r48000 -fS32_LE -d 10 test.wav" Link: https://github.com/thesofproject/sof-docs/issues/467 Signed-off-by: Jyri Sarha --- getting_started/intel_debug/suggestions.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/getting_started/intel_debug/suggestions.rst b/getting_started/intel_debug/suggestions.rst index 7e9d2d2e..67594dfe 100644 --- a/getting_started/intel_debug/suggestions.rst +++ b/getting_started/intel_debug/suggestions.rst @@ -214,7 +214,7 @@ The following command can then be used to check if the microphones are active at .. code-block:: bash - arecord -Dhw:0,6 -c4 -r48000 -sS32_LE -d 10 test.wav + arecord -Dhw:0,6 -c4 -r48000 -fS32_LE -d 10 test.wav In 99% of the cases, hardware designers connect the two microphones on the PDM0 controller. Some platforms use PDM1, which cannot really be From 73ac8f55622dfb0d406f83e35bdfa319cead8bcb Mon Sep 17 00:00:00 2001 From: Marc Herbert Date: Mon, 10 Jul 2023 16:43:41 -0700 Subject: [PATCH 241/290] scripts/requirements*.txt: pillow<10 to avoid warning On July 1st, python library "Pillow" (needed by sphinxcontrib.blockdiag) released version 10.0.0 https://pypi.org/project/Pillow/#history The sof-docs build immediately started to fail with the warning "'ImageDraw' object has no attribute 'textsize'" Stick to pillow<10 for now to avoid the warning. More details in issue https://github.com/thesofproject/sof-docs/issues/472 Signed-off-by: Marc Herbert --- scripts/requirements-lax.txt | 5 +++++ scripts/requirements.txt | 6 ++++++ 2 files changed, 11 insertions(+) diff --git a/scripts/requirements-lax.txt b/scripts/requirements-lax.txt index 7287ddf0..b92ef6c4 100644 --- a/scripts/requirements-lax.txt +++ b/scripts/requirements-lax.txt @@ -58,3 +58,8 @@ sphinxcontrib.plantuml>=0.11,<0.25 # - Downgrade if successfully tested. # - Test with plantum set to "none" in conf.py. We don't want small # typo fixes to depend on UML diagrams. + +# Workaround for warning "'ImageDraw' object has no attribute 'textsize'" +# with pillow 10.0.0, see +# https://github.com/thesofproject/sof-docs/issues/472 +pillow<10 diff --git a/scripts/requirements.txt b/scripts/requirements.txt index 3d50863c..c3697fe8 100755 --- a/scripts/requirements.txt +++ b/scripts/requirements.txt @@ -6,3 +6,9 @@ docutils==0.17.1 sphinx_rtd_theme sphinxcontrib-plantuml sphinxcontrib-blockdiag + + +# Workaround for warning "'ImageDraw' object has no attribute 'textsize'" +# with pillow 10.0.0, see +# https://github.com/thesofproject/sof-docs/issues/472 +pillow<10 From 91a4ceeff409fb34e281edbdc8da265cadbbd504 Mon Sep 17 00:00:00 2001 From: Marc Herbert Date: Mon, 10 Jul 2023 16:45:15 -0700 Subject: [PATCH 242/290] scripts/requirements-lax.txt: align with more recent requirements.txt No point accepting versions older than the officially supported versions. Fixes commit 0d8991b4114f ("Update req.txt file, update copyright, change release number") Signed-off-by: Marc Herbert --- scripts/requirements-lax.txt | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/scripts/requirements-lax.txt b/scripts/requirements-lax.txt index b92ef6c4..fb60b139 100644 --- a/scripts/requirements-lax.txt +++ b/scripts/requirements-lax.txt @@ -9,9 +9,9 @@ # PIP_IGNORE_INSTALLED=0 pip3 install --user -r scripts/requirements-lax.txt # See https://github.com/pypa/pip/issues/4222 -breathe>=4.7.3 -sphinx>=1.6.7 -docutils>=0.14 +breathe>=4.29.2 +sphinx>=4.5.0 +docutils>=0.17.1 sphinx_rtd_theme>=0.2.4 sphinxcontrib-blockdiag>=3.0.0 @@ -19,16 +19,13 @@ sphinxcontrib-blockdiag>=3.0.0 # `plantuml_output_format=none` which is required for instant builds. # https://pypi.org/project/sphinxcontrib-plantuml/0.11/ # -# - 0.24 is the last version successfully tested with -# PIP_IGNORE_INSTALLED=0 and Ubuntu 20.04 (see .github/worflows/) -# # - Note 0.9 is the minimum to fix this fatal import failure: # # sphinx.util.compat.Directive class is now deprecated. Please # use instead docutils.parsers.rst.Directive # # https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=896485#12 -sphinxcontrib.plantuml>=0.11,<0.25 +sphinxcontrib.plantuml>=0.11 # Differences between these "lax" version requirements and the official # ones in requirements.txt: From 2a658def01e28225685cab3e6d5658d7bd004206 Mon Sep 17 00:00:00 2001 From: Marc Herbert Date: Mon, 10 Jul 2023 16:46:55 -0700 Subject: [PATCH 243/290] .github: upgrade "lax" build from Ubuntu 20.04 to 22.04 Ubuntu 20.04 is old, we don't want to hear about it. Signed-off-by: Marc Herbert --- .github/workflows/pull-request.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index f10d87ff..6586ba61 100755 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -32,7 +32,7 @@ jobs: supported-reqs: name: 'Supported scripts/requirements.txt' - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v3 @@ -81,7 +81,7 @@ jobs: deploy: needs: supported-reqs - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/publish' }} steps: # download the build result from the same workflow From 8e37a80e72a73010047905c6d42c4a7d8b6536a4 Mon Sep 17 00:00:00 2001 From: Kai Vehmanen Date: Tue, 19 Sep 2023 14:17:13 +0300 Subject: [PATCH 244/290] intel_debug: add note that sof-tgl.ri is just one example Add note that sof-tgl.ri is just one example firmware file name. Signed-off-by: Kai Vehmanen --- getting_started/intel_debug/introduction.rst | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/getting_started/intel_debug/introduction.rst b/getting_started/intel_debug/introduction.rst index 9842ca1c..8109bf7f 100644 --- a/getting_started/intel_debug/introduction.rst +++ b/getting_started/intel_debug/introduction.rst @@ -97,12 +97,12 @@ the following elements are present on the file system. 1. Firmware binary ------------------ -The firmware file, ``/lib/firmware/intel/sof/sof-tgl.ri``, contains -all DSP code and tables. On PCI devices, the firmware can only be -signed by an Intel production key which prevents community users from -installing their own firmware. Notable exceptions include Google -Chromebooks and Up2/Up-Extreme boards, where the *community key* is -used. +The firmware file, ``/lib/firmware/intel/sof/sof-tgl.ri`` (example +location for Intel Tiger Lake), contains all DSP code and tables. On +PCI devices, the firmware can only be signed by an Intel production +key which prevents community users from installing their own firmware. +Notable exceptions include Google Chromebooks and Up2/Up-Extreme +boards, where the *community key* is used. The Intel ME (Management Engine) is responsible for authentication of the firmware, whether it is signed by an Intel production key (consumer From 3c934c76bb2ac3172b2bad527a1cb7e8619b1e28 Mon Sep 17 00:00:00 2001 From: Kai Vehmanen Date: Tue, 19 Sep 2023 14:17:49 +0300 Subject: [PATCH 245/290] intel_debug: add info for Intel firmware and tplg filenames Add tables documenting the firmare and topology filenames and their locations, as expected by Linux SOF driver. Signed-off-by: Kai Vehmanen --- getting_started/intel_debug/introduction.rst | 51 ++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/getting_started/intel_debug/introduction.rst b/getting_started/intel_debug/introduction.rst index 8109bf7f..78e1bbab 100644 --- a/getting_started/intel_debug/introduction.rst +++ b/getting_started/intel_debug/introduction.rst @@ -117,6 +117,39 @@ Linux kernel to query whether or not the firmware authentication is enabled, which means `dmesg` logs cannot be provided to alert the user to an ME configuration issue. +Linux SOF will look up firmware files at the following paths: + +.. list-table:: Firmware look-up paths per Intel platform + :widths: 50 50 25 + :header-rows: 1 + + * - Platform + - Firmware load path + - Notes + * - Raptor Lake and older + - /lib/firmware/intel/sof/sof-PLAT.ri + - PLAT = glk, cml, ..., rpl + * - Raptor Lake and older (community signed) + - /lib/firmware/intel/sof/community/sof-PLAT.ri + - PLAT = glk, cml, ..., rpl + * - Meteor Lake and newer + - /lib/firmware/intel/sof-ipc4/PLAT/sof-PLAT.ri + - PLAT = mtl, lnl, ... + * - Meteor Lake and newer (community signed) + - /lib/firmware/intel/sof-ipc4/PLAT/community/sof-PLAT.ri + - PLAT = mtl, lnl, ... + * - Meteor Lake and newer Loadable Module + - /lib/firmware/intel/sof-ipc4-lib/PLAT/UUID.bin + - PLAT as above, UUID = UUID of the module + * - Meteor Lake and newer Loadable Module (community signed) + - /lib/firmware/intel/sof-ipc4-lib/PLAT/community/UUID.bin + - PLAT as above, UUID = UUID of the module + +Important notices: + - The standard Linux firmware search path and order is followed. The above table covers the base "/lib/firmware" case. See https://docs.kernel.org/driver-api/firmware/fw_search_path.html for more information. + - The firmware folder and filename can be overridden with "fw_path" and "fw_filename" SOF kernel parameters. + - The loadable module library path can be overridden with "lib_path" SOF kernel parameter. + 2. Topology file ---------------- @@ -124,6 +157,24 @@ The topology file, such as ``/lib/firmware/intel/sof-tplg/sof-hda-generic-2ch.tp be instantiated by the SOF driver. The topology can be regenerated and reconfigured with tools but requires expert knowledge of the ALSA/ASoC/topology frameworks. +.. list-table:: Firmware topology file look-up paths per Intel platform + :widths: 50 50 25 + :header-rows: 1 + + * - Platform + - Topology load path + - Notes + * - Raptor Lake and older + - /lib/firmware/intel/sof-tplg/sof-CONFIG.tplg + - CONFIG = topology variant needed for detected hardware configuration + * - Meteor Lake and newer + - /lib/firmware/intel/sof-ace-tplg/sof-CONFIG.tplg + - CONFIG = topology variant needed for detected hardware configuration + +Important notices: + - The standard Linux firmware search path and order is followed. The above table covers the base "/lib/firmware" case. See https://docs.kernel.org/driver-api/firmware/fw_search_path.html for more information. + - The topology folder and filename can be overridden with "tplg_path" and "tplg_filename" `snd_sof_pci` kernel parameters. + 3. UCM file ----------- From dad39b005405d077253d0be0928983bed9f467a8 Mon Sep 17 00:00:00 2001 From: Deb Taylor Date: Thu, 28 Sep 2023 09:06:39 -0500 Subject: [PATCH 246/290] Revision update (#479) * add yaml file updates Signed-off-by: Deb * Update version numbers to 2.7.0 Signed-off-by: Deb --------- Signed-off-by: Deb --- conf.py | 2 +- release.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/conf.py b/conf.py index 8352df0c..d79c6d89 100755 --- a/conf.py +++ b/conf.py @@ -81,7 +81,7 @@ # |version| and |release|, also used in various other places throughout the # built documents. -version = release = "2.5.0" +version = release = "2.7.0" # # The short X.Y version. diff --git a/release.rst b/release.rst index 0fa459e4..1383c190 100755 --- a/release.rst +++ b/release.rst @@ -26,7 +26,7 @@ kernel, and documentation. Download the source code as a zip or tar.gz file: Source and Binary Releases -------------------------- -The latest SOF release is v2.6.0 (June 2023). +The latest SOF release is v2.7.0 (Sept 2023). View new feature information and release downloads for the latest and previous releases on GitHub. Firmware and SDK tool source code and binary From bc438c0e02ae3a02f0d3fc87b1fdc2db5412ebfd Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Tue, 26 Sep 2023 14:53:01 +0300 Subject: [PATCH 247/290] developer_guides: debugability: probes: Bring the documentation up to date The kernel print has been changed since the documentation was added and let's add a convenience 'hack' to gather the IDs that we need to pass as point ID. At the same time align the rendered page. Signed-off-by: Peter Ujfalusi --- .../debugability/probes/index.rst | 61 ++++++++++++------- 1 file changed, 38 insertions(+), 23 deletions(-) diff --git a/developer_guides/debugability/probes/index.rst b/developer_guides/debugability/probes/index.rst index 4f9cd559..98e6dedc 100644 --- a/developer_guides/debugability/probes/index.rst +++ b/developer_guides/debugability/probes/index.rst @@ -135,35 +135,50 @@ the last stage of extraction. Refer to the host side struct sof_probe_point_desc defined in ``sound/soc/sof/probe.h`` or struct probe_point in ``/src/include/ipc/probe.h`` from sof for the meaning of the triplets: - .. code-block:: c + .. code-block:: c - /** - * Description of probe point - */ - struct probe_point { - uint32_t buffer_id; /**< ID of buffer to which probe is attached */ - uint32_t purpose; /**< PROBE_PURPOSE_EXTRACTION or PROBE_PURPOSE_INJECTION */ - uint32_t stream_tag; /**< Stream tag of DMA via which data will be provided for injection. - * For extraction purposes, stream tag is ignored when received, - * but returned actual extraction stream tag via INFO function. - */ - } __attribute__((packed)); + /** + * Description of probe point + */ + struct probe_point { + uint32_t buffer_id; /**< ID of buffer to which probe is attached */ + uint32_t purpose; /**< PROBE_PURPOSE_EXTRACTION or PROBE_PURPOSE_INJECTION */ + uint32_t stream_tag; /**< Stream tag of DMA via which data will be provided for injection. + * For extraction purposes, stream tag is ignored when received, + * but returned actual extraction stream tag via INFO function. + */ + } __attribute__((packed)); + + In the above example, 7 stands for the ``buffer_id`` which is a monolithic + counter value that follows a component instantiation order. - In the above example, 7 stands for the ``buffer_id`` which is a monolithic - counter value that follows a component instantiation order. + One way to find out the right instance of ``buffer_id`` is to enable + dev_dbg in ``sound/sound/soc/sof/topology.c`` and search for the widget id + from the following messages: - One way to find out the right instance of ``buffer_id`` is to enable - dev_dbg in ``sound/sound/soc/sof/topology.c`` and search for the widget id - from the following messages: + .. code-block:: c - .. code-block:: c + dev_dbg(scomp->dev, + "tplg: widget %d (%s) is ready [type: %d, pipe: %d, pins: %d / %d, stream: %s]\n", + swidget->comp_id, w->name, swidget->id, index, + swidget->num_input_pins, swidget->num_output_pins, + strnlen(w->sname, SNDRV_CTL_ELEM_ID_NAME_MAXLEN) > 0 ? w->sname : "none"); - dev_dbg(scomp->dev, "tplg: ready widget id %d pipe %d type %d name : %s stream %s\n", - swidget->comp_id, index, swidget->id, tw->name, - strnlen(tw->sname, SNDRV_CTL_ELEM_ID_NAME_MAXLEN) > 0 - ? tw->sname : "none"); + On a booted system the list can be acquired with + + .. code-block:: bash - For IPC4 system, the above example looks like this: + dmesg | grep "tplg: widget " + ... + snd_sof:sof_widget_ready: sof-audio-pci-intel-tgl 0000:00:1f.3: tplg: widget 2 (gain.1.1) is ready [type: 6, pipe: 1, pins: 1 / 1, stream: none] + snd_sof:sof_widget_ready: sof-audio-pci-intel-tgl 0000:00:1f.3: tplg: widget 3 (mixin.1.1) is ready [type: 4, pipe: 1, pins: 1 / 3, stream: none] + snd_sof:sof_widget_ready: sof-audio-pci-intel-tgl 0000:00:1f.3: tplg: widget 4 (pipeline.1) is ready [type: 32, pipe: 1, pins: 0 / 0, stream: none] + snd_sof:sof_widget_ready: sof-audio-pci-intel-tgl 0000:00:1f.3: tplg: widget 5 (codec0_in) is ready [type: 0, pipe: 1, pins: 0 / 0, stream: none] + snd_sof:sof_widget_ready: sof-audio-pci-intel-tgl 0000:00:1f.3: tplg: widget 6 (iDisp2 Tx) is ready [type: 7, pipe: 1, pins: 0 / 0, stream: none] + snd_sof:sof_widget_ready: sof-audio-pci-intel-tgl 0000:00:1f.3: tplg: widget 7 (dai-copier.HDA.Analog.playback) is ready [type: 27, pipe: 2, pins: 1 / 0, stream: Analog] + ... + + For IPC4 system, the above example looks like this (extraction from gain.1.1): .. code-block:: bash From f70388a42909591e699b0dfed21ee137e4b11d91 Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Fri, 22 Sep 2023 09:54:46 +0300 Subject: [PATCH 248/290] intel_debug: introduction: Update for pathnames for IPC4 support SOF supports platforms from Tiger Lake with IPC4, update the docuementation accordingly. Update the MTL/LNL topology path to follow a generic pattern and add a note about the need for a symlink for the old path to retain backwards compatibility with released kernels. Signed-off-by: Peter Ujfalusi --- getting_started/intel_debug/introduction.rst | 31 +++++++++++++------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/getting_started/intel_debug/introduction.rst b/getting_started/intel_debug/introduction.rst index 78e1bbab..37fddd16 100644 --- a/getting_started/intel_debug/introduction.rst +++ b/getting_started/intel_debug/introduction.rst @@ -120,28 +120,35 @@ configuration issue. Linux SOF will look up firmware files at the following paths: .. list-table:: Firmware look-up paths per Intel platform - :widths: 50 50 25 + :widths: 55 5 50 25 :header-rows: 1 * - Platform + - IPC type - Firmware load path - Notes * - Raptor Lake and older + - IPC3 - /lib/firmware/intel/sof/sof-PLAT.ri - PLAT = glk, cml, ..., rpl * - Raptor Lake and older (community signed) + - IPC3 - /lib/firmware/intel/sof/community/sof-PLAT.ri - PLAT = glk, cml, ..., rpl - * - Meteor Lake and newer + * - Tiger Lake and newer + - IPC4 - /lib/firmware/intel/sof-ipc4/PLAT/sof-PLAT.ri - - PLAT = mtl, lnl, ... - * - Meteor Lake and newer (community signed) + - PLAT = tgl, adl, rpl, mtl, lnl, ... + * - Tiger Lake and newer (community signed) + - IPC4 - /lib/firmware/intel/sof-ipc4/PLAT/community/sof-PLAT.ri - - PLAT = mtl, lnl, ... - * - Meteor Lake and newer Loadable Module + - PLAT = tgl, adl, rpl, mtl, lnl, ... + * - Tiger Lake and newer Loadable Module + - IPC4 - /lib/firmware/intel/sof-ipc4-lib/PLAT/UUID.bin - PLAT as above, UUID = UUID of the module - * - Meteor Lake and newer Loadable Module (community signed) + * - Tiger Lake and newer Loadable Module (community signed) + - IPC4 - /lib/firmware/intel/sof-ipc4-lib/PLAT/community/UUID.bin - PLAT as above, UUID = UUID of the module @@ -158,20 +165,24 @@ be instantiated by the SOF driver. The topology can be regenerated and reconfigured with tools but requires expert knowledge of the ALSA/ASoC/topology frameworks. .. list-table:: Firmware topology file look-up paths per Intel platform - :widths: 50 50 25 + :widths: 50 5 50 25 :header-rows: 1 * - Platform + - IPC type - Topology load path - Notes * - Raptor Lake and older + - IPC3 - /lib/firmware/intel/sof-tplg/sof-CONFIG.tplg - CONFIG = topology variant needed for detected hardware configuration - * - Meteor Lake and newer - - /lib/firmware/intel/sof-ace-tplg/sof-CONFIG.tplg + * - Tiger Lake and newer + - IPC4 + - /lib/firmware/intel/sof-ipc4-tplg/sof-CONFIG.tplg - CONFIG = topology variant needed for detected hardware configuration Important notices: + - For compatibility reasons for **Meteor Lake and newer** ``/lib/firmware/intel/sof-ace-tplg`` must be symlinked to ``/lib/firmware/intel/sof-ipc4-tplg`` - The standard Linux firmware search path and order is followed. The above table covers the base "/lib/firmware" case. See https://docs.kernel.org/driver-api/firmware/fw_search_path.html for more information. - The topology folder and filename can be overridden with "tplg_path" and "tplg_filename" `snd_sof_pci` kernel parameters. From cd9ed3231004ff39ce6c4d7d2f3a837dd960612e Mon Sep 17 00:00:00 2001 From: Vsevolod Novikov Date: Thu, 28 Sep 2023 11:49:42 +0300 Subject: [PATCH 249/290] intel_debug: Fixed suggestions about getting ES8336 quirk default. Suggestions fixed corresponding to the reality. Also some fixes mostly regarding syntax provided by request from @deb-intel. Signed-off-by: Vsevolod Novikov --- getting_started/intel_debug/suggestions.rst | 29 ++++++++++++++++++--- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/getting_started/intel_debug/suggestions.rst b/getting_started/intel_debug/suggestions.rst index 67594dfe..93e4c22e 100644 --- a/getting_started/intel_debug/suggestions.rst +++ b/getting_started/intel_debug/suggestions.rst @@ -294,12 +294,33 @@ driver: #define SOC_ES8336_HEADSET_MIC1 BIT(8) -The default quirk value for the platform can be read from +The default and actual quirk values for the platform can be obtained +from the kernel logs in the line as follows: + +.. code-block:: none + + ... + sof-essx8336 sof-essx8336: quirk mask 0x1a0 + ... + +for the unchanged mask, or: + +.. code-block:: none + + ... + sof-essx8336 sof-essx8336: Overriding quirk 0x1a0 => 0x120 + ... + +for the quirk overriding. + +The overridden quirk value can also be obtained from the /sys/module/snd_soc_sof_es8336/parameters/quirk (the value is reported -as plain integer, not hexadecimal). Changes to the default can be -added with the following option in +as a plain integer, not hexadecimal). If the quirk is not overridden, +the `-1` value is returned. + +Changes to the default can be added with the following option in e.g. /etc/modprobe.d/alsa-base.conf. Only the bits listed above can be -modified, others need to be kept as is. +modified; others need to remain as is. .. code-block:: cfg From dc090bd456e1bd1e2bd776d8f0de321f77698464 Mon Sep 17 00:00:00 2001 From: Deb Taylor Date: Tue, 19 Dec 2023 13:38:56 -0500 Subject: [PATCH 250/290] Release 2.8 updates to website (#480) * add yaml file updates Signed-off-by: Deb * update release numbers on SOF site Signed-off-by: Deb --------- Signed-off-by: Deb --- conf.py | 4 ++-- release.rst | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/conf.py b/conf.py index d79c6d89..6d799d6a 100755 --- a/conf.py +++ b/conf.py @@ -74,14 +74,14 @@ # General information about the project. project = u'SOF Project' -copyright = u'2023, SOF Project' +copyright = u'2024, SOF Project' author = u'SOF Project developers' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. -version = release = "2.7.0" +version = release = "2.8.0" # # The short X.Y version. diff --git a/release.rst b/release.rst index 1383c190..d44da00e 100755 --- a/release.rst +++ b/release.rst @@ -26,7 +26,7 @@ kernel, and documentation. Download the source code as a zip or tar.gz file: Source and Binary Releases -------------------------- -The latest SOF release is v2.7.0 (Sept 2023). +The latest SOF release is v2.8.0 (Dec 2023). View new feature information and release downloads for the latest and previous releases on GitHub. Firmware and SDK tool source code and binary From 0d7723d5bd095f611a77d2ffe4c3c8b650819866 Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Thu, 21 Dec 2023 09:10:20 +0200 Subject: [PATCH 251/290] getting_started: intel_debug: Remove snd_sof_intel_ipc from dyndbg list There were never a module named snd_sof_intel_ipc, at least I cannot find it in kernel history. Signed-off-by: Peter Ujfalusi --- getting_started/intel_debug/suggestions.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/getting_started/intel_debug/suggestions.rst b/getting_started/intel_debug/suggestions.rst index 93e4c22e..d97b5adc 100644 --- a/getting_started/intel_debug/suggestions.rst +++ b/getting_started/intel_debug/suggestions.rst @@ -135,7 +135,6 @@ file: options snd_intel_sdw_acpi dyndbg=+pmf # SOF internals - options snd_sof_intel_ipc dyndbg=+pmf options snd_sof_intel_hda_common dyndbg=+pmf options snd_sof_intel_hda_mlink dyndbg=+pmf options snd_sof_intel_hda dyndbg=+pmf From e541ab4a26be787ec9a297895d89b3fb3aefb259 Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Wed, 3 Jan 2024 13:27:04 +0200 Subject: [PATCH 252/290] getting_started: intel_debug: Update the sof-dyndbg.conf example Add snd_sof_intel_hda_generic to the list of modules. Signed-off-by: Peter Ujfalusi --- getting_started/intel_debug/suggestions.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/getting_started/intel_debug/suggestions.rst b/getting_started/intel_debug/suggestions.rst index d97b5adc..5a01e805 100644 --- a/getting_started/intel_debug/suggestions.rst +++ b/getting_started/intel_debug/suggestions.rst @@ -136,6 +136,7 @@ file: # SOF internals options snd_sof_intel_hda_common dyndbg=+pmf + options snd_sof_intel_hda_generic dyndbg=+pmf options snd_sof_intel_hda_mlink dyndbg=+pmf options snd_sof_intel_hda dyndbg=+pmf options snd_sof dyndbg=+pmf From eba363461df226bd1830a9b84eff90a27b20b054 Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Wed, 10 Jan 2024 15:09:25 +0200 Subject: [PATCH 253/290] intel_debug: introduction: Update the note for Meteor Lake topology path Restrict the sof-ace-tplg symlink need to Meteor Lake only and change the sentecne as suggested by @deb-intel Signed-off-by: Peter Ujfalusi --- getting_started/intel_debug/introduction.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/getting_started/intel_debug/introduction.rst b/getting_started/intel_debug/introduction.rst index 37fddd16..45ae7e2f 100644 --- a/getting_started/intel_debug/introduction.rst +++ b/getting_started/intel_debug/introduction.rst @@ -182,7 +182,7 @@ reconfigured with tools but requires expert knowledge of the ALSA/ASoC/topology - CONFIG = topology variant needed for detected hardware configuration Important notices: - - For compatibility reasons for **Meteor Lake and newer** ``/lib/firmware/intel/sof-ace-tplg`` must be symlinked to ``/lib/firmware/intel/sof-ipc4-tplg`` + - For compatibility reasons with respect to **Meteor Lake** ``/lib/firmware/intel/sof-ace-tplg`` must be symlinked to ``/lib/firmware/intel/sof-ipc4-tplg`` - The standard Linux firmware search path and order is followed. The above table covers the base "/lib/firmware" case. See https://docs.kernel.org/driver-api/firmware/fw_search_path.html for more information. - The topology folder and filename can be overridden with "tplg_path" and "tplg_filename" `snd_sof_pci` kernel parameters. From c1b4c7c1d985b061fdfcb18f167f0dfdcb1348ec Mon Sep 17 00:00:00 2001 From: Curtis Malainey Date: Wed, 31 Jan 2024 11:14:32 -0800 Subject: [PATCH 254/290] Update google tsc members --- tsc/representatives.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tsc/representatives.rst b/tsc/representatives.rst index 9b1916da..09a53106 100644 --- a/tsc/representatives.rst +++ b/tsc/representatives.rst @@ -21,9 +21,9 @@ The TSC is currently made of the following contributors +---------------+----------------------+------------------+ | Google | Curtis Malainey | @cujomalainey | +---------------+----------------------+------------------+ -| Google | Dylan Reid | @dgreid | +| Google | Johny Lin | @johnylin76 | +---------------+----------------------+------------------+ -| Google | Ben Zhang | @bzhg | +| Google | Unseated | | +---------------+----------------------+------------------+ | AMD | Carl Wakeland | @cwakeland | +---------------+----------------------+------------------+ From 533bf84a5864864420fcc5a5049b4bb2db1d1e81 Mon Sep 17 00:00:00 2001 From: Deb Taylor Date: Fri, 23 Feb 2024 13:27:44 -0500 Subject: [PATCH 255/290] requirements.txt updates (#485) * Sync remote Signed-off-by: Deb * Update Sphinx version and change sphinxcontrib-applehelp version Signed-off-by: Deb --------- Signed-off-by: Deb --- getting_started/intel_debug/introduction.rst | 0 getting_started/intel_debug/suggestions.rst | 0 scripts/requirements.txt | 8 +++++--- tsc/representatives.rst | 0 4 files changed, 5 insertions(+), 3 deletions(-) mode change 100644 => 100755 getting_started/intel_debug/introduction.rst mode change 100644 => 100755 getting_started/intel_debug/suggestions.rst mode change 100644 => 100755 tsc/representatives.rst diff --git a/getting_started/intel_debug/introduction.rst b/getting_started/intel_debug/introduction.rst old mode 100644 new mode 100755 diff --git a/getting_started/intel_debug/suggestions.rst b/getting_started/intel_debug/suggestions.rst old mode 100644 new mode 100755 diff --git a/scripts/requirements.txt b/scripts/requirements.txt index c3697fe8..e7e9c5b6 100755 --- a/scripts/requirements.txt +++ b/scripts/requirements.txt @@ -1,11 +1,13 @@ # This file hardcodes validated versions with '==', # see requirements-lax.txt for an alternative. -breathe==4.29.2 -sphinx==4.5.0 -docutils==0.17.1 + +sphinx>=7 +breathe +docutils sphinx_rtd_theme sphinxcontrib-plantuml sphinxcontrib-blockdiag +sphinxcontrib-applehelp # Workaround for warning "'ImageDraw' object has no attribute 'textsize'" diff --git a/tsc/representatives.rst b/tsc/representatives.rst old mode 100644 new mode 100755 From 3c8c515e6476b42ae3728b2d81b9978ab652477c Mon Sep 17 00:00:00 2001 From: Marc Herbert Date: Sat, 24 Feb 2024 00:59:57 +0000 Subject: [PATCH 256/290] Add FIXMEs to stop using blockdiag as it is orphaned See #472 for details. Signed-off-by: Marc Herbert --- .../mpp_layer/images/mpp_scheduling/edf_scheduling.diag | 3 +++ conf.py | 4 ++++ scripts/requirements.txt | 7 +++---- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/architectures/firmware/sof-zephyr/mpp_layer/images/mpp_scheduling/edf_scheduling.diag b/architectures/firmware/sof-zephyr/mpp_layer/images/mpp_scheduling/edf_scheduling.diag index 46a3e974..b9680b22 100644 --- a/architectures/firmware/sof-zephyr/mpp_layer/images/mpp_scheduling/edf_scheduling.diag +++ b/architectures/firmware/sof-zephyr/mpp_layer/images/mpp_scheduling/edf_scheduling.diag @@ -1,3 +1,6 @@ +// FIXME: blockdiag is orphaned and not compatible with Pillow anymore: +// https://github.com/blockdiag/blockdiag/pull/171 + blockdiag edf_scheduling { node_width = 250; diff --git a/conf.py b/conf.py index 6d799d6a..d7b075d7 100755 --- a/conf.py +++ b/conf.py @@ -30,6 +30,10 @@ # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. + + +# FIXME: blockdiag is orphaned and not compatible with Pillow anymore: +# https://github.com/thesofproject/sof-docs/issues/472 extensions = ['breathe', 'sphinx.ext.graphviz', 'sphinxcontrib.plantuml', 'sphinx.ext.todo', 'sphinx.ext.extlinks', 'sphinxcontrib.blockdiag' ] diff --git a/scripts/requirements.txt b/scripts/requirements.txt index e7e9c5b6..17aff9e6 100755 --- a/scripts/requirements.txt +++ b/scripts/requirements.txt @@ -6,11 +6,10 @@ breathe docutils sphinx_rtd_theme sphinxcontrib-plantuml -sphinxcontrib-blockdiag sphinxcontrib-applehelp -# Workaround for warning "'ImageDraw' object has no attribute 'textsize'" -# with pillow 10.0.0, see -# https://github.com/thesofproject/sof-docs/issues/472 +# blockdiag is orphaned and not compatible with pillow>=10, +# see https://github.com/thesofproject/sof-docs/issues/472 +sphinxcontrib-blockdiag pillow<10 From 424ddf43b5255b4d287709455525bdfc84084df7 Mon Sep 17 00:00:00 2001 From: Marc Herbert Date: Thu, 28 Mar 2024 09:49:45 -0700 Subject: [PATCH 257/290] ktest setup: GRUB submenu fixes (#486) The GRUB documentation used to say `GRUB_DISABLE_SUBMENU=y`, now it says `GRUB_DISABLE_SUBMENU=true` Also, the corresponding code is unreliable copy/paste/diverge: https://github.com/rhboot/grub2/commit/ee4bd79ef28e6fa4a6 This makes GRUB submenus error-prone. As a broken grub.cfg makes the system unbootable, "harden" the corresponding documentation. Signed-off-by: Marc Herbert --- .../setup_linux/setup_ktest_environment.rst | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/getting_started/setup_linux/setup_ktest_environment.rst b/getting_started/setup_linux/setup_ktest_environment.rst index 4ab236b5..2836890c 100644 --- a/getting_started/setup_linux/setup_ktest_environment.rst +++ b/getting_started/setup_linux/setup_ktest_environment.rst @@ -58,16 +58,24 @@ Set up a target sudo emacs /etc/default/grub b) Change ``GRUB_DEFAULT=[n]`` to ``GRUB_DEFAULT=saved``. - - c) Add ``GRUB_DISABLE_SUBMENU=y`` to the end of the file and save it. - This step is necessary because submenus confuse ktest. + c) You must disable GRUB submenus because they confuse ktest: + + .. code-block:: console + + echo 'GRUB_DISABLE_SUBMENU=y' | sudo tee -a /etc/default/grub.d/disable-submenu.cfg d) Update the grub configuration. .. code-block:: console - - sudo update-grub + + # Better safe than _very_ sorry + sudo cp /boot/grub/grub.cfg /boot/grub/saved_grub.cfg + + sudo update-grub + + # Make sure submenus are actually disabled + grep submenu /boot/grub/grub.cfg #. Set the default kernel. @@ -84,7 +92,7 @@ Set up a target # Print your currently booted (and known-safe) option cat /proc/cmdline # List the grub entries - awk '/^menuentry/ { print i++, '\t', $0 }' /boot/grub/grub.cfg + awk '/^menuentry|submenu/ { print i++, '\t', $0 }' /boot/grub/grub.cfg # Find the entry that matches the output of the # first command you ran, and take note of its number sudo grub-set-default [n] # Where [n] is that number @@ -135,7 +143,7 @@ Set up a target #=> saved_entry=6 # Show all, numbered kernel choices without (re)booting - awk '/^menuentry/ { print i++, '\t', $0 }' /boot/grub/grub.cfg + awk '/^menuentry|submenu/ { print i++, '\t', $0 }' /boot/grub/grub.cfg #=> 5 menuentry ... #=> 6 menuentry 'Ubuntu, with Linux 5.4.0-53-generic' --class ubuntu ... #=> 7 menuentry ... From 97e73394fd62c8f0bfcf51bb6447446abf385807 Mon Sep 17 00:00:00 2001 From: Deb Taylor Date: Mon, 1 Apr 2024 11:16:58 -0400 Subject: [PATCH 258/290] Version # updates to conf.py and release file for upcoming 2.9 release (#492) Signed-off-by: Deb --- .../mpp_layer/images/mpp_scheduling/edf_scheduling.diag | 0 conf.py | 2 +- release.rst | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) mode change 100644 => 100755 architectures/firmware/sof-zephyr/mpp_layer/images/mpp_scheduling/edf_scheduling.diag diff --git a/architectures/firmware/sof-zephyr/mpp_layer/images/mpp_scheduling/edf_scheduling.diag b/architectures/firmware/sof-zephyr/mpp_layer/images/mpp_scheduling/edf_scheduling.diag old mode 100644 new mode 100755 diff --git a/conf.py b/conf.py index d7b075d7..adfea0db 100755 --- a/conf.py +++ b/conf.py @@ -85,7 +85,7 @@ # |version| and |release|, also used in various other places throughout the # built documents. -version = release = "2.8.0" +version = release = "2.9.0" # # The short X.Y version. diff --git a/release.rst b/release.rst index d44da00e..bb4d4979 100755 --- a/release.rst +++ b/release.rst @@ -26,7 +26,7 @@ kernel, and documentation. Download the source code as a zip or tar.gz file: Source and Binary Releases -------------------------- -The latest SOF release is v2.8.0 (Dec 2023). +The latest SOF release is v2.9.0 (Mar 2024). View new feature information and release downloads for the latest and previous releases on GitHub. Firmware and SDK tool source code and binary From 7977bf560f46a220f5ed95802012e31a15bded4c Mon Sep 17 00:00:00 2001 From: Marcin Szkudlinski Date: Wed, 13 Mar 2024 13:00:52 +0100 Subject: [PATCH 259/290] rtos: io_drivers: add loopback mode description This commit adds a description of using SSP devices in loopback mode Signed-off-by: Marcin Szkudlinski --- .../rtos_layer/io_drivers/i2s/i2s_driver.rst | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/i2s/i2s_driver.rst b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/i2s/i2s_driver.rst index 110bace9..87d2bc88 100644 --- a/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/i2s/i2s_driver.rst +++ b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/i2s/i2s_driver.rst @@ -108,3 +108,18 @@ stream with already running ones. "Single" I2S links may be synchronized and aggregated by sending I2sSyncData to the I2S IO Driver. + +Loopback mode +====================================== + +I2S transmitter and receiver share data pins at IP level - the Tx pin of the transmitter +is connected to the Rx pin of the receiver. This may be used for easy creation of digital +loopbacks (LBM, loopback mode) - the receiver always does see what the sender is sending. + +Please note that + + - all the parameters of transmitter and receiver, like number of channels, data rates +and format, must match each other + - the lines are connected internally, so LBM mode may be used even if the I2S pins are not +physically available + From bbabbdf4a4eb0ea81bdd71fd9776cbd0e0d7d2f1 Mon Sep 17 00:00:00 2001 From: Liam Girdwood Date: Mon, 15 Apr 2024 15:08:10 +0100 Subject: [PATCH 260/290] Update architectures/firmware/sof-zephyr/rtos_layer/io_drivers/i2s/i2s_driver.rst Co-authored-by: Deb Taylor --- .../sof-zephyr/rtos_layer/io_drivers/i2s/i2s_driver.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/i2s/i2s_driver.rst b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/i2s/i2s_driver.rst index 87d2bc88..e9f411c0 100644 --- a/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/i2s/i2s_driver.rst +++ b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/i2s/i2s_driver.rst @@ -112,7 +112,7 @@ the I2S IO Driver. Loopback mode ====================================== -I2S transmitter and receiver share data pins at IP level - the Tx pin of the transmitter +The I2S transmitter and receiver share data pins at the IP level. The Tx pin of the transmitter is connected to the Rx pin of the receiver. This may be used for easy creation of digital loopbacks (LBM, loopback mode) - the receiver always does see what the sender is sending. From 02055a2e51bc32f8293723f9f212c77b8f85e93b Mon Sep 17 00:00:00 2001 From: Liam Girdwood Date: Mon, 15 Apr 2024 15:08:17 +0100 Subject: [PATCH 261/290] Update architectures/firmware/sof-zephyr/rtos_layer/io_drivers/i2s/i2s_driver.rst Co-authored-by: Deb Taylor --- .../sof-zephyr/rtos_layer/io_drivers/i2s/i2s_driver.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/i2s/i2s_driver.rst b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/i2s/i2s_driver.rst index e9f411c0..ea3c6aed 100644 --- a/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/i2s/i2s_driver.rst +++ b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/i2s/i2s_driver.rst @@ -116,7 +116,7 @@ The I2S transmitter and receiver share data pins at the IP level. The Tx pin of is connected to the Rx pin of the receiver. This may be used for easy creation of digital loopbacks (LBM, loopback mode) - the receiver always does see what the sender is sending. -Please note that +Please note the following: - all the parameters of transmitter and receiver, like number of channels, data rates and format, must match each other From 4217dc10d77e614bdc73212368f0e29a6c256646 Mon Sep 17 00:00:00 2001 From: Liam Girdwood Date: Mon, 15 Apr 2024 15:08:24 +0100 Subject: [PATCH 262/290] Update architectures/firmware/sof-zephyr/rtos_layer/io_drivers/i2s/i2s_driver.rst Co-authored-by: Deb Taylor --- .../sof-zephyr/rtos_layer/io_drivers/i2s/i2s_driver.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/i2s/i2s_driver.rst b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/i2s/i2s_driver.rst index ea3c6aed..0a38996e 100644 --- a/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/i2s/i2s_driver.rst +++ b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/i2s/i2s_driver.rst @@ -118,7 +118,7 @@ loopbacks (LBM, loopback mode) - the receiver always does see what the sender is Please note the following: - - all the parameters of transmitter and receiver, like number of channels, data rates + - all the parameters of transmitter and receiver, like number of channels, data rates, and format must match each other and format, must match each other - the lines are connected internally, so LBM mode may be used even if the I2S pins are not physically available From da759668c957dc3d018a9f22e2d63b4e296143d5 Mon Sep 17 00:00:00 2001 From: Liam Girdwood Date: Mon, 15 Apr 2024 15:08:31 +0100 Subject: [PATCH 263/290] Update architectures/firmware/sof-zephyr/rtos_layer/io_drivers/i2s/i2s_driver.rst Co-authored-by: Deb Taylor --- .../firmware/sof-zephyr/rtos_layer/io_drivers/i2s/i2s_driver.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/i2s/i2s_driver.rst b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/i2s/i2s_driver.rst index 0a38996e..a27ce22e 100644 --- a/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/i2s/i2s_driver.rst +++ b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/i2s/i2s_driver.rst @@ -119,7 +119,6 @@ loopbacks (LBM, loopback mode) - the receiver always does see what the sender is Please note the following: - all the parameters of transmitter and receiver, like number of channels, data rates, and format must match each other -and format, must match each other - the lines are connected internally, so LBM mode may be used even if the I2S pins are not physically available From ef2f6815da04ebaa51e7d1e186ed3654b6bfb3f9 Mon Sep 17 00:00:00 2001 From: Liam Girdwood Date: Mon, 15 Apr 2024 15:08:38 +0100 Subject: [PATCH 264/290] Update architectures/firmware/sof-zephyr/rtos_layer/io_drivers/i2s/i2s_driver.rst Co-authored-by: Deb Taylor --- .../sof-zephyr/rtos_layer/io_drivers/i2s/i2s_driver.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/i2s/i2s_driver.rst b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/i2s/i2s_driver.rst index a27ce22e..109e89a3 100644 --- a/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/i2s/i2s_driver.rst +++ b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/i2s/i2s_driver.rst @@ -119,6 +119,6 @@ loopbacks (LBM, loopback mode) - the receiver always does see what the sender is Please note the following: - all the parameters of transmitter and receiver, like number of channels, data rates, and format must match each other - - the lines are connected internally, so LBM mode may be used even if the I2S pins are not + - the lines are connected internally, so LBM mode may be used even if the I2S pins are not physically available physically available From 1c4790f29b77edf89b369ddfdc6600eefc8f0d96 Mon Sep 17 00:00:00 2001 From: Liam Girdwood Date: Mon, 15 Apr 2024 15:08:43 +0100 Subject: [PATCH 265/290] Update architectures/firmware/sof-zephyr/rtos_layer/io_drivers/i2s/i2s_driver.rst Co-authored-by: Deb Taylor --- .../firmware/sof-zephyr/rtos_layer/io_drivers/i2s/i2s_driver.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/i2s/i2s_driver.rst b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/i2s/i2s_driver.rst index 109e89a3..ef17ecae 100644 --- a/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/i2s/i2s_driver.rst +++ b/architectures/firmware/sof-zephyr/rtos_layer/io_drivers/i2s/i2s_driver.rst @@ -120,5 +120,4 @@ Please note the following: - all the parameters of transmitter and receiver, like number of channels, data rates, and format must match each other - the lines are connected internally, so LBM mode may be used even if the I2S pins are not physically available -physically available From 0671cce5bebbf089b13fac865ca96e186674ba58 Mon Sep 17 00:00:00 2001 From: Kai Vehmanen Date: Fri, 24 May 2024 14:11:27 +0300 Subject: [PATCH 266/290] developer_guides: debugability: shell: add usage documentation Add basic introduction and usage documentation on how to use Zephyr shell feature with SOF. Signed-off-by: Kai Vehmanen --- developer_guides/debugability/index.rst | 1 + developer_guides/debugability/shell/index.rst | 119 ++++++++++++++++++ 2 files changed, 120 insertions(+) create mode 100644 developer_guides/debugability/shell/index.rst diff --git a/developer_guides/debugability/index.rst b/developer_guides/debugability/index.rst index 02c712ef..ed686043 100644 --- a/developer_guides/debugability/index.rst +++ b/developer_guides/debugability/index.rst @@ -12,3 +12,4 @@ Debugability probes/index ri-info/index perf-counters/index + shell/index diff --git a/developer_guides/debugability/shell/index.rst b/developer_guides/debugability/shell/index.rst new file mode 100644 index 00000000..4f0b943c --- /dev/null +++ b/developer_guides/debugability/shell/index.rst @@ -0,0 +1,119 @@ +.. _dbg-zephyr-shell: + +Zephyr Shell +############ + +Zephyr provides a shell subystem for interactive debugging and a channel +to run custom test sequences. SOF supports use of the Zephyr shell. + +The Zephyr shell is documented at: +https://docs.zephyrproject.org/latest/services/shell/index.html + +Requirements +************ + +- SOF target platform must have Zephyr support. + +- At least one shell backend (DSP memory window, serial port, RTT, ...) compatible + with target platform. + +Build SOF with Shell Support +**************************** + +Shell is typically disabled by default and the firmware needs to be +rebuilt. For common SOF targets, a build overlay is provided in SOF +upstream to easily enable shell suppot in build. + + .. code-block:: bash + + # example build for Intel Tiger Lake platform + build-sh> sof/scripts/xtensa-build-zephyr.py tgl -o app/shell_overlay.conf + +Using Shell with Intel cavstool.py +********************************** + +This section covers use with SOF targets compatible with +CONFIG_SHELL_BACKEND_ADSP_MEMORY_WINDOW backend (for example Audio DSPs +on Intel Tiger Lake and Meteor Lake). + +Running the tool with "-p" to create a pseudo terminal for the shell: + + .. code-block:: bash + + dut-sh> sudo ./cavstool.py -l -p + INFO:cavs-fw:Existing driver "snd_sof_pci_intel_tgl" found + INFO:cavs-fw:Mapped PCI bar 0 of length 16384 bytes. + INFO:cavs-fw:Selected output stream 15 (GCAP = 0xffffffff) + INFO:cavs-fw:Mapped PCI bar 4 of length 1048576 bytes. + INFO:cavs-fw:Detected cAVS 1.8+ hardware + INFO:cavs-fw:Waiting forever for firmware handoff, ROM_STATUS = 0xffffffff + INFO:cavs-fw:FW alive, ROM_STATUS = 0x5 + INFO:cavs-fw:shell PTY at: /dev/pts/4 + +The Zephyr shell is now available at pseudo terminal /dev/pts/4 (see log above) +and can be attached with any terminal program: + + .. code-block:: bash + + dut-sh> sudo minicom -p /dev/pts/4 + Welcome to minicom 2.8 + + OPTIONS: I18n + Port /dev/modem + + Press CTRL-A Z for help on special keys + + ~$ kernel uptime + Uptime: 31600 ms + ~$ kernel stacks + 0x9e0a4e78 ll_thread0 (real size 8192): unused 6752 usage 1440 / 8192 (17 %) + 0x9e0a34b8 (real size 4096): unused 4008 usage 88 / 4096 ( 2 %) + 0x9e0a3400 (real size 4096): unused 4008 usage 88 / 4096 ( 2 %) + 0x9e0a3348 (real size 4096): unused 4008 usage 88 / 4096 ( 2 %) + 0x9e0a3290 (real size 4096): unused 4008 usage 88 / 4096 ( 2 %) + 0x9e0a37d0 edf_workq (real size 8192): unused 6304 usage 1888 / 8192 (23 %) + 0x9e0a3c48 sysworkq (real size 1024): unused 728 usage 296 / 1024 (28 %) + 0x9e0a3180 shell_adsp_memory_window (real size 2048): unused 760 usage 1288 / 2048 (62 %) + 0x9e0a3080 logging (real size 4096): unused 3488 usage 608 / 4096 (14 %) + 0x9e0a38b0 idle 00 (real size 1024): unused 824 usage 200 / 1024 (19 %) + 0xbe09df80 IRQ 00 (real size 2048): unused 1712 usage 336 / 2048 (16 %) + 0xbe09e780 IRQ 01 (real size 2048): unused 0 usage 2048 / 2048 (100 %) + 0xbe09ef80 IRQ 02 (real size 2048): unused 0 usage 2048 / 2048 (100 %) + 0xbe09f780 IRQ 03 (real size 2048): unused 0 usage 2048 / 2048 (100 %) + ~$ kernel threads + Scheduler: 1 since last call + Threads: + 0x9e0a4e78 ll_thread0 + options: 0x0, priority: -16 timeout: 0 + state: pending, entry: 0xbe02e060 + stack size 8192, unused 6752, usage 1440 / 8192 (17 %) + + 0x9e0a34b8 + options: 0x0, priority: -16 timeout: 0 + state: prestart, entry: 0xbe0154cc + stack size 4096, unused 4008, usage 88 / 4096 (2 %) + + [cut] + *0x9e0a3180 shell_adsp_memory_window + options: 0x0, priority: 14 timeout: 0 + state: , entry: 0xbe01969c + stack size 2048, unused 760, usage 1288 / 2048 (62 %) + + 0x9e0a3080 logging + options: 0x0, priority: 14 timeout: 0 + state: pending, entry: 0xbe016710 + stack size 4096, unused 3488, usage 608 / 4096 (14 %) + + 0x9e0a38b0 idle 00 + options: 0x1, priority: 15 timeout: 0 + state: , entry: 0xbe054298 + stack size 1024, unused 824, usage 200 / 1024 (19 %) + ~$ + +The memory window backend does not rely on IPC, so the shell is not +dependent on the IPC version implementation. The cavstool.py is also +implemented to handle cases where the DSP is suspended to lower power +state and the memory window is not accessible to host. When the DSP +is in such state, the shell terminal will appear inactive, but it will +resume immediately after DSP resumes to active state, without need +to rerun the cavstool.py script. From a19559333845a9fb2488c1659133b0e4042fb782 Mon Sep 17 00:00:00 2001 From: Deb Taylor Date: Wed, 17 Jul 2024 17:31:07 -0500 Subject: [PATCH 267/290] update version info in conf.py and release file (#498) Signed-off-by: Taylor, Deb --- conf.py | 2 +- release.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/conf.py b/conf.py index adfea0db..6042fbe8 100755 --- a/conf.py +++ b/conf.py @@ -85,7 +85,7 @@ # |version| and |release|, also used in various other places throughout the # built documents. -version = release = "2.9.0" +version = release = "2.10.0" # # The short X.Y version. diff --git a/release.rst b/release.rst index bb4d4979..8cad490a 100755 --- a/release.rst +++ b/release.rst @@ -26,7 +26,7 @@ kernel, and documentation. Download the source code as a zip or tar.gz file: Source and Binary Releases -------------------------- -The latest SOF release is v2.9.0 (Mar 2024). +The latest SOF release is v2.10.0 (July 2024). View new feature information and release downloads for the latest and previous releases on GitHub. Firmware and SDK tool source code and binary From fb50ad2d63eb9bd3580884d377f3efd59fd80270 Mon Sep 17 00:00:00 2001 From: "Putnam, Kevin" Date: Thu, 23 May 2024 12:20:32 -0700 Subject: [PATCH 268/290] Fixes issue where search requests hang. jQuery was not being loaded automatically. Force load it in extensions. Signed-off-by: Putnam, Kevin --- conf.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/conf.py b/conf.py index 6042fbe8..fa433227 100755 --- a/conf.py +++ b/conf.py @@ -35,7 +35,8 @@ # FIXME: blockdiag is orphaned and not compatible with Pillow anymore: # https://github.com/thesofproject/sof-docs/issues/472 extensions = ['breathe', 'sphinx.ext.graphviz', 'sphinxcontrib.plantuml', - 'sphinx.ext.todo', 'sphinx.ext.extlinks', 'sphinxcontrib.blockdiag' + 'sphinx.ext.todo', 'sphinx.ext.extlinks', 'sphinxcontrib.blockdiag', + 'sphinxcontrib.jquery' ] From d382e2c50a1868cf78fb82c736b6f0dc80d96419 Mon Sep 17 00:00:00 2001 From: "Putnam, Kevin" Date: Wed, 17 Jul 2024 08:35:21 -0700 Subject: [PATCH 269/290] adds jquery to lax requirements Signed-off-by: Putnam, Kevin --- scripts/requirements-lax.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/requirements-lax.txt b/scripts/requirements-lax.txt index fb60b139..42077b41 100644 --- a/scripts/requirements-lax.txt +++ b/scripts/requirements-lax.txt @@ -14,6 +14,7 @@ sphinx>=4.5.0 docutils>=0.17.1 sphinx_rtd_theme>=0.2.4 sphinxcontrib-blockdiag>=3.0.0 +sphinxcontrib-jquery # - Version 0.11 is the first version that supports # `plantuml_output_format=none` which is required for instant builds. From 8c2a9684984769963ad0dc50a77bcf422213b739 Mon Sep 17 00:00:00 2001 From: Guennadi Liakhovetski Date: Thu, 11 Apr 2024 14:20:04 +0200 Subject: [PATCH 270/290] developer-guide: add LLEXT module documentation Describe LLEXT loadable module support in SOF. Signed-off-by: Guennadi Liakhovetski --- developer_guides/firmware/index.rst | 1 + developer_guides/firmware/llext_modules.rst | 108 +++++++++++++++++++ getting_started/intel_debug/introduction.rst | 1 + 3 files changed, 110 insertions(+) create mode 100644 developer_guides/firmware/llext_modules.rst diff --git a/developer_guides/firmware/index.rst b/developer_guides/firmware/index.rst index c0a0709a..ee2e75cd 100644 --- a/developer_guides/firmware/index.rst +++ b/developer_guides/firmware/index.rst @@ -12,3 +12,4 @@ Developer guides and information for firmware development. porting cmake async_messaging_best_practices + llext_modules diff --git a/developer_guides/firmware/llext_modules.rst b/developer_guides/firmware/llext_modules.rst new file mode 100644 index 00000000..4832495b --- /dev/null +++ b/developer_guides/firmware/llext_modules.rst @@ -0,0 +1,108 @@ +.. _llext_modules: + +LLEXT Modules +############# + +|SOF| support for loadable modules, using Zephyr LLEXT API. + +Zephyr LLEXT API +**************** + +Please refer to https://docs.zephyrproject.org/latest/services/llext/index.html +for detailed documentation. In short, the Zephyr Linkable Loadable Extensions +(LLEXT) API implements support for run-time loading and unloading of ELF-format +executable code and data. + +SOF use of the LLEXT API +************************ + +SOF has multiple ways to implement loadable modules. LLEXT is one of them. +With it modules are built as shared or relocatable ELF objects with an addition +of a cryptographic signature, using any user-supplied key, and a manifest. When +loaded and instantiated, Zephyr LLEXT functionality is used to dynamically +resolve module internal as well as SOF and Zephyr external code and data +references. In the future support for inter-module linking will be added. + +Accessing the base firmware from LLEXT modules +********************************************** + +LLEXT modules can access all code and data from the base firmware exported, +using the ``EXPORT_SYMBOL()`` macro. Therefore writing LLEXT modules isn't very +different from built-in ones. + +Implementing LLEXT modules +************************** + +At the moment only modules, implementing the Module Adapter API +:ref:`apps-comp-world` are supported. + +.. _multiple-adapter-modules: + +It is possible to implement multiple Module Adapter modules with a common code +base, i.e. sharing a set of source files and functions. Then a single LLEXT +object would be created, implementing multiple Module Adapter interfaces. In +that case an array of ``struct sof_module_api_build_info`` objects is needed and +the TOML file should contain those multiple module entries too. +src/audio/mixin_mixout/mixin_mixout.c is an example of such a case. + +As explained above, LLEXT modules in general look very similar to native SOF +code, with the only restriction of having no access to not-exported symbols. + +LLEXT modules should also contain a ``.buildinfo`` section, containing a +``struct sof_module_api_build_info`` object and a ``.module`` section, +containing a ``struct sof_man_module_manifest`` object. The latter should also +contain a pointer to a module entry point function, returning a pointer to the +module's ``struct module_interface`` instance. All these additions can be +performed, using ``SOF_LLEXT_MOD_ENTRY()``, ``SOF_LLEXT_MODULE_MANIFEST()`` and +``SOF_LLEXT_BUILDINFO`` helper macros. See src/audio/eq_iir/eq_iir.c for an +example. + +A TOML configuration file is needed for building of LLEXT modules too. It is +generated by the C preprocessor at build time from the same components, as would +be used for a monolithic build. For this preprocessor run a small header file is +added. It mostly just includes ``platform.toml`` and ``${module}.toml``, similar +to src/samples/audio/smart_amp_test_llext/llext.toml.h. + +Finally an additional CMakeLists.txt is needed similar to +src/samples/audio/smart_amp_test_llext/CMakeLists.txt. It contains a single call +to ``sof_llext_build()``, which is an SOF helper function, using Zephyr LLEXT +cmake support by calling ``add_llext_target()`` and ``add_llext_command()``. + +With that in place, it is also possible to switch between monolithic and modular +builds by specifying the module as "tristate" in its Kconfig and selecting "m" +for modular builds. Note, that it is possible to implement third party Module +Adapter drivers, that would be built exclusively as loadable modules. Such +modules don't have to use "tristate" in their Kconfig entries. + +Installation +************ + +As specified in +:ref:`Firmware look-up paths per Intel platform ` +the |SOF| Linux kernel driver loads SOF modules by their UUIDs, +specified in the topology. For SOF in-tree modules the process of creation and +installation of modules in a deployment tree is automated by the +xtensa-build-zephyr.py script. It copies modules to the deployment tree as +files with a "llext" extension and creates symbolic links to them named as +``${UUID}.bin``. E.g. + +.. code-block:: cfg + + B36EE4DA-006F-47F9-A06D-FECBE2D8B6CE.bin -> drc.llext + +Note, that as described :ref:`above ` multiple UUIDs +can be associated with a single module, in such cases multiple symbolic links +will be created, e.g. + +.. code-block:: cfg + + 39656EB2-3B71-4049-8D3F-F92CD5C43C09.bin -> mixin_mixout.llext + 3C56505A-24D7-418F-BDDC-C1F5A3AC2AE0.bin -> mixin_mixout.llext + +See :ref:`apps-component-overview` for more information on UUID use by SOF +component and module adapter drivers. + +It is also possible to avoid using the script by running ``west build`` to build +an SOF image and any modules, then using the cross-compiler to preprocess TOML +files and finally by running rimage to sign them. This would generate the same +result but figuring out all the command-line arguments would be rather difficult. diff --git a/getting_started/intel_debug/introduction.rst b/getting_started/intel_debug/introduction.rst index 45ae7e2f..2079812c 100755 --- a/getting_started/intel_debug/introduction.rst +++ b/getting_started/intel_debug/introduction.rst @@ -119,6 +119,7 @@ configuration issue. Linux SOF will look up firmware files at the following paths: +.. _intel_firmware_paths: .. list-table:: Firmware look-up paths per Intel platform :widths: 55 5 50 25 :header-rows: 1 From d1d9f2bafaa87cf00bbca23dacad5f5ed818d64b Mon Sep 17 00:00:00 2001 From: Jyri Sarha Date: Fri, 13 Sep 2024 16:30:26 +0300 Subject: [PATCH 271/290] developer_guides: coredump-reader: Add NOTE for Zephyr Add a note that these instructions are not valid for SOF on Zephyr and add link to relevant piece of Zephyr documentation. Signed-off-by: Jyri Sarha --- developer_guides/debugability/coredump-reader/index.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/developer_guides/debugability/coredump-reader/index.rst b/developer_guides/debugability/coredump-reader/index.rst index 71661c82..1ca6d5d2 100644 --- a/developer_guides/debugability/coredump-reader/index.rst +++ b/developer_guides/debugability/coredump-reader/index.rst @@ -3,6 +3,10 @@ Coredump-reader ############### +NOTE: These instructions do not work with SOF running on Zephyr, +please refer to +https://docs.zephyrproject.org/latest/services/debugging/coredump.html + Tool for processing FW stack dumps. In verbose mode it prints the stack leading to the core dump including DSP registers and function calls. It outputs unwrapped gdb command function call addresses to human readable From 84f3890c343049642adfb9455c6b4351a8178279 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Sep 2024 22:17:59 +0000 Subject: [PATCH 272/290] build(deps): bump actions/download-artifact in /.github/workflows Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 3 to 4.1.7. - [Release notes](https://github.com/actions/download-artifact/releases) - [Commits](https://github.com/actions/download-artifact/compare/v3...v4.1.7) --- updated-dependencies: - dependency-name: actions/download-artifact dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- .github/workflows/pull-request.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) mode change 100755 => 100644 .github/workflows/pull-request.yml diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml old mode 100755 new mode 100644 index 6586ba61..1f094fdf --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -87,7 +87,7 @@ jobs: # download the build result from the same workflow # https://docs.github.com/en/actions/guides/storing-workflow-data-as-artifacts - name: download HTML - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4.1.7 with: name: html path: html From 1e68b2e6300d6539e2f684ba95d8efbdee1f1fed Mon Sep 17 00:00:00 2001 From: Deb Taylor Date: Thu, 26 Sep 2024 13:22:52 -0700 Subject: [PATCH 273/290] Update files to indicate new release (#502) Signed-off-by: Taylor, Deb --- conf.py | 2 +- release.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/conf.py b/conf.py index fa433227..4e1d22c7 100755 --- a/conf.py +++ b/conf.py @@ -86,7 +86,7 @@ # |version| and |release|, also used in various other places throughout the # built documents. -version = release = "2.10.0" +version = release = "2.11.0" # # The short X.Y version. diff --git a/release.rst b/release.rst index 8cad490a..ee119d71 100755 --- a/release.rst +++ b/release.rst @@ -26,7 +26,7 @@ kernel, and documentation. Download the source code as a zip or tar.gz file: Source and Binary Releases -------------------------- -The latest SOF release is v2.10.0 (July 2024). +The latest SOF release is v2.11.0 (Sept 2024). View new feature information and release downloads for the latest and previous releases on GitHub. Firmware and SDK tool source code and binary From a0e05fafc876f82924e2784a208d4528ae1dde9f Mon Sep 17 00:00:00 2001 From: Deb Taylor Date: Thu, 26 Sep 2024 13:24:04 -0700 Subject: [PATCH 274/290] Update pull-request.yml (#503) Updating download artifact to 4.1.7 is breaking change to the publication workflow. Changing upload artifact to match. --- .github/workflows/pull-request.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index 1f094fdf..11b29b37 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -74,7 +74,7 @@ jobs: # https://docs.github.com/en/actions/guides/storing-workflow-data-as-artifacts - name: upload HTML for deploy if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/publish' }} - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: html path: _build/html From b7080b4b8f9b2b4ffc2fc4a8b10a2a4c16dab1e6 Mon Sep 17 00:00:00 2001 From: Kai Vehmanen Date: Fri, 20 Sep 2024 17:54:46 +0300 Subject: [PATCH 275/290] platforms: add separate table for older platforms As this topic has been discussed in many pull requests and bugs, add documentation on which platforms are supported in SOF main and which are only supported in stable-vx.yy branches. Also add a note explainin how sof-bin releases are made, gathering binaries for for all platforms. Signed-off-by: Kai Vehmanen --- platforms/index.rst | 38 ++++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/platforms/index.rst b/platforms/index.rst index 57930c4a..a582511d 100644 --- a/platforms/index.rst +++ b/platforms/index.rst @@ -14,16 +14,8 @@ Platform and board specific support is continually added to the SOF project as d "Host Testbench", "PC command line", "N/A", "N/A", "N/A", "N/A Files are used to simulate audio interfaces" "Qemu", "All supported SOF HW platforms", "N/A", "N/A", "N/A", "WiP Files will be used to simulate audio interfaces" - "Intel Bay Trail / Merrifield", "Xtensa HiFi2 EP", "1 @ 50 - 400MHz", "25MHz", "96KB IRAM / 192KB DRAM", "3 x SSP (I2S, PCM)" - "Intel Cherry Trail / Braswell", "Xtensa HiFi2 EP", "1 @ 50 - 400MHz", "19.2MHz", "96KB IRAM / 192KB DRAM", "6 x SSP (I2S, PCM)" - "Intel Broadwell", "Xtensa HiFi2 EP", "1 @ 50 - 400MHz", "24MHz", "320KB IRAM / 640KB DRAM", "2 x SSP (I2S, PCM)" - "Intel Apollo Lake / Gemini Lake", "Xtensa HiFi3", "2 @ 100 - 400MHz", "19.2MHz", "128KB LP SRAM / 512KB HP SRAM", "6 x SSP (I2S, PCM), HDA, DMIC" - "Intel Cannon Lake / Whiskey Lake / Comet Lake", "Xtensa HiFi3", "4 @ 120 - 400MHz", "24MHz", "64KB LP / 3008KB HP SRAM", "3 x SSP (I2S, PCM), HDA, DMIC, Soundwire" - "Intel Sue Creek", "Xtensa HiFi3", "2 @ 120 - 400MHz","24MHz", "64KB LP SRAM / 4096KB HP SRAM", "6 x SSP (I2S, PCM), DMIC" - "Intel Ice Lake", "Xtensa HiFi3", "4 @ 120 - 400MHz", "38.4MHz", "64KB LP SRAM / 3008KB HP SRAM", "6 x SSP (I2S, PCM), HDA, DMIC, Soundwire" - "Intel Jasper Lake", "Xtensa HiFi3", "2 @ 120 - 400MHz", "38.4MHz", "64KB LP SRAM / 1024KB HP SRAM", "3 x SSP (I2S, PCM), HDA, DMIC, Soundwire" - "Intel Tiger Lake", "Xtensa HiFi3", "4 @ 120 - 400MHz", "38.4MHz", "64KB LP SRAM / 2944KB HP SRAM", "6 x SSP (I2S, PCM), HDA, DMIC, Soundwire" - "Intel Alder Lake", "Xtensa HiFi3", "4 @ 120 - 400MHz", "38.4MHz", "64KB LP SRAM / 2944KB HP SRAM", "6 x SSP (I2S, PCM), HDA, DMIC, Soundwire" + "Intel Tiger Lake with IPC4", "Xtensa HiFi3", "4 @ 120 - 400MHz", "38.4MHz", "64KB LP SRAM / 2944KB HP SRAM", "6 x SSP (I2S, PCM), HDA, DMIC, Soundwire" + "Intel Alder Lake with IPC4", "Xtensa HiFi3", "4 @ 120 - 400MHz", "38.4MHz", "64KB LP SRAM / 2944KB HP SRAM", "6 x SSP (I2S, PCM), HDA, DMIC, Soundwire" "NXP i.MX8", "Xtensa HiFi4", "1 @ 666MHz", "TBD", "64 KB TCM / 448 KB OCRAM / 8MB SDRAM", "1 x ESAI, 1 x SAI" "NXP i.MX8X", "Xtensa HiFi4", "1 @ 640MHz", "TBD", "64 KB TCM / 448 KB OCRAM / 8MB SDRAM", "1 x ESAI, 1 x SAI" "NXP i.MX8M", "Xtensa HiFi4", "1 @ 800MHz", "TBD", "64 KB TCM / 256 KB OCRAM / 8MB SDRAM", "1 x SAI, MICFIL" @@ -38,6 +30,32 @@ When support for a new platform is being added, certain interfaces required by SOF infrastructure must be implemented. Refer to Platform API documentation for details. +Some platforms have been supported by SOF in the past, but are no longer +supported in SOF mainline ("main" branch). Below table lists such platforms, +the last SOF major release that had support for the platform and the stable +branch to use. For every SOF release, a stable branch is created and critical +bugfixes can be submitted and released via these stable branches. + +.. csv-table:: Platforms No Longer Supported in Mainline + :header: "Platform", "Last Release", "Branch", "Architecture", "Cores/Clocks", "Platform Clock", "Memory", "Audio Interfaces" + :widths: 20, 10, 10, 20, 10, 10, 10, 20 + + "Intel Bay Trail / Merrifield", "2.2", "stable-v2.2", "Xtensa HiFi2 EP", "1 @ 50 - 400MHz", "25MHz", "96KB IRAM / 192KB DRAM", "3 x SSP (I2S, PCM)" + "Intel Cherry Trail / Braswell", "2.2", "stable-v2.2", "Xtensa HiFi2 EP", "1 @ 50 - 400MHz", "19.2MHz", "96KB IRAM / 192KB DRAM", "6 x SSP (I2S, PCM)" + "Intel Broadwell", "2.2", "stable-v2.2", "Xtensa HiFi2 EP", "1 @ 50 - 400MHz", "24MHz", "320KB IRAM / 640KB DRAM", "2 x SSP (I2S, PCM)" + "Intel Apollo Lake / Gemini Lake", "2.2", "stable-v2.2", "Xtensa HiFi3", "2 @ 100 - 400MHz", "19.2MHz", "128KB LP SRAM / 512KB HP SRAM", "6 x SSP (I2S, PCM), HDA, DMIC" + "Intel Cannon Lake / Whiskey Lake / Comet Lake", "2.2", "stable-v2.2", "Xtensa HiFi3", "4 @ 120 - 400MHz", "24MHz", "64KB LP / 3008KB HP SRAM", "3 x SSP (I2S, PCM), HDA, DMIC, Soundwire" + "Intel Sue Creek", "2.2", "stable-v2.2", "Xtensa HiFi3", "2 @ 120 - 400MHz","24MHz", "64KB LP SRAM / 4096KB HP SRAM", "6 x SSP (I2S, PCM), DMIC" + "Intel Ice Lake", "2.2", "stable-v2.2", "Xtensa HiFi3", "4 @ 120 - 400MHz", "38.4MHz", "64KB LP SRAM / 3008KB HP SRAM", "6 x SSP (I2S, PCM), HDA, DMIC, Soundwire" + "Intel Jasper Lake", "2.2", "stable-v2.2", "Xtensa HiFi3", "2 @ 120 - 400MHz", "38.4MHz", "64KB LP SRAM / 1024KB HP SRAM", "3 x SSP (I2S, PCM), HDA, DMIC, Soundwire" + "Intel Tiger Lake with IPC3", "2.2", "stable-v2.2", "Xtensa HiFi3", "4 @ 120 - 400MHz", "38.4MHz", "64KB LP SRAM / 2944KB HP SRAM", "6 x SSP (I2S, PCM), HDA, DMIC, Soundwire" + "Intel Alder Lake with IPC3", "2.2", "stable-v2.2", "Xtensa HiFi3", "4 @ 120 - 400MHz", "38.4MHz", "64KB LP SRAM / 2944KB HP SRAM", "6 x SSP (I2S, PCM), HDA, DMIC, Soundwire" + +The periodic sof-bin releases + +contain latest binaries for all platforms, both from SOF main and +latest binaries from "stable-vX.YY" branches. + Minimum Platform Requirements ***************************** From 163bac3c1e9ab439723c73f64540d6acfc4b3242 Mon Sep 17 00:00:00 2001 From: Curtis Malainey Date: Thu, 21 Nov 2024 12:38:45 -0800 Subject: [PATCH 276/290] admin: remove exited admin members Cleanup Signed-off-by: Curtis Malainey --- maintainers/admin.rst | 2 -- 1 file changed, 2 deletions(-) diff --git a/maintainers/admin.rst b/maintainers/admin.rst index 209858f9..44a6d491 100644 --- a/maintainers/admin.rst +++ b/maintainers/admin.rst @@ -13,8 +13,6 @@ to multiple contributors: +---------------+-------------------+---------------+ | Intel | Marcin Maka | @mmaka1 | +---------------+-------------------+---------------+ -| Intel | Pierre Bossart | @plbossart | -+---------------+-------------------+---------------+ | Intel | Ranjani Sridharan | @ranj063 | +---------------+-------------------+---------------+ | NXP | Daniel Baluta | @dbaluta | From 99916eae9a0514e1daf879851672f0275d13b504 Mon Sep 17 00:00:00 2001 From: Curtis Malainey Date: Thu, 21 Nov 2024 12:39:28 -0800 Subject: [PATCH 277/290] admin: replace google side admin Signed-off-by: Curtis Malainey --- maintainers/admin.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maintainers/admin.rst b/maintainers/admin.rst index 44a6d491..450bc783 100644 --- a/maintainers/admin.rst +++ b/maintainers/admin.rst @@ -17,7 +17,7 @@ to multiple contributors: +---------------+-------------------+---------------+ | NXP | Daniel Baluta | @dbaluta | +---------------+-------------------+---------------+ -| Google | Curtis Malainey | @cujomalainey | +| Google | Johny Lin | @johnylin76 | +---------------+-------------------+---------------+ Administrators may override specific merge rules, for example merge a From e26df4f0efd5d748269819b32a6f2f552b635137 Mon Sep 17 00:00:00 2001 From: Curtis Malainey Date: Thu, 21 Nov 2024 12:40:58 -0800 Subject: [PATCH 278/290] tsc: remove cujomalainey Signed-off-by: Curtis Malainey --- tsc/representatives.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tsc/representatives.rst b/tsc/representatives.rst index 09a53106..66b7ff4d 100755 --- a/tsc/representatives.rst +++ b/tsc/representatives.rst @@ -19,12 +19,12 @@ The TSC is currently made of the following contributors +---------------+----------------------+------------------+ | NXP | Daniel Baluta | @dbaluta | +---------------+----------------------+------------------+ -| Google | Curtis Malainey | @cujomalainey | -+---------------+----------------------+------------------+ | Google | Johny Lin | @johnylin76 | +---------------+----------------------+------------------+ | Google | Unseated | | +---------------+----------------------+------------------+ +| Google | Unseated | | ++---------------+----------------------+------------------+ | AMD | Carl Wakeland | @cwakeland | +---------------+----------------------+------------------+ | AMD | Virendra Pratap Arya | @vp-arya | From ef63f8940dcf0e77cb4472f962d5b033ecbac241 Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Wed, 11 Dec 2024 13:38:53 +0200 Subject: [PATCH 279/290] intel_debug: introduction: Add information about modular SOF release content The firmware supports library loading starting with Meteor Lake and the release system is prepared to offer modular SOF releases. Update the documentation of the SOF release content to reflect this. Signed-off-by: Peter Ujfalusi --- getting_started/intel_debug/introduction.rst | 57 +++++++++++++++++--- 1 file changed, 50 insertions(+), 7 deletions(-) diff --git a/getting_started/intel_debug/introduction.rst b/getting_started/intel_debug/introduction.rst index 2079812c..fe66798c 100755 --- a/getting_started/intel_debug/introduction.rst +++ b/getting_started/intel_debug/introduction.rst @@ -94,7 +94,10 @@ User space and filesystem requirements Selecting the SOF driver is not enough. Audio is properly configured only if the following elements are present on the file system. -1. Firmware binary +1. Firmware +----------- + +1.1. Base firmware ------------------ The firmware file, ``/lib/firmware/intel/sof/sof-tgl.ri`` (example @@ -117,6 +120,46 @@ Linux kernel to query whether or not the firmware authentication is enabled, which means `dmesg` logs cannot be provided to alert the user to an ME configuration issue. +.. _loadable-libraries: + +1.2. Loadable libraries +----------------------- + +An IPC4 library is a container of a single or multiple modules (bundle) which +can be loaded to the firmware after it is booted up. +Library loading is supported on Meteor Lake (ACE1) or newer platforms. + +Background information: the base firmware always resides in DSP SRAM while the +loaded library is stored in DRAM memory and only the needed code is copied to +SRAM for execution. By moving modules out from the base firmware to a library +can reduce the overall SRAM use depending on the device configuration and +topology. + +See :ref:`llext_modules` for technical details. + +1.3. Monolithic and modular SOF releases +---------------------------------------- + +SOF project releases for Intel platforms are either monolithic (only a single firmware binary) or modular (base firmware and external libraries). + +1.3.1. Modular SOF releases +--------------------------- + +See :ref:`loadable-libraries` for details about library support in general. + +The released libraries are: + - **sof-PLAT-openmodules.ri** : the bundle contains modules for audio processing not included in the base firmware + - **sof-PLAT-debug.ri** : the bundle contains modules that are needed for firmware debugging and profiling. Used by developers and for bug reporting if needed + - **UUID.bin** : Mainly 3rd party libraries identified by UUID. If the library contains multiple modules then a UUID symlink must be provided for each one. + +Notes: + - The Kernel will attempt to load \*-openmodules.ri followed by \*-debug.ri from the library path after the base firmware boot if they exist. + - additional libraries referenced by topology files or drivers will be loaded based on the UUID of the module from the library path. + + +1.4 Firmware lookup paths +------------------------- + Linux SOF will look up firmware files at the following paths: .. _intel_firmware_paths: @@ -144,14 +187,14 @@ Linux SOF will look up firmware files at the following paths: - IPC4 - /lib/firmware/intel/sof-ipc4/PLAT/community/sof-PLAT.ri - PLAT = tgl, adl, rpl, mtl, lnl, ... - * - Tiger Lake and newer Loadable Module + * - Meteor Lake and newer Loadable libraries - IPC4 - - /lib/firmware/intel/sof-ipc4-lib/PLAT/UUID.bin - - PLAT as above, UUID = UUID of the module - * - Tiger Lake and newer Loadable Module (community signed) + - /lib/firmware/intel/sof-ipc4-lib/PLAT/ + - PLAT = mtl, lnl, ... + * - Meteor Lake and newer Loadable libraries (community signed) - IPC4 - - /lib/firmware/intel/sof-ipc4-lib/PLAT/community/UUID.bin - - PLAT as above, UUID = UUID of the module + - /lib/firmware/intel/sof-ipc4-lib/PLAT/community/ + - PLAT = mtl, lnl, ... Important notices: - The standard Linux firmware search path and order is followed. The above table covers the base "/lib/firmware" case. See https://docs.kernel.org/driver-api/firmware/fw_search_path.html for more information. From 6eee88fce872bf03e3c72438272b33c5dd0c0ede Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Mon, 16 Dec 2024 18:24:35 +0200 Subject: [PATCH 280/290] intel_debug: introduction: Detail description of a modular firmware release Separate the firmware lookup table for non-modular and modular SOF releases to be able to document the locations and file names the firmware will be looking for the individual files. Extend the description of the two type of SOF release and convert the list-table to a normal table for better descriptions for the configurations. Signed-off-by: Peter Ujfalusi --- getting_started/intel_debug/introduction.rst | 105 ++++++++++--------- 1 file changed, 58 insertions(+), 47 deletions(-) diff --git a/getting_started/intel_debug/introduction.rst b/getting_started/intel_debug/introduction.rst index fe66798c..11e8ca55 100755 --- a/getting_started/intel_debug/introduction.rst +++ b/getting_started/intel_debug/introduction.rst @@ -127,7 +127,7 @@ configuration issue. An IPC4 library is a container of a single or multiple modules (bundle) which can be loaded to the firmware after it is booted up. -Library loading is supported on Meteor Lake (ACE1) or newer platforms. +Library loading is supported on Meteor Lake (ACE1) or newer platforms. Background information: the base firmware always resides in DSP SRAM while the loaded library is stored in DRAM memory and only the needed code is copied to @@ -137,64 +137,75 @@ topology. See :ref:`llext_modules` for technical details. -1.3. Monolithic and modular SOF releases ----------------------------------------- +1.3. Non-modular and modular firmware releases +---------------------------------------------- -SOF project releases for Intel platforms are either monolithic (only a single firmware binary) or modular (base firmware and external libraries). +SOF project releases for Intel platforms are either a single firmware or modular firmware based. -1.3.1. Modular SOF releases ---------------------------- +1.3.1. Non-modular firmware releases +------------------------------------ -See :ref:`loadable-libraries` for details about library support in general. +The release contains single a firmware image: **sof-PLAT.ri** -The released libraries are: +1.3.2. Modular firmware releases +-------------------------------- + +Modular SOF release is technically supported with IPC4 on Meteor Lake (MTL) or newer platforms since it depends on Loadable Library support (see :ref:`loadable-libraries` for details). + +Description of files provided by a modular release: + - **sof-PLAT.ri** : The base firmware - **sof-PLAT-openmodules.ri** : the bundle contains modules for audio processing not included in the base firmware - **sof-PLAT-debug.ri** : the bundle contains modules that are needed for firmware debugging and profiling. Used by developers and for bug reporting if needed - - **UUID.bin** : Mainly 3rd party libraries identified by UUID. If the library contains multiple modules then a UUID symlink must be provided for each one. + - **UUID.bin** : On demand loadable library identified by UUID. If the library contains multiple modules then a UUID symlink must be provided for each one. -Notes: - - The Kernel will attempt to load \*-openmodules.ri followed by \*-debug.ri from the library path after the base firmware boot if they exist. - - additional libraries referenced by topology files or drivers will be loaded based on the UUID of the module from the library path. +The main firmware can be shipped as a + - single binary (**sof-PLAT.ri**) + - split release when the base firmware (**sof-PLAT.ri**), processing modules (**sof-PLAT-openmodules.ri**) and debug/developer modules (**sof-PLAT-debug.ri**) are provided as separate binaries. + - After the base firmware boot, the kernel will load the **sof-PLAT-openmodules.ri** and **sof-PLAT-debug.ri** bundles to the firmware to provide equivalent functionality as the single binary release. + +Notes: + - additional libraries referenced by topology files or drivers will be loaded based on the UUID of the module from the library path (**UUID.bin**). 1.4 Firmware lookup paths ------------------------- -Linux SOF will look up firmware files at the following paths: - -.. _intel_firmware_paths: -.. list-table:: Firmware look-up paths per Intel platform - :widths: 55 5 50 25 - :header-rows: 1 - - * - Platform - - IPC type - - Firmware load path - - Notes - * - Raptor Lake and older - - IPC3 - - /lib/firmware/intel/sof/sof-PLAT.ri - - PLAT = glk, cml, ..., rpl - * - Raptor Lake and older (community signed) - - IPC3 - - /lib/firmware/intel/sof/community/sof-PLAT.ri - - PLAT = glk, cml, ..., rpl - * - Tiger Lake and newer - - IPC4 - - /lib/firmware/intel/sof-ipc4/PLAT/sof-PLAT.ri - - PLAT = tgl, adl, rpl, mtl, lnl, ... - * - Tiger Lake and newer (community signed) - - IPC4 - - /lib/firmware/intel/sof-ipc4/PLAT/community/sof-PLAT.ri - - PLAT = tgl, adl, rpl, mtl, lnl, ... - * - Meteor Lake and newer Loadable libraries - - IPC4 - - /lib/firmware/intel/sof-ipc4-lib/PLAT/ - - PLAT = mtl, lnl, ... - * - Meteor Lake and newer Loadable libraries (community signed) - - IPC4 - - /lib/firmware/intel/sof-ipc4-lib/PLAT/community/ - - PLAT = mtl, lnl, ... +Linux SOF will look up firmware files at the following paths. + +Look-up paths per Intel platform for **non-modular firmware releases** + +.. _intel_non_modular_firmware_paths: + ++-----------------------------------------------------------+--------+------------------------------------------------+-----------+-----------------------------------+ +|Platform |IPC type|Load path |File name |Notes | ++===========================================================+========+================================================+===========+===================================+ +|Raptor Lake and older |IPC3 |/lib/firmware/intel/sof/ |sof-PLAT.ri|PLAT = glk, cml, ..., rpl | ++-----------------------------------------------------------+ +------------------------------------------------+ | | +|Raptor Lake and older (community signed) | |/lib/firmware/intel/sof/community/ | | | ++-----------------------------------------------------------+--------+------------------------------------------------+ +-----------------------------------+ +|Tiger Lake and newer |IPC4 |/lib/firmware/intel/sof-ipc4/PLAT/ | |PLAT = tgl, adl, rpl, mtl, lnl, ...| ++-----------------------------------------------------------+ +------------------------------------------------+ | | +|Tiger Lake and newer (community signed) | |/lib/firmware/intel/sof-ipc4/PLAT/community/ | | | ++-----------------------------------------------------------+--------+------------------------------------------------+-----------+-----------------------------------+ + +Look-up paths per Intel platform for **modular firmware releases (IPC4 only)** + +.. _intel_modular_firmware_paths: + ++-----------------------------------------------------------+------------------------------------------------+-----------------------------+----------------------+ +|Platform |Load path |File name |Notes | ++===========================================================+================================================+=============================+======================+ +|Meteor Lake and newer |/lib/firmware/intel/sof-ipc4/PLAT/ || || PLAT = mtl, lnl, ...| +| | || sof-PLAT.ri || [*] PLAT = ptl, ... | +| | || sof-PLAT-openmodules.ri [*]| | +| | || sof-PLAT-debug.ri [*]| | ++-----------------------------------------------------------+------------------------------------------------+ | | +|Meteor Lake and newer (community signed) |/lib/firmware/intel/sof-ipc4/PLAT/community/ | | | ++-----------------------------------------------------------+------------------------------------------------+-----------------------------+ | +|Meteor Lake and newer Loadable libraries |/lib/firmware/intel/sof-ipc4-lib/PLAT/ |UUID.bin | | ++-----------------------------------------------------------+------------------------------------------------+ | | +|Meteor Lake and newer Loadable libraries (community signed)|/lib/firmware/intel/sof-ipc4-lib/PLAT/community/| | | ++-----------------------------------------------------------+------------------------------------------------+-----------------------------+----------------------+ Important notices: - The standard Linux firmware search path and order is followed. The above table covers the base "/lib/firmware" case. See https://docs.kernel.org/driver-api/firmware/fw_search_path.html for more information. From e7485000620f3a5a54949f94a099e9a926ab44fe Mon Sep 17 00:00:00 2001 From: Bard Liao Date: Tue, 14 Jan 2025 17:47:30 +0800 Subject: [PATCH 281/290] topology2: add split topologies description Describe what are split topologies and how to create it. Signed-off-by: Bard Liao --- developer_guides/topology2/topology2.rst | 47 ++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/developer_guides/topology2/topology2.rst b/developer_guides/topology2/topology2.rst index 0d3538b1..86b5db62 100644 --- a/developer_guides/topology2/topology2.rst +++ b/developer_guides/topology2/topology2.rst @@ -1332,6 +1332,53 @@ You can use the ``-P`` switch to convert a 2.0 configuration file to the 1.0 con alsatplg <-D args=values> -P input.conf -o output.conf +Split topologies +**************** + +Linux kernel can load multiple topologies, a topology for a single function. +This feature is useful to support SDCA setups with standardized components. And no need to create topologies +for every new product. To achieve this, you need to split the topology into multiple tplg files. +The split topology files should be named as follows: + +.. code-block:: bash + + sof---id.tplg + +Currently is only needed for the DMIC function and not needed for SDCA functions in general. +It should be mtl, lnl, etc. + +Where should be one of + +.. code-block:: bash + + sdca-jack: SDCA headphone and headset. + sdca-amp: SDCA amp, where n is the amp link numbers. + sdca-mic: SDCA host mic. + dmic-ch: PCH DMIC, where n is the number of supported channels. Currently, only 2ch and 4ch are supported. + hdmi-pcm: HDMI with PCM id starts from . The is 3 for the "sof-hda-dsp" card and 5 for other cards. + + +For example + +.. code-block:: bash + + sof-sdca-2amp-id2.tplg + sof-sdca-mic-id4.tplg + sof-arl-dmic-2ch-id5.tplg + sof-hdmi-pcm5-id7.tplg + +The split topologies are the subset of the monolithic topology. Usually, you just need to add a description with proper +macro settings to disable the features that you don't need and set the first BE ID that in the topology in the cmake file +to generate the split topologies. + +For example + +.. code-block:: bash + + "cavs-sdw\;sof-arl-sdca-2amp-id2\;PLATFORM=mtl,NUM_SDW_AMP_LINKS=2,SDW_JACK=false,\ + SDW_AMP_FEEDBACK=false,SDW_SPK_STREAM=Playback-SmartAmp,NUM_HDMIS=0" + + Topology reminders ****************** From 52be2820318f4e702a52e8784dfb3eb67cf5fb5b Mon Sep 17 00:00:00 2001 From: Christopher Turner Date: Wed, 19 Feb 2025 12:31:57 -0600 Subject: [PATCH 282/290] conf.py: remove unused html_theme_path configuration Per build warning; WARNING: Calling get_html_theme_path is deprecated. If you are calling it to define html_theme_path, you are safe to remove that code. So removing the code to get rid of warning. Signed-off-by: Christopher Turner --- conf.py | 1 - 1 file changed, 1 deletion(-) diff --git a/conf.py b/conf.py index 4e1d22c7..77018705 100755 --- a/conf.py +++ b/conf.py @@ -132,7 +132,6 @@ sys.stderr.write('Warning: sphinx_rtd_theme missing. Use pip to install it.\n') else: html_theme = "sphinx_rtd_theme" - html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] html_theme_options = { 'canonical_url': '', 'analytics_id': 'GTM-M4BL5NF', From be866f6c3d30da8245d94c743e9047a0b12ffa4c Mon Sep 17 00:00:00 2001 From: Christopher Turner Date: Wed, 19 Feb 2025 12:45:57 -0600 Subject: [PATCH 283/290] conf.py: remove display_version configuration the option for display_version for the sphinx-rtd-theme was deprecated since v3.0.0 Signed-off-by: Christopher Turner --- conf.py | 1 - 1 file changed, 1 deletion(-) diff --git a/conf.py b/conf.py index 77018705..c64f3493 100755 --- a/conf.py +++ b/conf.py @@ -136,7 +136,6 @@ 'canonical_url': '', 'analytics_id': 'GTM-M4BL5NF', 'logo_only': False, - 'display_version': True, 'prev_next_buttons_location': 'None', # Toc options 'collapse_navigation': False, From c7bf0c1e9818b7348c0e0f01e36aa4fdf43817db Mon Sep 17 00:00:00 2001 From: Christopher Turner Date: Wed, 19 Feb 2025 12:52:11 -0600 Subject: [PATCH 284/290] developer_guides: llext_modules.rst: modify broken link for Intel firmware paths update broken link to Intel firmware paths in llext_modules.rst from intel_firmware_paths to intel_modular_firmware_paths to point to correct location and fix doc build errors. Signed-off-by: Christopher Turner --- developer_guides/firmware/llext_modules.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/developer_guides/firmware/llext_modules.rst b/developer_guides/firmware/llext_modules.rst index 4832495b..e4040d54 100644 --- a/developer_guides/firmware/llext_modules.rst +++ b/developer_guides/firmware/llext_modules.rst @@ -78,7 +78,7 @@ Installation ************ As specified in -:ref:`Firmware look-up paths per Intel platform ` +:ref:`Firmware look-up paths per Intel platform ` the |SOF| Linux kernel driver loads SOF modules by their UUIDs, specified in the topology. For SOF in-tree modules the process of creation and installation of modules in a deployment tree is automated by the From e99e90f677739c6e896e43dcbeaf4538773b4640 Mon Sep 17 00:00:00 2001 From: Suraj Sonawane Date: Thu, 13 Mar 2025 16:58:52 +0530 Subject: [PATCH 285/290] build_testbench: Fix mhwaveedit command The command `mhWaveEdit audio_out.wav` was incorrect because the package installs the binary as `mhwaveedit` (all lowercase). This commit corrects the capitalization to avoid command not found errors. Signed-off-by: Suraj Sonawane --- developer_guides/testbench/build_testbench.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/developer_guides/testbench/build_testbench.rst b/developer_guides/testbench/build_testbench.rst index 3f707b10..c6173507 100644 --- a/developer_guides/testbench/build_testbench.rst +++ b/developer_guides/testbench/build_testbench.rst @@ -115,7 +115,7 @@ it can be launched to an audio editor tool such as mhWaveEdit: .. code-block:: bash paplay audio_out.wav - mhWaveEdit audio_out.wav + mhwaveedit audio_out.wav .. figure:: fig_mhwaveedit.png From 6e56ea942f94147f590b44374223d98385c3ea4d Mon Sep 17 00:00:00 2001 From: Dmitrii Golovanov Date: Mon, 24 Mar 2025 20:42:37 +0100 Subject: [PATCH 286/290] Reset unwanted executable attributes Reset executable attributes on .rst, .txt, .diag files as well as on CODEOWNERS. Signed-off-by: Dmitrii Golovanov --- CODEOWNERS | 0 algos/demux/demux.rst | 0 architectures/firmware/index.rst | 0 architectures/firmware/intel/cavs/cavs-boot/apollolake/index.rst | 0 .../firmware/intel/cavs/cavs-boot/cavs-dsp-boot-overview.rst | 0 architectures/firmware/intel/cavs/index.rst | 0 architectures/firmware/intel/index.rst | 0 architectures/firmware/sof-xtos/schedulers.rst | 0 .../mpp_layer/images/mpp_scheduling/edf_scheduling.diag | 0 .../firmware/sof-zephyr/rtos_layer/zephyr_kernel_overview.rst | 0 architectures/index.rst | 0 getting_started/build-guide/build-from-scratch.rst | 0 getting_started/build-guide/build-with-zephyr.rst | 0 getting_started/index.rst | 0 getting_started/intel_debug/introduction.rst | 0 getting_started/intel_debug/suggestions.rst | 0 getting_started/nxp/sof_imx_user_guide.rst | 0 platforms/intel-cavs/commons/work-queue.rst | 0 release.rst | 0 scripts/requirements.txt | 0 tsc/representatives.rst | 0 21 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 CODEOWNERS mode change 100755 => 100644 algos/demux/demux.rst mode change 100755 => 100644 architectures/firmware/index.rst mode change 100755 => 100644 architectures/firmware/intel/cavs/cavs-boot/apollolake/index.rst mode change 100755 => 100644 architectures/firmware/intel/cavs/cavs-boot/cavs-dsp-boot-overview.rst mode change 100755 => 100644 architectures/firmware/intel/cavs/index.rst mode change 100755 => 100644 architectures/firmware/intel/index.rst mode change 100755 => 100644 architectures/firmware/sof-xtos/schedulers.rst mode change 100755 => 100644 architectures/firmware/sof-zephyr/mpp_layer/images/mpp_scheduling/edf_scheduling.diag mode change 100755 => 100644 architectures/firmware/sof-zephyr/rtos_layer/zephyr_kernel_overview.rst mode change 100755 => 100644 architectures/index.rst mode change 100755 => 100644 getting_started/build-guide/build-from-scratch.rst mode change 100755 => 100644 getting_started/build-guide/build-with-zephyr.rst mode change 100755 => 100644 getting_started/index.rst mode change 100755 => 100644 getting_started/intel_debug/introduction.rst mode change 100755 => 100644 getting_started/intel_debug/suggestions.rst mode change 100755 => 100644 getting_started/nxp/sof_imx_user_guide.rst mode change 100755 => 100644 platforms/intel-cavs/commons/work-queue.rst mode change 100755 => 100644 release.rst mode change 100755 => 100644 scripts/requirements.txt mode change 100755 => 100644 tsc/representatives.rst diff --git a/CODEOWNERS b/CODEOWNERS old mode 100755 new mode 100644 diff --git a/algos/demux/demux.rst b/algos/demux/demux.rst old mode 100755 new mode 100644 diff --git a/architectures/firmware/index.rst b/architectures/firmware/index.rst old mode 100755 new mode 100644 diff --git a/architectures/firmware/intel/cavs/cavs-boot/apollolake/index.rst b/architectures/firmware/intel/cavs/cavs-boot/apollolake/index.rst old mode 100755 new mode 100644 diff --git a/architectures/firmware/intel/cavs/cavs-boot/cavs-dsp-boot-overview.rst b/architectures/firmware/intel/cavs/cavs-boot/cavs-dsp-boot-overview.rst old mode 100755 new mode 100644 diff --git a/architectures/firmware/intel/cavs/index.rst b/architectures/firmware/intel/cavs/index.rst old mode 100755 new mode 100644 diff --git a/architectures/firmware/intel/index.rst b/architectures/firmware/intel/index.rst old mode 100755 new mode 100644 diff --git a/architectures/firmware/sof-xtos/schedulers.rst b/architectures/firmware/sof-xtos/schedulers.rst old mode 100755 new mode 100644 diff --git a/architectures/firmware/sof-zephyr/mpp_layer/images/mpp_scheduling/edf_scheduling.diag b/architectures/firmware/sof-zephyr/mpp_layer/images/mpp_scheduling/edf_scheduling.diag old mode 100755 new mode 100644 diff --git a/architectures/firmware/sof-zephyr/rtos_layer/zephyr_kernel_overview.rst b/architectures/firmware/sof-zephyr/rtos_layer/zephyr_kernel_overview.rst old mode 100755 new mode 100644 diff --git a/architectures/index.rst b/architectures/index.rst old mode 100755 new mode 100644 diff --git a/getting_started/build-guide/build-from-scratch.rst b/getting_started/build-guide/build-from-scratch.rst old mode 100755 new mode 100644 diff --git a/getting_started/build-guide/build-with-zephyr.rst b/getting_started/build-guide/build-with-zephyr.rst old mode 100755 new mode 100644 diff --git a/getting_started/index.rst b/getting_started/index.rst old mode 100755 new mode 100644 diff --git a/getting_started/intel_debug/introduction.rst b/getting_started/intel_debug/introduction.rst old mode 100755 new mode 100644 diff --git a/getting_started/intel_debug/suggestions.rst b/getting_started/intel_debug/suggestions.rst old mode 100755 new mode 100644 diff --git a/getting_started/nxp/sof_imx_user_guide.rst b/getting_started/nxp/sof_imx_user_guide.rst old mode 100755 new mode 100644 diff --git a/platforms/intel-cavs/commons/work-queue.rst b/platforms/intel-cavs/commons/work-queue.rst old mode 100755 new mode 100644 diff --git a/release.rst b/release.rst old mode 100755 new mode 100644 diff --git a/scripts/requirements.txt b/scripts/requirements.txt old mode 100755 new mode 100644 diff --git a/tsc/representatives.rst b/tsc/representatives.rst old mode 100755 new mode 100644 From 86e7dfe546771cecdc02dc5f06be047bd6225016 Mon Sep 17 00:00:00 2001 From: Dmitrii Golovanov Date: Tue, 25 Mar 2025 10:58:38 +0100 Subject: [PATCH 287/290] docbuild: Add a note on additional libraries Add a note on additional libraries needed to build the hardcoded version of pillow package. Signed-off-by: Dmitrii Golovanov --- contribute/process/docbuild.rst | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/contribute/process/docbuild.rst b/contribute/process/docbuild.rst index f1dd8f91..5a0c2817 100644 --- a/contribute/process/docbuild.rst +++ b/contribute/process/docbuild.rst @@ -163,6 +163,20 @@ tools: PIP_IGNORE_INSTALLED=0 pip3 install --user -r scripts/requirements-lax.txt + The hardcoded package versions might need additional libraries installed + in order to compile them. For example, to resolve the following error: + + .. code-block:: bash + + ERROR: Could not build wheels for pillow, which is required to install pyproject.toml-based projects + + you should install: + + .. code-block:: bash + + sudo apt install libjpeg-dev zlib1g-dev + + For Windows, install the needed tools manually: * Python (3.7+) from https://www.python.org/downloads/ From 49f3c6eb5da8cf020fc2d95e5a1f8f918dadda87 Mon Sep 17 00:00:00 2001 From: Dmitrii Golovanov Date: Tue, 25 Mar 2025 11:00:43 +0100 Subject: [PATCH 288/290] docbuild: Adjust HTML generation commands Adjust code snippets for HTML generation after #9788c4be changes to avoid doxygen build in source directory. Signed-off-by: Dmitrii Golovanov --- contribute/process/docbuild.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contribute/process/docbuild.rst b/contribute/process/docbuild.rst index 5a0c2817..06570e03 100644 --- a/contribute/process/docbuild.rst +++ b/contribute/process/docbuild.rst @@ -238,8 +238,8 @@ Docker image (2) cd thesofproject # API documentation (Doxygen) - cmake -S sof/doc -B sof/doc -GNinja - ninja -C sof/doc -v doc + cmake -S sof/doc -B sof/build_doxygen -GNinja + ninja -C sof/build_doxygen -v doc # UML and reStructuredText make -C sof-docs VERBOSE=1 html @@ -305,7 +305,7 @@ publishing. .. note:: In some situations it is necessary to clean all the files and build from - the very beginning. To do this, use the ``make clean`` command. + the very beginning. To do this, use the ``make -C sof-docs clean`` command. Installation troubleshooting **************************** From 7a448ff2e7228364d8255133e8f2909d43a7ebee Mon Sep 17 00:00:00 2001 From: Dmitrii Golovanov Date: Tue, 25 Mar 2025 11:18:10 +0100 Subject: [PATCH 289/290] build-guide: Use Zephyr HWMv2 board names Use Zephyr HWMv2 board names in `west build` command examples. Signed-off-by: Dmitrii Golovanov --- getting_started/build-guide/build-with-zephyr.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/getting_started/build-guide/build-with-zephyr.rst b/getting_started/build-guide/build-with-zephyr.rst index 781dc920..e3eb035d 100644 --- a/getting_started/build-guide/build-with-zephyr.rst +++ b/getting_started/build-guide/build-with-zephyr.rst @@ -163,17 +163,17 @@ Check out and build using west tool directly .. code-block:: bash - west build --build-dir build-tgl --board intel_adsp_cavs25 ./sof/app + west build --build-dir build-tgl --board intel_adsp/cavs25 ./sof/app - Note that the SOF project defines platform names that have Zephyr board counterparts. In the above example, the *Tigerlake* platform matches the ``inteL_adsp_cavs25`` Zephyr board. This is why the output directory is named ``build-tgl``; however, you may use any name you wish. + Note that the SOF project defines platform names that have Zephyr board counterparts. In the above example, the *Tigerlake* platform matches the ``intel_adsp/cavs25`` Zephyr board target (see `Zephyr HWMv2 board terminology `_). This is why the output directory is named ``build-tgl``; however, you may use any name you wish. .. note:: To add verbosity to the build output use the -v -v flags. Example: - ``west -v -v build --build-dir build-tgl --board intel_adsp_cavs25 ./sof/app`` + ``west -v -v build --build-dir build-tgl --board intel_adsp/cavs25 ./sof/app`` To perform a complete clean rebuild, use the --pristine flag. Example: - ``west -v -v build --build-dir build-tgl --pristine always --board intel_adsp_cavs25 ./sof/app`` + ``west -v -v build --build-dir build-tgl --pristine always --board intel_adsp/cavs25 ./sof/app`` The ``.elf`` file produced by the ``west build`` is missing a manifest and signature. A a result, you must sign the file using the **rimage tool** From 32b3fcaf9824dbe4886c365bed9f4d80437b6d14 Mon Sep 17 00:00:00 2001 From: Marcin Szkudlinski Date: Thu, 4 Sep 2025 14:18:47 +0200 Subject: [PATCH 290/290] Design of DP scheduling with deadline calculations this commit contains a detailed description of DP scheduling and DP deadline calculations Signed-off-by: Marcin Szkudlinski --- .../sof-zephyr/mpp_layer/dp_scheduling.rst | 614 ++++++++++++++++++ .../images/dp_scheduling/example1.pu | 34 + .../images/dp_scheduling/example1_1.pu | 34 + .../images/dp_scheduling/example1_2.pu | 34 + .../images/dp_scheduling/example1_3.pu | 40 ++ .../images/dp_scheduling/example1_4.pu | 42 ++ .../images/dp_scheduling/example1_5.pu | 41 ++ .../images/dp_scheduling/example2.pu | 34 + .../images/dp_scheduling/example2_1.pu | 40 ++ .../images/dp_scheduling/example2_1a.pu | 34 + .../images/dp_scheduling/example2_2.pu | 34 + .../images/dp_scheduling/example2_2a.pu | 34 + .../images/dp_scheduling/example2_3.pu | 40 ++ .../images/dp_scheduling/example2_4.pu | 40 ++ .../images/dp_scheduling/example2_5.pu | 40 ++ .../images/dp_scheduling/example2_6.pu | 34 + .../images/dp_scheduling/example2_7.pu | 39 ++ .../images/dp_scheduling/example3.pu | 34 + .../images/dp_scheduling/example3_1.pu | 34 + .../images/dp_scheduling/example3_2.pu | 34 + .../images/dp_scheduling/example3_3.pu | 34 + .../images/dp_scheduling/example3_4.pu | 34 + .../images/dp_scheduling/example3_5.pu | 34 + .../images/dp_scheduling/example3_6.pu | 34 + .../images/dp_scheduling/example3_7.pu | 40 ++ .../images/dp_scheduling/example4.pu | 38 ++ .../images/dp_scheduling/example4_1.pu | 38 ++ .../images/dp_scheduling/example4_2.pu | 38 ++ .../images/dp_scheduling/pic1_chains.pu | 16 + .../firmware/sof-zephyr/mpp_layer/index.rst | 1 + 30 files changed, 1617 insertions(+) create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/dp_scheduling.rst create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example1.pu create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example1_1.pu create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example1_2.pu create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example1_3.pu create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example1_4.pu create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example1_5.pu create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example2.pu create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example2_1.pu create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example2_1a.pu create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example2_2.pu create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example2_2a.pu create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example2_3.pu create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example2_4.pu create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example2_5.pu create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example2_6.pu create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example2_7.pu create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example3.pu create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example3_1.pu create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example3_2.pu create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example3_3.pu create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example3_4.pu create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example3_5.pu create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example3_6.pu create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example3_7.pu create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example4.pu create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example4_1.pu create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example4_2.pu create mode 100644 architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/pic1_chains.pu diff --git a/architectures/firmware/sof-zephyr/mpp_layer/dp_scheduling.rst b/architectures/firmware/sof-zephyr/mpp_layer/dp_scheduling.rst new file mode 100644 index 00000000..c6adf7ff --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/dp_scheduling.rst @@ -0,0 +1,614 @@ +DP a.k.a. "Data processing" with EDF scheduling +************************************************ + +DP a.k.a. "Data processing" is an async scheduling method of data processing modules. Each module works in a separate, preemptible thread with lower priority than LL thread. It allows processing with periods longer than 1ms, on-demand processing, etc. + +Unlike in LL "low latency" method where a module started every 1ms cycle and all of LL modules together MUST finish processing 1ms, DP works async and gets CPU when a module is "ready for processing", what means: + + - on each module's input buffer there's at least IBS bytes of data and in each module's output buffer there's at least OBS bytes of free space + + OR + + - a module declared readiness by itself by an optional API call "is_ready_to_process" + +Critical part is that the module **must** finish processing before its **deadline**. A deadline is a time when the modules must provide a data chunk in order to keep next module(s) in the pipeline working. + +To ensure that all modules provide data on time - as long as CPU is not overloaded - regardless of modules' processing times and processing periods, a Earliest Deadline First (EDF) scheduling is used. https://en.wikipedia.org/wiki/Earliest_deadline_first_scheduling + +A list of all DP tasks, regardless on core the task is on, is to be iterated every time the situation of DP readiness or deadline timing may change, that include: + + - finish of processing of LL pipeline (on any core) + - finish of processing of any DP module (on any core) + +during the iteration, the following will be checked: + + - Readiness of each DP module. As mentioned before, module "is ready" when declared readiness by itself an API call or when it has at least IBS of data on each input and at least OBS free space on each out + - deadline calculation of each DP module. LFTs and Deadlines are not constant, they may change when a module consume/produce a portion of data. Therefore all LFTs and Deadlines must be re-calculated + +DEADLINE CALCULATIONS +====================== + +The most critical part is to calculate deadlines. Lets go from the beginning, there are some definitions: + +**def: buffers' Latest Feeding Time (LFT)** + +LFT is the latest time when **a buffer** must be fed with a portion of data allowing its data consumer to work and finish in its specific time + +LFT is a parameter specific to a buffer and can be calculated based on: + + - current amount of data in the buffer + - data reciever's consumption rate and period + - data source production rate and period + - data reciever's module's LST - latest start time + +so, in high level LFT is a sum of: + + - Latest start time (LST) of the data consumer (LST is defined later) + + - estimated time the consumer will drain the current data from the buffer: ``number_of_ms_in_buffer / consumer_period`` + + i.e. if there's 5ms of data in the buffer and period of the consumer is 2ms, the calculated time is ``4ms`` + + - correction for multiple source cycle + + in case the producer period < consumer period the LFT time needs to be corrected, as the producer must process more than once to provide enough data. The correction will be calculated as: ``producer_LPT * required_number_of_cycles`` where LPT is longest processing time, explained later + + ``correction = producer_LPT * ((consumer_period - number_of_ms_in_buffer) / producer_period)`` + + if correction is < 0, it should be set to zero. Note that in case producer_period >= consumer_period correction is always 0 + +finally: ``LFT = LST(consumer) + estimated_drain_time - correction`` + +**def: DP module's DEADLINE** + +a DEADLINE is the latest moment **a module** must finish processing to feed all target buffers before their LFTs. +Calculation is simple: + + - module's deadline is the nearest LFT of all target buffers + +in case te LFT of the buffer cannot be calculated - that may happen during pipeline startup or if there's no output buffer, i.e. a module like speech recognition - deadline should be set to "moment when module becomes ready + modules's period" + +**def: DP module's Longest Processing Time (LPT)** + +LPT is the longest time the module may process a portion of data, assuming it is scheduled 100% of CPU time. **LPT cannot be measured in runtime** as processing may change from cycle to cycle, etc. It can, however, be estimated based on: + +- declared (by a module vendor) number of CPU cycles required for processing. This declaration should be done separately for all combination of input/output data formats, platform, CPU type, using of HiFi etc. and either included in manifest od provided in an IPC call +- If declaration is not available, we can take "a period" as an approximation of longest possible processing time. "A period" is a value calculated using IBS and data consumption rate of a module. A module cannot possibly processing longer than its period, because it would never provide data in time (if LPT = period that means a module required 100% of CPU for processing, so it is really the worst possible case) + +*Example:* if a data rate is 48samples/msec and OBS = 480samples, the "worst case" period should be calculated 10ms + +*NOTE:* in case of sampling freq like 44.1 a round up should taken - if ration is 44.1 samples per mlisecond, 45 samples should be used for calculations + +The "worst case approximation", however a correct, is assuming that a module is a heavy one and it requires 100% of CPU time. Using it may lead to unnecessary buffering, see "delayed start" section below. + +**def: DP module's latest start time (LST)** + +LST is the latest time when **a module** must start processing a portion of data in order to meet its deadline. It can be calculated as: +``deadline - LPT`` When a module is in the middle of processing, its LST may be negative. In that case 0 should be taken to all futhure calculations. + +**Based on an above, it is clear that we do need to calculate first a deadline of the very latest module in a chain, than go back and calculate LFTs and deadline of each module separately** + +Fortunate is that the last module of a pipeline is almost always an LL module (usually DAI). For LL module deadline always is "NOW", so it is very easy to calculate LFTs for its input buffer(s). note: in case of data rates like 44.1, which cannot be divided to 1ms, a round up to 45 should be used: + + - LL module always start in 1ms periods + - LL module always consume constant number of bytes in a cycle (with an exception for frequencies like 44.1, a round up 45KHz should be taken for calculations) + + so ``LFT = NOW + number of data chunks in buffer * 1ms`` + +"NOW" in all of the calculations is "last start of LL scheduler". It makes all calculations simpler, as in the examples below (calculating CPU cycles would require taking extra care for 32bit overflows or use slow 64bit operations). Also all modules have the same timestamp as "NOW", regardless of moment in the cycle the deadlines are calculated. + +If a module is in the middle of processing, it should not release data from input buffer till the processing is finished, so the input buffer should be considered as it was at the moment the processing started, otherwise deadlines may be miscalculated. + +In case of pipeline like: + +.. uml:: images/dp_scheduling/pic1_chains.pu + +there are 2 separate deadline calculation chains: DP4 than DP3, and (independent) DP2 than DP1. **Also note that deadlines and other parameters may change, so re-calculation of all parameters should occur reasonable frequently and include all DP modules, regardless of a core it is run on** + +End of stream +============= + +When a SP module is in the middle of processing when a pipeline is stopping, it should finish processing its current chunk of data. Unformtunately there's no way to interrupt ongoing processing without risk of memory leaks etc. Therefore IPC stopping a pipeline should wait till all DP modules finish processing. + +EXAMPLE1 +========= +*data source period is longer or equal to data consumer period* +Note that in the example CPU load is very close to 100%, yet deadline calculation and EDF scheduling allow to keep the processing on time. + +for simplification lets assume: + + - the pipeline is in stable state (processing for a while, not in startup) + - no DP is currently processing + - whole CPU is dedicated to DP, like if LL is on core 0 and DPs on core 1 + +**0ms time:** + +.. uml:: images/dp_scheduling/example1.pu + +Pipeline state: + + - DP1 is ready for processing + - DP2 is ready for processing + + calculate deadlines: + + - ``buf3 LFT = 15 periods of LL2`` ==> ``DP2 deadline = 15ms`` + - ``DP2 LST = 15ms (DP2 deadline) - 9ms (DP2 LPT) = 6ms`` + - ``buf2 LFT = 6ms (DP2 LST) + 10ms (1 period in buf2) = 16ms`` ==> ``DP1 deadline = 16ms`` + + DP2 will be scheduled as it has earliest deadline, will process for 9ms + +**9ms time, DP2 finished processing but not yet released data from BUF2:** + +.. uml:: images/dp_scheduling/example1_1.pu + +Pipeline state: + + - DP1 is ready for processing + - DP2 just finished processing + + calculate deadlines: + + - ``buf3 LFT = 6 periods of LL2`` ==> ``DP2 deadline = 6ms`` + - ``DP2 LST = 6ms(DP2 deadline) - 9ms (DP2 LPT) = -3ms`` LST is negative, 0 should be used ``DP2 LST = 0`` + - ``buf2 LFT = 6ms (DP2 LST) + 10ms (1 period in buf2) = 16ms`` ==> ``DP1 deadline = 16ms`` + + DP1 will be scheduled + +**9ms time, DP2 released data from BUF2:** + +.. uml:: images/dp_scheduling/example1_2.pu + +Pipeline state: + + - DP1 is ready for processing + - DP2 is not ready for processing + + calculate deadlines: + + - ``buf3 LFT = 16 periods of LL2`` ==> ``DP2 deadline = 16ms`` + - ``DP2 LST = 16ms(DP2 deadline) - 9ms (DP2 LPT) = 7ms`` + - ``buf2 LFT = 7ms (DP2 LST) = 7ms`` ==> ``DP1 deadline = 7ms`` + + DP1 will be scheduled, will run for 5ms + +**14ms time, DP1 finished processing and released data from BUF1:** + +.. uml:: images/dp_scheduling/example1_3.pu + +Pipeline state: + + - DP1 is not ready for processing + - DP2 is ready for processing + + calculate deadlines: + + - ``buf3 LFT = 11 periods of LL2`` ==> ``DP2 deadline = 11ms`` + - ``DP2 LST = 11ms(DP2 deadline) - 9ms (DP2 LPT) = 2ms`` + - ``buf2 LFT = 2ms (DP2 LST) + 100ms (10 periods in buf2) = 102ms`` ==> ``DP1 deadline = 102ms`` + + DP2 will be scheduled + +**100ms time, 86ms passed, DP2 processed 9 times, is in the middle of 10th processing, having 5ms left:** + +.. uml:: images/dp_scheduling/example1_4.pu + +Pipeline state: + + - DP1 is ready for processing + - DP2 is ready for processing + + calculate deadlines: + + - ``buf3 LFT = 15 periods of LL2`` ==> ``DP2 deadline = 15ms`` + - ``DP2 LST = 15ms(DP2 deadline) - 9ms (DP2 LPT) = 6ms`` + - ``buf2 LFT = 6ms (DP2 LST) + 10ms (1 period in buf2) = 16ms`` ==> ``DP1 deadline = 16ms`` + + DP2 will be scheduled + +**105ms time, DP2 finished processing and released data from BUF2:** + +.. uml:: images/dp_scheduling/example1_5.pu + +Pipeline state: + + - DP1 is ready for processing + - DP2 is not ready for processing + + calculate deadlines: + + - ``buf3 LFT = 20 periods of LL2`` ==> ``DP2 deadline = 20ms`` + - ``DP2 LST = 20ms(DP2 deadline) - 9ms (DP2 LPT) = 11ms`` + - ``buf2 LFT = 11ms (DP2 LST) + 0ms = 11ms`` ==> ``DP1 deadline = 11ms`` + + DP1 will be scheduled + +EXAMPLE2 +========= +*data source period is shorter than data consumer period* + +**0ms time:** + +.. uml:: images/dp_scheduling/example2.pu + +Pipeline state: + + - DP1 is ready for processing + - DP2 is not ready for processing + + calculate deadlines: + + - ``buf3 LFT = 18 periods of LL2`` ==> ``DP2 deadline = 18ms`` + - ``DP2 LST = 18ms (DP2 deadline) - 10ms (DP2 LPT) = 8ms`` + - ``buf2 LFT = 8ms(DP2 LST) + 0 (0 complete periods of DP2 in buf2) = 8ms`` correction for multiple source cycle is = 0 + - ``DP1 deadline = 8ms`` + + DP1 will be scheduled + +**2ms time:** + +.. uml:: images/dp_scheduling/example2_1.pu + +Pipeline state: + + - DP1 is not ready for processing + - DP2 is ready for processing + + calculate deadlines: + + - ``buf3 LFT = 16 periods of LL2`` ==> ``DP2 deadline = 16ms`` + - ``DP2 LST = 16ms (DP2 deadline) - 10ms (DP2 LPT) = 6ms`` + - ``buf2 LFT = 6ms(DP2 LST) + 20 (1 complete periods of DP2 in buf2) = 26ms`` correction for multiple source cycle is < 0, so 0 is used + - ``DP1 deadline = 26ms`` + + DP2 will be scheduled + +**5ms time:** + +.. uml:: images/dp_scheduling/example2_1a.pu + +Pipeline state: + + - DP1 is ready for processing + - DP2 is in the middle of processing, still has to keep processing for 7ms. According to rules, the module should not release data from input buffer till the processing is finished, so buf2 still contains 20ms samples + + calculate deadlines: + + - ``buf3 LFT = 13 periods of LL2`` ==> ``DP2 deadline = 13ms`` + - ``DP2 LST = 13ms (DP2 deadline) - 10ms (DP2 LPT) = 3ms`` + - ``buf2 LFT = 3ms(DP2 LST) + 20 (1 complete periods of DP2 in buf2) = 23ms`` correction for multiple source cycle is < 0, so 0 is used + - ``DP1 deadline = 23ms`` + + DP2 will be scheduled and will keep processing for 7ms + +**12ms time, before releasing data from buf2 and acking data in buf3** + +.. uml:: images/dp_scheduling/example2_2a.pu + +Pipeline state: + + - DP1 is ready for processing + - DP2 finished processing, but not yet released data from buf2, so buf2 still contains 20ms samples + + calculate deadlines: + + - ``buf3 LFT = 6 periods of LL2`` ==> ``DP2 deadline = 6ms`` + - ``DP2 LST = 6ms (DP2 deadline) - 10ms (DP2 LPT) = -4ms`` LST is negative, so 0 should be used + - ``buf2 LFT = 0ms(DP2 LST) + 20ms (1 complete periods of DP2 in buf2) = 20ms`` correction for multiple source cycle is < 0, so 0 is used + - ``DP1 deadline = 20ms`` + + DP2 will be release data + +**12ms time, after releasing data from buf2 and acking data in buf3** + +.. uml:: images/dp_scheduling/example2_2.pu + +Pipeline state: + + - DP1 is ready for processing + - DP2 is not ready for processing + + calculate deadlines: + + - ``buf3 LFT = 26 periods of LL2`` ==> ``DP2 deadline = 26ms`` + - ``DP2 LST = 26ms (DP2 deadline) - 10ms (DP2 LPT) = 16ms`` + - ``buf2 LFT = 16ms(DP2 LST) + 0 (0 complete periods of DP2 in buf2) - 8ms correction (4 periods of DP2 * 2ms DP1 LPT) = 8ms`` + - ``DP1 deadline = 8ms`` + + DP1 will be scheduled + +**14ms time:** + +.. uml:: images/dp_scheduling/example2_3.pu + +Pipeline state: + + - DP1 is ready for processing + - DP2 is not ready for processing + + calculate deadlines: + + - ``buf3 LFT = 24 periods of LL2`` ==> ``DP2 deadline = 24ms`` + - ``DP2 LST = 24ms (DP2 deadline) - 10ms (DP2 LPT) = 14ms`` + - ``buf2 LFT = 14ms(DP2 LST) + 0 (0 complete periods of DP2 in buf2) - 6ms correction (3 periods of DP2 * 2ms DP1 LPT) = 8ms`` + - ``DP1 deadline = 8ms`` + + DP1 will be scheduled + +**16ms time:** + +.. uml:: images/dp_scheduling/example2_4.pu + +Pipeline state: + + - DP1 is ready for processing + - DP2 is not ready for processing + + calculate deadlines: + + - ``buf3 LFT = 22 periods of LL2`` ==> ``DP2 deadline = 22ms`` + - ``DP2 LST = 22ms (DP2 deadline) - 10ms (DP2 LPT) = 12ms`` + - ``buf2 LFT = 12ms(DP2 LST) + 0 (0 complete periods of DP2 in buf2) - 4ms correction (2 periods of DP2 * 2ms DP1 LPT) = 8ms`` + - ``DP1 deadline = 8ms`` + + DP1 will be scheduled + +**18ms time:** + +.. uml:: images/dp_scheduling/example2_5.pu + +Pipeline state: + + - DP1 is not ready for processing + - DP2 is not ready for processing + + calculate deadlines - however pointless at when no DP is ready: + + - ``buf3 LFT = 20 periods of LL2`` ==> ``DP2 deadline = 20ms`` + - ``DP2 LST = 20ms (DP2 deadline) - 10ms (DP2 LPT) = 10ms`` + - ``buf2 LFT = 10ms(DP2 LST) + 0 (0 complete periods of DP2 in buf2) - 2ms correction (2 periods of DP2 * 2ms DP1 LPT) = 8ms`` + - ``DP1 deadline = 8ms`` + + no DP will be scheduled + +**20ms time:** + +.. uml:: images/dp_scheduling/example2_6.pu + +Pipeline state: + + - DP1 is ready for processing + - DP2 is not ready for processing + + calculate deadlines - however pointless at when no DP is ready: + + - ``buf3 LFT = 18 periods of LL2`` ==> ``DP2 deadline = 18ms`` + - ``DP2 LST = 18ms (DP2 deadline) - 10ms (DP2 LPT) = 8ms`` + - ``buf2 LFT = 8ms(DP2 LST) + 0 (0 complete periods of DP2 in buf2) - 2ms correction (2 periods of DP2 * 2ms DP1 LPT) = 6ms`` + - ``DP1 deadline = 6ms`` + + DP1 will be scheduled + +**22ms time:** + +.. uml:: images/dp_scheduling/example2_7.pu + +Pipeline state: + + - DP1 is not ready for processing + - DP2 is ready for processing + + calculate deadlines + + - ``buf3 LFT = 16 periods of LL2`` ==> ``DP2 deadline = 16ms`` + - ``DP2 LST = 16ms (DP2 deadline) - 10ms (DP2 LPT) = 6ms`` + - ``buf2 LFT = 6ms(DP2 LST) +20 (1 complete period of DP2 in buf2) = 26ms`` correction for multiple source cycle is = 0 + - ``DP1 deadline = 26ms`` + + DP2 will be scheduled + + +STARTUP +========== + +Special case is "pipeline startup". When a pipeline is starting, deadlines cannot be calculated as all the modules are already late and deadlines are in the past. According to deadline calculation rules, the deadline is set to time when the module becomes ready + module's LPT. + +If a module finishes processing before its LPT. it is not guaranteed that it will do it again in any of next cycles. If it happens, the data should be held in the buffer till LPT passes. This prevents underruns in case any of future processing takes longer. This mechanism is called "delayed start". The module should stay in "delayed start" state till the next module becomes ready for the first time. + +Delayed start makes EDF scheduling possible and ensures that even when CPU load close to 100% every module have enough processing time to finish within its deadline. + +Example of a pipeline startup and 100% cpu usage +================================================ + +**0ms time:** + +.. uml:: images/dp_scheduling/example3.pu + +Pipeline state: + + - DP1 is not ready for processing, in startup delay state + - DP2 is not ready for processing, in startup delay state + + calculate deadlines + + - dedline of DP2 can't be calculated + - dedline of DP1 can't be calculated + + no DP will be scheduled + +**5ms time:** + +.. uml:: images/dp_scheduling/example3_1.pu + +Pipeline state: + + - DP1 is ready for processing, in startup delay state + - DP2 is not ready for processing, in startup delay state + + calculate deadlines + + - deadline for DP2 cant be calculated + - deadline of DP1 is fixed to 2ms (NOW + DP1 LPT) - because DP2 deadline cannot be calculated + + DP1 will be scheduled + +**7ms time:** + +.. uml:: images/dp_scheduling/example3_2.pu + +Pipeline state: + + - DP1 is not ready for processing, in startup delay state + - DP2 is not ready for processing, in startup delay state + + calculate deadlines + + - deadline for DP2 cant be calculated + - deadline for DP1 cant be calculated + + no DP will be scheduled + +**10ms time:** + +.. uml:: images/dp_scheduling/example3_3.pu + +Pipeline state: + + - DP1 is ready for processing, in startup delay state + - DP2 is not ready for processing, in startup delay state + + calculate deadlines + + - deadline for DP2 cant be calculated + - deadline of DP1 is fixed to 2ms (NOW + DP1 LPT) - because DP2 deadline cannot be calculated + + DP1 will be scheduled + +**12ms time:** + +.. uml:: images/dp_scheduling/example3_4.pu + +Pipeline state: + + - DP1 is not ready for processing, leaving startup delay state + - DP2 is ready for processing, in startup delay state + + calculate deadlines + + - deadline for DP2 is fixed to 6ms (NOW + DP2 LPT) + - ``DP2 LST = 6ms (DP2 deadline) - 6ms (DP2 LPT) = 0ms`` + - ``buf2 LFT = 0ms(DP2 LST) + 10ms (1 complete period of DP2 in buf2) = 10ms`` correction for multiple source cycle is = 0 + - ``DP1 deadline = 14ms`` + + DP2 will be scheduled + +**15ms time:** + +.. uml:: images/dp_scheduling/example3_5.pu + +Pipeline state: + + - DP1 is ready for processing + - DP2 is the middle for processing, 3ms left, in startup delay state + + calculate deadlines + + - deadline for DP2 was fixed to 6ms 3ms ago, so now it is 3ms + - ``DP2 LST = 3ms (DP2 deadline) - 6ms (DP2 LPT) = -3ms`` 0 will be used + - ``buf2 LFT = 0(DP2 LST) +10 (1 complete period of DP2 in buf2) = 10ms`` correction for multiple source cycle is = 0 + - ``DP1 deadline = 10ms`` + + DP2 will be scheduled + +**17ms time:** + +.. uml:: images/dp_scheduling/example3_6.pu + +Pipeline state: + + - DP1 is ready for processing + - DP2 is not ready for processing, leaving startup delay state + + calculate deadlines + + - ``buf3 LFT = 10 periods of LL2`` ==> ``DP2 deadline = 10ms`` + - ``DP2 LST = 10ms (DP2 deadline) - 6ms (DP2 LPT) = 4ms`` + - ``buf2 LFT = 4ms(DP2 LST) + 0 (0 complete periods of DP2 in buf2) - 2ms correction (2 periods of DP2 * 2ms DP1 LPT) = 2ms`` + - ``DP1 deadline = 2ms`` + + DP1 will be scheduled + +**19ms time:** + +.. uml:: images/dp_scheduling/example3_7.pu + +Pipeline state: + + - DP1 is ready for processing + - DP2 is not ready for processing + + calculate deadlines + + - ``buf3 LFT = 8 periods of LL2`` ==> ``DP2 deadline = 8ms`` + - ``DP2 LST = 10ms (DP2 deadline) - 6ms (DP2 LPT) = 2ms`` + - ``buf2 LFT = 2ms(DP2 LST) + 0 (0 complete periods of DP2 in buf2) - 0ms correction (0 periods of DP2 * 2ms DP1 LPT) = 2ms`` + - ``DP1 deadline = 2ms`` + + DP1 will be scheduled + + +Example of a 2 pipelines, one running and one in startup and 100% cpu usage +============================================================================ + +pipeline1 is running, DP use 80% of CPU, pipeline2 is starting. Calculating of DP1/DP2 LST and BUF1/BUF3 LFT makes no sense as they're connected to LLs + +**0ms time:** + +.. uml:: images/dp_scheduling/example4.pu + +Pipeline state: + + - DP1 is ready for processing + - DP2 is not ready for processing + + calculate deadlines + + - ``buf2 LFT = 10 periods of LL2`` ==> ``DP1 deadline = 10ms`` + - DP2 deadline cannot be calculated + + DP1 will be scheduled + +**5ms time:** + +.. uml:: images/dp_scheduling/example4_1.pu + +Pipeline state: + + - DP1 is in the middle of processing, 3ms left + - DP2 is ready for processing, in startup delay state + + calculate deadlines + + - ``buf2 LFT = 5 periods of LL2`` ==> ``DP1 deadline = 5ms`` + - DP2 deadline is fixed to ``DP2 period = 1ms`` + + DP1 will be preempted, DP2 will be scheduled + +**6ms time:** + +.. uml:: images/dp_scheduling/example4_2.pu + +Pipeline state: + + - DP1 is in the middle of processing, 3ms left + - DP2 is not ready for processing, leaving startup delay state + + calculate deadlines + + - ``buf2 LFT = 4 periods of LL2`` ==> ``DP1 deadline = 4ms`` + - ``buf4 LFT = 5 periods of LL2`` ==> ``DP2 deadline = 5ms`` + + + DP2 will be scheduled + + diff --git a/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example1.pu b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example1.pu new file mode 100644 index 00000000..969188bb --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example1.pu @@ -0,0 +1,34 @@ +@startuml +left to right direction +(LL1) as mod1 #f6ed80 + +rectangle "BUF1\n\n100ms of data\n" as buf1 + +(DP1) as mod2 #ADD1B2 + +note bottom of mod2 + period 100ms + LPT: 5ms +end note + +rectangle "BUF2\n\n10ms of data\n" as buf2 + +(DP2) as mod3 #ADD1B2 + +note bottom of mod3 + period 10ms + LPT: 9ms +end note + +rectangle "BUF3\n\n15ms of data\n" as buf3 + +(LL2) as mod4 #f6ed80 + + +mod1--> buf1 +buf1 --> mod2 +mod2-->buf2 +buf2 --> mod3 +mod3-->buf3 +buf3 --> mod4 +@enduml \ No newline at end of file diff --git a/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example1_1.pu b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example1_1.pu new file mode 100644 index 00000000..b8f65e24 --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example1_1.pu @@ -0,0 +1,34 @@ +@startuml +left to right direction +(LL1) as mod1 #f6ed80 + +rectangle "BUF1\n\n109ms of data\n" as buf1 + +(DP1) as mod2 #ADD1B2 + +note bottom of mod2 + period 100ms + LPT: 5ms +end note + +rectangle "BUF2\n\n10ms of data\n" as buf2 + +(DP2) as mod3 #ADD1B2 + +note bottom of mod3 + period 10ms + LPT: 9ms +end note + +rectangle "BUF3\n\n6ms of data\n" as buf3 + +(LL2) as mod4 #f6ed80 + + +mod1--> buf1 +buf1 --> mod2 +mod2-->buf2 +buf2 --> mod3 +mod3-->buf3 +buf3 --> mod4 +@enduml \ No newline at end of file diff --git a/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example1_2.pu b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example1_2.pu new file mode 100644 index 00000000..9b8798ba --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example1_2.pu @@ -0,0 +1,34 @@ +@startuml +left to right direction +(LL1) as mod1 #f6ed80 + +rectangle "BUF1\n\n109ms of data\n" as buf1 + +(DP1) as mod2 #ADD1B2 + +note bottom of mod2 + period 100ms + LPT: 5ms +end note + +rectangle "BUF2\n\n0ms of data\n" as buf2 + +(DP2) as mod3 #ADD1B2 + +note bottom of mod3 + period 10ms + LPT: 9ms +end note + +rectangle "BUF3\n\n16ms of data\n" as buf3 + +(LL2) as mod4 #f6ed80 + + +mod1--> buf1 +buf1 --> mod2 +mod2-->buf2 +buf2 --> mod3 +mod3-->buf3 +buf3 --> mod4 +@enduml \ No newline at end of file diff --git a/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example1_3.pu b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example1_3.pu new file mode 100644 index 00000000..5dd8d956 --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example1_3.pu @@ -0,0 +1,40 @@ +@startuml +left to right direction +(LL1) as mod1 #f6ed80 + +rectangle "BUF1\n\n14ms of data\n" as buf1 +note bottom of buf1 + there was 109ms + LL1 produced 5ms + DP1 consumed 100ms + 109+5-100 = 14ms +end note + +(DP1) as mod2 #ADD1B2 + +note bottom of mod2 + period 100ms + LPT: 5ms +end note + +rectangle "BUF2\n\n100ms of data\n" as buf2 + +(DP2) as mod3 #ADD1B2 + +note bottom of mod3 + period 10ms + LPT: 9ms +end note + +rectangle "BUF3\n\n11ms of data\n" as buf3 + +(LL2) as mod4 #f6ed80 + + +mod1--> buf1 +buf1 --> mod2 +mod2-->buf2 +buf2 --> mod3 +mod3-->buf3 +buf3 --> mod4 +@enduml \ No newline at end of file diff --git a/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example1_4.pu b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example1_4.pu new file mode 100644 index 00000000..03ed3355 --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example1_4.pu @@ -0,0 +1,42 @@ +@startuml +left to right direction +(LL1) as mod1 #f6ed80 + +rectangle "BUF1\n\n100ms of data\n" as buf1 + +(DP1) as mod2 #ADD1B2 + +note bottom of mod2 + period 100ms + LPT: 5ms +end note + +rectangle "BUF2\n\n10ms of data\n" as buf2 + +(DP2) as mod3 #ADD1B2 + +note bottom of mod3 + period 10ms + LPT: 9ms +end note + +rectangle "BUF3\n\n15ms of data\n" as buf3 + +note bottom of buf3 + there was 11ms + DP2 produced 90ms + LL2 consumed 86ms + 11+90-86 = 15ms +end note + + +(LL2) as mod4 #f6ed80 + + +mod1--> buf1 +buf1 --> mod2 +mod2-->buf2 +buf2 --> mod3 +mod3-->buf3 +buf3 --> mod4 +@enduml \ No newline at end of file diff --git a/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example1_5.pu b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example1_5.pu new file mode 100644 index 00000000..098fb792 --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example1_5.pu @@ -0,0 +1,41 @@ +@startuml +left to right direction +(LL1) as mod1 #f6ed80 + +rectangle "BUF1\n\n105ms of data\n" as buf1 + +(DP1) as mod2 #ADD1B2 + +note bottom of mod2 + period 100ms + LPT: 5ms +end note + +rectangle "BUF2\n\n0ms of data\n" as buf2 + +(DP2) as mod3 #ADD1B2 + +note bottom of mod3 + period 10ms + LPT: 9ms +end note + +rectangle "BUF3\n\n20ms of data\n" as buf3 + +note bottom of buf3 + there was 15ms + DP2 produced 10ms + LL2 consumed 5ms + 15+10-5 = 20ms +end note + +(LL2) as mod4 #f6ed80 + + +mod1--> buf1 +buf1 --> mod2 +mod2-->buf2 +buf2 --> mod3 +mod3-->buf3 +buf3 --> mod4 +@enduml \ No newline at end of file diff --git a/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example2.pu b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example2.pu new file mode 100644 index 00000000..7677f06d --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example2.pu @@ -0,0 +1,34 @@ +@startuml +left to right direction +(LL1) as mod1 #f6ed80 + +rectangle "BUF1\n\n5ms of data\n" as buf1 + +(DP1) as mod2 #ADD1B2 + +note bottom of mod2 + period 5ms + LPT: 2ms +end note + +rectangle "BUF2\n\n15ms of data\n" as buf2 + +(DP2) as mod3 #ADD1B2 + +note bottom of mod3 + period 20ms + LPT: 10ms +end note + +rectangle "BUF3\n\n18ms of data\n" as buf3 + +(LL2) as mod4 #f6ed80 + + +mod1--> buf1 +buf1 --> mod2 +mod2-->buf2 +buf2 --> mod3 +mod3-->buf3 +buf3 --> mod4 +@enduml \ No newline at end of file diff --git a/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example2_1.pu b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example2_1.pu new file mode 100644 index 00000000..83dfc838 --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example2_1.pu @@ -0,0 +1,40 @@ +@startuml +left to right direction +(LL1) as mod1 #f6ed80 + +rectangle "BUF1\n\n2ms of data\n" as buf1 +note bottom of buf1 + there was 5ms + LL1 produced 2ms + DP1 consumed 5ms + 5-5+2 = 2ms +end note + +(DP1) as mod2 #ADD1B2 + +note bottom of mod2 + period 5ms + LPT: 2ms +end note + +rectangle "BUF2\n\n20ms of data\n" as buf2 + +(DP2) as mod3 #ADD1B2 + +note bottom of mod3 + period 20ms + LPT: 10ms +end note + +rectangle "BUF3\n\n16ms of data\n" as buf3 + +(LL2) as mod4 #f6ed80 + + +mod1--> buf1 +buf1 --> mod2 +mod2-->buf2 +buf2 --> mod3 +mod3-->buf3 +buf3 --> mod4 +@enduml \ No newline at end of file diff --git a/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example2_1a.pu b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example2_1a.pu new file mode 100644 index 00000000..8e1c2874 --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example2_1a.pu @@ -0,0 +1,34 @@ +@startuml +left to right direction +(LL1) as mod1 #f6ed80 + +rectangle "BUF1\n\n5ms of data\n" as buf1 + +(DP1) as mod2 #ADD1B2 + +note bottom of mod2 + period 5ms + LPT: 2ms +end note + +rectangle "BUF2\n\n20ms of data\n" as buf2 + +(DP2) as mod3 #ADD1B2 + +note bottom of mod3 + period 20ms + LPT: 10ms +end note + +rectangle "BUF3\n\n13ms of data\n" as buf3 + +(LL2) as mod4 #f6ed80 + + +mod1--> buf1 +buf1 --> mod2 +mod2-->buf2 +buf2 --> mod3 +mod3-->buf3 +buf3 --> mod4 +@enduml \ No newline at end of file diff --git a/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example2_2.pu b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example2_2.pu new file mode 100644 index 00000000..0e7440cf --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example2_2.pu @@ -0,0 +1,34 @@ +@startuml +left to right direction +(LL1) as mod1 #f6ed80 + +rectangle "BUF1\n\n12ms of data\n" as buf1 + +(DP1) as mod2 #ADD1B2 + +note bottom of mod2 + period 5ms + LPT: 2ms +end note + +rectangle "BUF2\n\n0ms of data\n" as buf2 + +(DP2) as mod3 #ADD1B2 + +note bottom of mod3 + period 20ms + LPT: 10ms +end note + +rectangle "BUF3\n\n26ms of data\n" as buf3 + +(LL2) as mod4 #f6ed80 + + +mod1--> buf1 +buf1 --> mod2 +mod2-->buf2 +buf2 --> mod3 +mod3-->buf3 +buf3 --> mod4 +@enduml \ No newline at end of file diff --git a/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example2_2a.pu b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example2_2a.pu new file mode 100644 index 00000000..20f6e42e --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example2_2a.pu @@ -0,0 +1,34 @@ +@startuml +left to right direction +(LL1) as mod1 #f6ed80 + +rectangle "BUF1\n\n12ms of data\n" as buf1 + +(DP1) as mod2 #ADD1B2 + +note bottom of mod2 + period 5ms + LPT: 2ms +end note + +rectangle "BUF2\n\n20ms of data\n" as buf2 + +(DP2) as mod3 #ADD1B2 + +note bottom of mod3 + period 20ms + LPT: 10ms +end note + +rectangle "BUF3\n\n6ms of data\n" as buf3 + +(LL2) as mod4 #f6ed80 + + +mod1--> buf1 +buf1 --> mod2 +mod2-->buf2 +buf2 --> mod3 +mod3-->buf3 +buf3 --> mod4 +@enduml \ No newline at end of file diff --git a/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example2_3.pu b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example2_3.pu new file mode 100644 index 00000000..a976be4f --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example2_3.pu @@ -0,0 +1,40 @@ +@startuml +left to right direction +(LL1) as mod1 #f6ed80 + +rectangle "BUF1\n\n9ms of data\n" as buf1 +note bottom of buf1 + there was 12ms + LL1 produced 2ms + DP1 consumed 5ms + 12+2-5 = 9ms +end note + +(DP1) as mod2 #ADD1B2 + +note bottom of mod2 + period 5ms + LPT: 2ms +end note + +rectangle "BUF2\n\n5ms of data\n" as buf2 + +(DP2) as mod3 #ADD1B2 + +note bottom of mod3 + period 20ms + LPT: 10ms +end note + +rectangle "BUF3\n\n24ms of data\n" as buf3 + +(LL2) as mod4 #f6ed80 + + +mod1--> buf1 +buf1 --> mod2 +mod2-->buf2 +buf2 --> mod3 +mod3-->buf3 +buf3 --> mod4 +@enduml \ No newline at end of file diff --git a/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example2_4.pu b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example2_4.pu new file mode 100644 index 00000000..4e06b3e5 --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example2_4.pu @@ -0,0 +1,40 @@ +@startuml +left to right direction +(LL1) as mod1 #f6ed80 + +rectangle "BUF1\n\n6ms of data\n" as buf1 +note bottom of buf1 + there was 9ms + LL1 produced 2ms + DP1 consumed 5ms + 9+2-5 = 6ms +end note + +(DP1) as mod2 #ADD1B2 + +note bottom of mod2 + period 5ms + LPT: 2ms +end note + +rectangle "BUF2\n\n10ms of data\n" as buf2 + +(DP2) as mod3 #ADD1B2 + +note bottom of mod3 + period 20ms + LPT: 10ms +end note + +rectangle "BUF3\n\n22ms of data\n" as buf3 + +(LL2) as mod4 #f6ed80 + + +mod1--> buf1 +buf1 --> mod2 +mod2-->buf2 +buf2 --> mod3 +mod3-->buf3 +buf3 --> mod4 +@enduml \ No newline at end of file diff --git a/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example2_5.pu b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example2_5.pu new file mode 100644 index 00000000..c1efc9c0 --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example2_5.pu @@ -0,0 +1,40 @@ +@startuml +left to right direction +(LL1) as mod1 #f6ed80 + +rectangle "BUF1\n\n3ms of data\n" as buf1 +note bottom of buf1 + there was 6ms + LL1 produced 2ms + DP1 consumed 5ms + 9+2-5 = 3ms +end note + +(DP1) as mod2 #ADD1B2 + +note bottom of mod2 + period 5ms + LPT: 2ms +end note + +rectangle "BUF2\n\n15ms of data\n" as buf2 + +(DP2) as mod3 #ADD1B2 + +note bottom of mod3 + period 20ms + LPT: 10ms +end note + +rectangle "BUF3\n\n20ms of data\n" as buf3 + +(LL2) as mod4 #f6ed80 + + +mod1--> buf1 +buf1 --> mod2 +mod2-->buf2 +buf2 --> mod3 +mod3-->buf3 +buf3 --> mod4 +@enduml \ No newline at end of file diff --git a/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example2_6.pu b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example2_6.pu new file mode 100644 index 00000000..7677f06d --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example2_6.pu @@ -0,0 +1,34 @@ +@startuml +left to right direction +(LL1) as mod1 #f6ed80 + +rectangle "BUF1\n\n5ms of data\n" as buf1 + +(DP1) as mod2 #ADD1B2 + +note bottom of mod2 + period 5ms + LPT: 2ms +end note + +rectangle "BUF2\n\n15ms of data\n" as buf2 + +(DP2) as mod3 #ADD1B2 + +note bottom of mod3 + period 20ms + LPT: 10ms +end note + +rectangle "BUF3\n\n18ms of data\n" as buf3 + +(LL2) as mod4 #f6ed80 + + +mod1--> buf1 +buf1 --> mod2 +mod2-->buf2 +buf2 --> mod3 +mod3-->buf3 +buf3 --> mod4 +@enduml \ No newline at end of file diff --git a/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example2_7.pu b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example2_7.pu new file mode 100644 index 00000000..b2a6ca71 --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example2_7.pu @@ -0,0 +1,39 @@ +@startuml +left to right direction +(LL1) as mod1 #f6ed80 + +rectangle "BUF1\n\n2ms of data\n" as buf1 +note bottom of buf1 + there was 5ms + LL1 produced 2ms + DP1 consumed 5ms + 5+2-5 = 2ms +end note +(DP1) as mod2 #ADD1B2 + +note bottom of mod2 + period 5ms + LPT: 2ms +end note + +rectangle "BUF2\n\n20ms of data\n" as buf2 + +(DP2) as mod3 #ADD1B2 + +note bottom of mod3 + period 20ms + LPT: 10ms +end note + +rectangle "BUF3\n\n16ms of data\n" as buf3 + +(LL2) as mod4 #f6ed80 + + +mod1--> buf1 +buf1 --> mod2 +mod2-->buf2 +buf2 --> mod3 +mod3-->buf3 +buf3 --> mod4 +@enduml \ No newline at end of file diff --git a/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example3.pu b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example3.pu new file mode 100644 index 00000000..92dbf045 --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example3.pu @@ -0,0 +1,34 @@ +@startuml +left to right direction +(LL1) as mod1 #f6ed80 + +rectangle "BUF1\n\n0ms of data\n" as buf1 + +(DP1) as mod2 #ADD1B2 + +note bottom of mod2 + period 5ms + LPT: 2ms +end note + +rectangle "BUF2\n\n0ms of data\n" as buf2 + +(DP2) as mod3 #ADD1B2 + +note bottom of mod3 + period 10ms + LPT: 6ms +end note + +rectangle "BUF3\n\n0ms of data\n" as buf3 + +(LL2) as mod4 #f6ed80 + + +mod1--> buf1 +buf1 --> mod2 +mod2-->buf2 +buf2 --> mod3 +mod3-->buf3 +buf3 --> mod4 +@enduml \ No newline at end of file diff --git a/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example3_1.pu b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example3_1.pu new file mode 100644 index 00000000..0c83890a --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example3_1.pu @@ -0,0 +1,34 @@ +@startuml +left to right direction +(LL1) as mod1 #f6ed80 + +rectangle "BUF1\n\n5ms of data\n" as buf1 + +(DP1) as mod2 #ADD1B2 + +note bottom of mod2 + period 5ms + LPT: 2ms +end note + +rectangle "BUF2\n\n0ms of data\n" as buf2 + +(DP2) as mod3 #ADD1B2 + +note bottom of mod3 + period 10ms + LPT: 6ms +end note + +rectangle "BUF3\n\n0ms of data\n" as buf3 + +(LL2) as mod4 #f6ed80 + + +mod1--> buf1 +buf1 --> mod2 +mod2-->buf2 +buf2 --> mod3 +mod3-->buf3 +buf3 --> mod4 +@enduml \ No newline at end of file diff --git a/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example3_2.pu b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example3_2.pu new file mode 100644 index 00000000..c5e7faba --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example3_2.pu @@ -0,0 +1,34 @@ +@startuml +left to right direction +(LL1) as mod1 #f6ed80 + +rectangle "BUF1\n\n2ms of data\n" as buf1 + +(DP1) as mod2 #ADD1B2 + +note bottom of mod2 + period 5ms + LPT: 2ms +end note + +rectangle "BUF2\n\n5ms of data\n" as buf2 + +(DP2) as mod3 #ADD1B2 + +note bottom of mod3 + period 10ms + LPT: 6ms +end note + +rectangle "BUF3\n\n0ms of data\n" as buf3 + +(LL2) as mod4 #f6ed80 + + +mod1--> buf1 +buf1 --> mod2 +mod2-->buf2 +buf2 --> mod3 +mod3-->buf3 +buf3 --> mod4 +@enduml \ No newline at end of file diff --git a/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example3_3.pu b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example3_3.pu new file mode 100644 index 00000000..64b7accb --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example3_3.pu @@ -0,0 +1,34 @@ +@startuml +left to right direction +(LL1) as mod1 #f6ed80 + +rectangle "BUF1\n\n5ms of data\n" as buf1 + +(DP1) as mod2 #ADD1B2 + +note bottom of mod2 + period 5ms + LPT: 2ms +end note + +rectangle "BUF2\n\n5ms of data\n" as buf2 + +(DP2) as mod3 #ADD1B2 + +note bottom of mod3 + period 10ms + LPT: 6ms +end note + +rectangle "BUF3\n\n0ms of data\n" as buf3 + +(LL2) as mod4 #f6ed80 + + +mod1--> buf1 +buf1 --> mod2 +mod2-->buf2 +buf2 --> mod3 +mod3-->buf3 +buf3 --> mod4 +@enduml \ No newline at end of file diff --git a/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example3_4.pu b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example3_4.pu new file mode 100644 index 00000000..858ff446 --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example3_4.pu @@ -0,0 +1,34 @@ +@startuml +left to right direction +(LL1) as mod1 #f6ed80 + +rectangle "BUF1\n\n2ms of data\n" as buf1 + +(DP1) as mod2 #ADD1B2 + +note bottom of mod2 + period 5ms + LPT: 2ms +end note + +rectangle "BUF2\n\n10ms of data\n" as buf2 + +(DP2) as mod3 #ADD1B2 + +note bottom of mod3 + period 10ms + LPT: 6ms +end note + +rectangle "BUF3\n\n0ms of data\n" as buf3 + +(LL2) as mod4 #f6ed80 + + +mod1--> buf1 +buf1 --> mod2 +mod2-->buf2 +buf2 --> mod3 +mod3-->buf3 +buf3 --> mod4 +@enduml \ No newline at end of file diff --git a/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example3_5.pu b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example3_5.pu new file mode 100644 index 00000000..d9ccd7e6 --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example3_5.pu @@ -0,0 +1,34 @@ +@startuml +left to right direction +(LL1) as mod1 #f6ed80 + +rectangle "BUF1\n\n9ms of data\n" as buf1 + +(DP1) as mod2 #ADD1B2 + +note bottom of mod2 + period 5ms + LPT: 2ms +end note + +rectangle "BUF2\n\n10ms of data\n" as buf2 + +(DP2) as mod3 #ADD1B2 + +note bottom of mod3 + period 10ms + LPT: 6ms +end note + +rectangle "BUF3\n\n0ms of data\n" as buf3 + +(LL2) as mod4 #f6ed80 + + +mod1--> buf1 +buf1 --> mod2 +mod2-->buf2 +buf2 --> mod3 +mod3-->buf3 +buf3 --> mod4 +@enduml \ No newline at end of file diff --git a/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example3_6.pu b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example3_6.pu new file mode 100644 index 00000000..f43be350 --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example3_6.pu @@ -0,0 +1,34 @@ +@startuml +left to right direction +(LL1) as mod1 #f6ed80 + +rectangle "BUF1\n\n12ms of data\n" as buf1 + +(DP1) as mod2 #ADD1B2 + +note bottom of mod2 + period 5ms + LPT: 2ms +end note + +rectangle "BUF2\n\n0ms of data\n" as buf2 + +(DP2) as mod3 #ADD1B2 + +note bottom of mod3 + period 10ms + LPT: 6ms +end note + +rectangle "BUF3\n\n10ms of data\n" as buf3 + +(LL2) as mod4 #f6ed80 + + +mod1--> buf1 +buf1 --> mod2 +mod2-->buf2 +buf2 --> mod3 +mod3-->buf3 +buf3 --> mod4 +@enduml \ No newline at end of file diff --git a/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example3_7.pu b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example3_7.pu new file mode 100644 index 00000000..5591eaae --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example3_7.pu @@ -0,0 +1,40 @@ +@startuml +left to right direction +(LL1) as mod1 #f6ed80 + +rectangle "BUF1\n\n9ms of data\n" as buf1 +note bottom of buf1 + there was 12ms + LL1 procuded 2ms + DP1 consumed 5ms + 12 + 2 - 5 = 9ms +end note + +(DP1) as mod2 #ADD1B2 + +note bottom of mod2 + period 5ms + LPT: 2ms +end note + +rectangle "BUF2\n\n5ms of data\n" as buf2 + +(DP2) as mod3 #ADD1B2 + +note bottom of mod3 + period 10ms + LPT: 6ms +end note + +rectangle "BUF3\n\n8ms of data\n" as buf3 + +(LL2) as mod4 #f6ed80 + + +mod1--> buf1 +buf1 --> mod2 +mod2-->buf2 +buf2 --> mod3 +mod3-->buf3 +buf3 --> mod4 +@enduml \ No newline at end of file diff --git a/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example4.pu b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example4.pu new file mode 100644 index 00000000..dfb6cd24 --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example4.pu @@ -0,0 +1,38 @@ +@startuml +left to right direction + +package pipeline2{ + (LL3) #f6ed80 + rectangle "BUF3\n\n0ms of data\n" as buf3 + (DP2) #ADD1B2 + note bottom of DP2 + period 5ms + LPT: 1ms + end note + rectangle "BUF4\n\n0ms of data\n" as buf4 + (LL4) #f6ed80 +} + +package pipeline1{ + (LL1) #f6ed80 + rectangle "BUF1\n\n10ms of data\n" as buf1 + (DP1) #ADD1B2 + note bottom of DP1 + period 10ms + LPT: 8ms + end note + rectangle "BUF2\n\n10ms of data\n" as buf2 + (LL2) #f6ed80 + } + +LL1 --> buf1 +buf1 --> DP1 +DP1 --> buf2 +buf2 --> LL2 + +LL3 --> buf3 +buf3 --> DP2 +DP2 --> buf4 +buf4 --> LL4 + +@enduml \ No newline at end of file diff --git a/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example4_1.pu b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example4_1.pu new file mode 100644 index 00000000..627e730b --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example4_1.pu @@ -0,0 +1,38 @@ +@startuml +left to right direction + +package pipeline2{ + (LL3) #f6ed80 + rectangle "BUF3\n\n5ms of data\n" as buf3 + (DP2) #ADD1B2 + note bottom of DP2 + period 5ms + LPT: 1ms + end note + rectangle "BUF4\n\n0ms of data\n" as buf4 + (LL4) #f6ed80 +} + +package pipeline1{ + (LL1) #f6ed80 + rectangle "BUF1\n\n15ms of data\n" as buf1 + (DP1) #ADD1B2 + note bottom of DP1 + period 10ms + LPT: 8ms + end note + rectangle "BUF2\n\n5ms of data\n" as buf2 + (LL2) #f6ed80 + } + +LL1 --> buf1 +buf1 --> DP1 +DP1 --> buf2 +buf2 --> LL2 + +LL3 --> buf3 +buf3 --> DP2 +DP2 --> buf4 +buf4 --> LL4 + +@enduml \ No newline at end of file diff --git a/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example4_2.pu b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example4_2.pu new file mode 100644 index 00000000..9e5a49b0 --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/example4_2.pu @@ -0,0 +1,38 @@ +@startuml +left to right direction + +package pipeline2{ + (LL3) #f6ed80 + rectangle "BUF3\n\n1ms of data\n" as buf3 + (DP2) #ADD1B2 + note bottom of DP2 + period 5ms + LPT: 1ms + end note + rectangle "BUF4\n\n5ms of data\n" as buf4 + (LL4) #f6ed80 +} + +package pipeline1{ + (LL1) #f6ed80 + rectangle "BUF1\n\n16ms of data\n" as buf1 + (DP1) #ADD1B2 + note bottom of DP1 + period 10ms + LPT: 8ms + end note + rectangle "BUF2\n\n4ms of data\n" as buf2 + (LL2) #f6ed80 + } + +LL1 --> buf1 +buf1 --> DP1 +DP1 --> buf2 +buf2 --> LL2 + +LL3 --> buf3 +buf3 --> DP2 +DP2 --> buf4 +buf4 --> LL4 + +@enduml \ No newline at end of file diff --git a/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/pic1_chains.pu b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/pic1_chains.pu new file mode 100644 index 00000000..0dc0256b --- /dev/null +++ b/architectures/firmware/sof-zephyr/mpp_layer/images/dp_scheduling/pic1_chains.pu @@ -0,0 +1,16 @@ +left to right direction +(LL1) as mod1 +(DP1) as mod2 #ADD1B2 +(DP2) as mod3 #ADD1B2 +(LL2) as mod4 +(DP3) as mod5 #7D3CFF +(DP4) as mod6 #7D3CFF +(LL3) as mod7 + + +mod1-->mod2 +mod2-->mod3 +mod3-->mod4 +mod4-->mod5 +mod5-->mod6 +mod6-->mod7 diff --git a/architectures/firmware/sof-zephyr/mpp_layer/index.rst b/architectures/firmware/sof-zephyr/mpp_layer/index.rst index 67629b39..b8542887 100644 --- a/architectures/firmware/sof-zephyr/mpp_layer/index.rst +++ b/architectures/firmware/sof-zephyr/mpp_layer/index.rst @@ -14,3 +14,4 @@ to the Application layer. mpp_scheduling async_messaging lib_manager + dp_scheduling \ No newline at end of file

mTE#)e4biSJntYq6I`NGXoSN2uU6`2ww?aXy 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 literal 0 HcmV?d00001 diff --git a/algos/eq/Picture_iir_absolute_response.png b/algos/eq/Picture_iir_absolute_response.png new file mode 100644 index 0000000000000000000000000000000000000000..5995dfc5231a55821d4c89cef7a3b7171a7620ec GIT binary patch literal 51470 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 Pf6l0Bs}?C=zWaXwmRBo@ literal 0 HcmV?d00001 diff --git a/algos/eq/Picture_iir_filter_response_vs_ideal_target.png b/algos/eq/Picture_iir_filter_response_vs_ideal_target.png new file mode 100644 index 0000000000000000000000000000000000000000..26a4e27b39d21a278066b82759bd1b2f326864d5 GIT binary patch literal 54469 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 z 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 literal 0 HcmV?d00001 diff --git a/algos/eq/Picture_raw_frequency_response.png b/algos/eq/Picture_raw_frequency_response.png new file mode 100644 index 0000000000000000000000000000000000000000..d4bc8ff2708347f770960798520deb3b3233770b GIT binary patch literal 67499 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

ZpyZs@Tm)`P;?MbM6 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 D#|ztM literal 0 HcmV?d00001 diff --git a/algos/tdfb/rectangular_array.png b/algos/tdfb/rectangular_array.png new file mode 100644 index 0000000000000000000000000000000000000000..76a9fe3aa09b986c4829d29565a8f58e0060b23a GIT binary patch literal 51032 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 literal 0 HcmV?d00001 diff --git a/algos/tdfb/time_domain_fixed_beamformer.rst b/algos/tdfb/time_domain_fixed_beamformer.rst new file mode 100644 index 00000000..31f6da6b --- /dev/null +++ b/algos/tdfb/time_domain_fixed_beamformer.rst @@ -0,0 +1,578 @@ +.. _time-domain-fixed-beamformer: + +Time Domain Fixed Beamformer (TDFB) +################################### + +.. contents:: + :depth: 3 + +Introduction +************ + +The beamformer is a pre-processing component for microphones. It +improves the microphone capture signal-to-noise by providing spatial +noise suppression for ambient noise. Also the non-correlated +self-noise of the microphones and electronics is mitigated due to +summing of two or more microphones into an output channel stream. + +The beamformer's operation is easiest to understand with delay-and-sum +beamformer type for a line array shape. The microphones are assumed to +be in far-field of the sound source. At sufficient distance the +spherical waves from e.g. person's mouth appear as planar. The waves +propagate at slightly temperature dependent speed of 340 m/s. The +beamformer should sum the microphones outputs in-phase for the look +direction. The direction is called here the azimuth angle. + +The beamformer could also, if desired, be set up to do the opposite to +null the signal from specified angle by delaying the signal for +opposite phase sum. + +.. figure:: beamformer_delay_and_sum.png + + Example delay-and-sum beamformer with two microphones at 50 mm + distance. The sound waves arrive from 18 degree azimuth angle. + +In the above example the plane waves arrive from source at 18 degrees +azimuth angle versus the normal of line array axis. The task is to +determine the needed delay values for delay elements D\ :sub:`1` and +D\ :sub:`2`. Since the first microphone receives the wave before the +second microphone, the signal from first microphone need to be delayed +by D\ :sub:`1` before the summing operation. The Delay value of D\ +:sub:`2` is set to zero. + +The needed delay value is the sound propagation time equivalent length +of edge a in the formed right triangle with edges a, b, and c. The +lengths of edges are time values those are computed from known microphones +distance, speed of sound, and azimuth angle. + +The length of edge c is + +:math:`t_c = \frac{d}{v} = \frac{50~mm}{340~m/s} \approx 147~us` + +The angle between edges a and c is 90 - az. Therefore the arrival time +difference t\ :sub:`a` to apply for D\ :sub:`1` with 18 degree steer +angle (az) is + +:math:`t_a = t_c \cos (90 - azimuth) \approx 45~us` + +With different az angles it can be seen that the delay to apply varies +between 0 (az = 0) and 147 us (az = 90). For negative azimuth angles +the applied delays for D\ :sub:`1` and D\ :sub:`2` are swapped. + +Such delay is typically applied by all-pass digital filter. The beam +patterns for line shape one dimensional arrays have a rotational +symmetrical beam pattern. For the above example with D\ :sub:`1` and +D\ :sub:`2` set the array would also pass the waveform from 180 - az +direction. The beam shape resembles a bent ellipse for broadside. A +3D cone like beam pattern is possible only for end-fire angles +90 +or -90 degrees. A 2D array like circular shape can provide a 360 +degree steerable cone in azimuth plane. + +The analog directional microphones with e.g. 3D cardioid shape for +end-fire angle are actually single or dual diaphragm microphones with +tuned acoustical ports or analog all-pass electronics to achieve +similar additional delays for delay-and-sum. Due to large mechanical +size they are common only in studio equipment. Consumer electronics +such as notebooks form factors can fortunately provide various shape +microphone arrays while the studio microphones like approach is +impossible. + +Beamformer types +**************** + +The main beamformer types are fixed and adaptive. The implementations +can be in time or frequency domain. + +This TDFB type algorithm is the simplest time domain and fixed type +with a pre-defined look angle (azimuth, elevation). The audio source +is not tracked automatically. Audio waveforms from other angles are +attenuated. The beam shape is not particularly narrow with a low +microphones count such as 2 -4 so there's no need to track the subject +automatically we know the approximate angle for the use case. + +Adaptive beamformers usually target to minimize the output signal +while unblocking the configured pass direction. The fixed beamformer +has the assumed or theoretical noise characteristic +pre-programmed. There is no delay to adapt (same performance from the +beginning) or risk for mis-adaptation (desired signal corrupts) but +the practical performance is somewhat limited from performance in a +theoretical noise field. The time domain implementation is also +low-latency without added delay for signal framing for transform +domain. It can compute nearly any number of stream frames due to no +block size constraints. The filter bank adds a small delay, e.g. 2 - +10 ms that depends on configuration. + +The fixed beamformer needs to be configured per every different +microphone array geometry. The beam can be steered by applying a new +filters programming (with presets in later version of TDFB) if the +capture subject angle has changed based on camera face recognition or +acoustical direction of arrival estimation. Also quick beam direction +switching by rotating the input channels at algorithm input can be +made possible for some array geometries. + +Microphone array geometries +*************************** + +Line +==== + +In the line array the microphones are in locations those form a +straight line. The numbering convention of microphones is shown in the +figure below. The microphones numbers correspond to audio channels +at beamformer input. In stereo audio channel 1 is the left channel. + +The array size is described my microphones count and the space between +two neighbor microphones. In the example the spacing of the four +microphones is 30 mm. The steer azimuth angle is 90 degrees. The beam +direction for positive angles (0 to 90) is towards microphone 1. The +beam directions towards last microphone are set up with negative angle +(0 to -90). + +.. figure:: line_array.png + :width: 600 + + Line array with four microphones. + +The code to create the above design is below. The Octave GUI need to +be started from the TDFB tune directory: + + +.. code-block:: bash + + cd $SOF_WORKSPACE/sof/tools/tune/tdfb + octave --gui & + +In the Octave shell enter the next commands or create a short script +(e.g. ex_line.m) and run it. Remember to end the lines with semicolon +to avoid long prints of internal data structures. + +.. code-block:: octave + + bf = bf_defaults(); % Get defaults + bf.array = 'line'; % Calculate xyz coordinates for line array + bf.mic_n = 4; % four microphones + bf.mic_d = 30e-3; % 30 mm spacing + bf.steer_az = 90; % Azimuth angle 90 deg + bf = bf_design(bf); + +The above design is simplified and it lacks the output files +definition and assumes default four microphones to one output channel +configuration but it creates the plots for geometry and theoretical +characteristics. + + +Circular +======== + +In the circular array the microphones are at equal radius with equal +angular spacing. The microphones are numbered counterclockwise when +looking at array from above (positive z-axis). + +The azimuth angle (-180 to +180) is in the example 90 degrees. 0 +degrees angle points exactly to microphone 1 direction. The circular +array is a two dimensional array. If the elevation angle (-90 to 90 +degrees) is set to non-zero value the look direction can be tilted up +or down. A positive elevation angle tilts the beam upwards. + +.. figure:: circular_array.png + :width: 600 + + Circular array with six microphones. + +The design was done with commands. The plot_box is optional, it only +zooms the the plot axis to a 150 mm wide cube. + +.. code-block:: octave + + bf = bf_defaults(); % Get defaults + bf.array = 'circular'; % Calculate xyz coordinates for line array + bf.mic_n = 6; % six microphones + bf.mic_r = 30e-3; % 30 mm radius + bf.steer_az = 90; % Azimuth angle 90 deg + bf.plot_box = 150e-3; + bf = bf_design(bf); + +The view can be rotated as normal 3D plot. In Matlab mouse rotate is +available. In Octave it can be done with command view() to watch the +array from other angle. + +.. code-block:: octave + + figure(1) + v = view() + view(130, 30) + +The view azimuth was rotated by 180 degrees (-50 to +130). The view has +no impact to beamformer design. + +Rectangular +=========== + +A rectangular array is shown below. The numbering of microphones for +the first row is line for line array. The number continues from the +leftmost microphone of the next row. + + +.. figure:: rectangular_array.png + :width: 600 + + Rectangular array with six microphones. + +The code for the design is + +.. code-block:: octave + + bf = bf_defaults(); % Get defaults + bf.array = 'rectangle'; % Calculate xyz coordinates for rectangular array + bf.mic_nxy = [3 2]; % of 3 x 2 + bf.mic_dxy = [30e-3 30e-3]; % Same x and y spacing + bf.plot_box = 150e-3; + bf = bf_design(bf); + + +L-shape +======= + +The L-shape array is much like rectangular but only the left and +bottom edge of microphones rectangle is populated. + +.. figure:: lshape_array.png + :width: 600 + + L-shape array with four microphones. + +It was produced by + +.. code-block:: octave + + bf = bf_defaults(); % Get defaults + bf.array = 'lshape'; % Calculate xyz coordinates for rectangular array + bf.mic_nxy = [3 2]; % of 3 x 2 + bf.mic_dxy = [30e-3 30e-3]; % Same x and y spacing + bf.steer_az = 90; % Azimuth angle 90 deg + bf.plot_box = 150e-3; + bf = bf_design(bf); + + +Arbitrary XYZ +============= + +It's also possible to define all microphone coordinates manually. The +example shows a tetrahedron shape with four microphones. The microphones +order is as they are presented in the design script. + +.. figure:: xyz_array.png + :width: 600 + + XYZ array with four microphones. + +The tetrahedron shape was made with next script + +.. code-block:: octave + + bf = bf_defaults(); % Get defaults + bf.array = 'xyz'; % Enter xyz directly, note that script centers it + bf.plot_box = 100e-3; % Small 100 mm plot box + bf.steer_az = 90; % Steer array to 90 deg azimuth + + % Coordinates from https://en.wikipedia.org/wiki/Tetrahedron + s = 30e-3/sqrt(8/3); % Scale to 30 mm + bf.mic_x = [ sqrt(8/9) -sqrt(2/9) -sqrt(2/9) 0] * s; + bf.mic_y = [ 0 sqrt(2/3) -sqrt(2/3) 0] * s; + bf.mic_z = [-sqrt(1/3) -sqrt(1/3) -sqrt(1/3) 1] * s; + + bf = bf_design(bf); + +Note that the beamformer design is totally unaware of surface effects +of the object. The design equations assume the microphones "float" in +free space. Particularly a 3D array will be impacted by device +mechanics and custom design equations may be needed. + +Rotation of the array +===================== + +The array orientation can be changed with array_angle with X, Y, and Z +axis rotation angle. The next example rotates the array like it would +be on a notebook display lid corner at 60 degree angle. The steer +azimuth is set to 0 degrees towards notebook user. The plot view angle +is changed also. + +.. code-block:: octave + + bf = bf_defaults(); % Get defaults + bf.array = 'lshape'; % Calculate xyz coordinates for rectangular array + bf.mic_nxy = [3 2]; % of 3 x 2 + bf.mic_dxy = [30e-3 30e-3]; % Same x and y spacing + bf.steer_az = 0; % Azimuth angle 90 deg + bf.array_angle = [180 60 0]; % Array rotation angles for xyz + bf.plot_box = 150e-3; + bf = bf_design(bf); + figure(1) + view(140,30) + + +.. figure:: lshape_array_rot.png + :width: 600 + + Rotated L-shape array + +Filter bank design procedure +**************************** + +The procedure is in file bf_design.m. As coarse description the design +of filter bank is done entirely in (FFT) frequency domain with default +of 512 bins. The conversion to a time domain FIR filter bank for +desired filter length is done with IFFT and kaiser window. The longer +the filters are the less they deviate from the super-directive +frequency domain design. + +The procedure is based on equations equations published in paper +"Superdirective Microphone Arrays" by Joerg Bitzer and K. Uwe +Simmer. It is available in book "Microphone Arrays" by Michael +Brandstein and Darren Ward (Springer 2001). + +The procedure starts with computation of (x, y, z) coordinates of +virtual sound source at specified azimuth (steer_az) and elevation +(steer_el) angle. The point is by default 5m radius away that is +enough for far field with planar sound waves with typical array +dimensions but can be altered (steer_r). Near field (e.g. less than +1m) design may suffer from lack of sound level compensation for +microphone channels. + +The noise field is assumed to me theoretical homogeneous type and a +coherence matrix is formed with knowledge of the microphones +geometry. The super-directive design is set of coefficients that +minimize the noise power spectral density of filtered and summed +microphone signals but provides a distortion-less response towards the +look direction. The used design equations compute a Minimum Variance +Distortion-less Response (MVDR) beamformer. The details are found from +script bf_design.m and the above mentioned book. + +The elegance of the frequency domain design is that the equations can +be solved per each single frequency bin in FFT domain. Since the +process is potentially numerically unstable there is a diagonal +loading factor that is added to the coherence matrix prior to +inversion. The parameters is mu_db. It defaults to -50 dB but smaller +or larger values can be tested for best results. Smaller than default +values need to be used with care. The self noise of the microphones, +via white noise gain (WNG), could get even boosted with near zero +diagonal load designs. Large diagonal load improves robustness of the +design but may compromise other characteristic like beam pattern or +diffuse noise field suppression. + +After solving the equation for all frequencies the filters for each +microphone channel are converted to time domain with IFFT and window +function. The window function shortens the impulse responses to +desired length. The windowing naturally changes the characteristics so +different filter lengths (fir_beta) should be tested. + +Design examples +*************** + +Circular array +============== + +If e.g. circular array design is revisited the design creates several +plot windows in addition to the geometry and steer direction plot. The +next two show the beam pattern characteristic. The polar plot shows +only frequencies 1, 2, 3, and 4 kHz. The colorful frequency vs. angle +shows more detailed view for the same with all frequencies up to +Nyquist Fs/2. + +It can be seen that the beam patterns are different for different +frequencies. There is a beamformer type for constant directivity but +the performance against diffuse noise is not as good. The narrower +beam towards higher frequencies in super-directive achieves the higher +ambient noise suppression. + +At frequencies above 5 kHz there are side lobes those pass the signal +as well as the main beam. Those are caused by spatial aliasing. The +wave length of audio gets smaller than the array microphones +distance. The array dimensions need to be decreased if spatial +aliasing needs to be avoided. In most cases some it can be tolerated +somewhat. + +In the look direction beam there's some attenuation at lowest and +highest frequencies. The response can be made more flat by increasing +the filter length from default 64 (fir_length). + +.. figure:: circular_polar.png + :width: 600 + + Polar response of the circular array + +.. figure:: circular_spatial.png + :width: 600 + + Frequency vs. angle response of the circular array + +The performance of the array and beamformer can be also characterized +with White Noise Gain (WNG) and Directivity Index (DI) plots. The WNG +plot shows the amount attenuation the design provides for uncorrelated +noise. E.g. self noise of the microphones is uncorrelated noise +type. The directivity index shows the attenuation of noise that +arrives from other directions than steer direction. The noise that +arrives from surrounding noise sources and reflects from walls and +other surfaces and is correlated is called diffuse field noise. + +The impact of diagonal load mu_db in e.g. range -100 to -20 can be +tried and seen best in these plots. A near zero diagonal load with +value -200 dB makes the directivity even negative at some +frequencies. Such beamformer design would boost noise at those +frequencies! + +.. figure:: circular_wng.png + :width: 600 + + White noise gain of the circular array + +.. figure:: circular_di.png + :width: 600 + + Directivity index of the circular array + +Finally the FIR coefficients plot can be checked for sane looking result. The shown +plot shows a typical symmetrical FIR impulse response + +.. figure:: circular_filters.png + :width: 600 + + Filter coefficients for the circular array + +Line array +========== + +The circular arrays have the nice characteristic of nearly similar beam +pattern to any direction. As exercise compare the beam patterns of a +4 mic line array to 0 degrees azimuth steer vs. 90 or -90 degrees. + +Limitations +=========== + +The above examples defaulted to N microphones to single channel +output. However due to a current limitation in SOF the pipeline the +PCM and DAI need to have the same word length. The limitation will be +addressed in a next release of SOF. + +As workaround the beamformer can duplicate it's output channel to +needed number of channels and/or there can be several beams in the +design for different output channels. The latter is actually preferred +for generic stereo capture PCM in typical notebooks. The typical array +dimensions do not provide much subjective stereo sensation. + +Dual mono example +----------------- + +A complete dual mono 0 degree azimuth beamformer could be designed and +exported with script. The beam characteristics are those of 50 mm +spaced pair but the setting of num_output_channels and +output_channel_mix alter the configuration of output mixer of TDFB. + +.. code-block:: octave + + bf = bf_defaults(); % Get defaults + bf.array = 'line'; % Calculate xyz coordinates for line array + bf.mic_n = 2; % two microphones + bf.mic_d = 50e-3; % 50 mm spacing + bf.fs = 16e3; % 16 kHz rate + bf.steer_az = 0; % 0 degree azimuth + + % Two output channels + bf.num_output_channels = 2; + + % Mix filter 1 output to channels 0 and 1 (2^0 + 2^1 = 3) + % Mix filter 2 output to channels 0 and 1 (2^0 + 2^1 = 3) + bf.output_channel_mix = [3 3]; + + bf = bf_filenames_helper(bf); + bf = bf_design(bf); + bf_export(bf); + +Example with two beams +---------------------- + +This example creates for left channel a -10 degree beam and for right +channel a +10 degrees azimuth beam. It's quite suitable for notebooks +with emphasis for user direction (and opposite due to rotational +symmetry of line array) and still noticeable channel separation. + +The procedure uses bf_merge() to combine bf1 and bf2 designs. The +different out_channel_mix vectors does summing of the filters to +proper channels. The filenames are redefined to avoid to overwrite the +single beam files. + +.. code-block:: octave + + % Get defaults + bf1 = bf_defaults(); + bf1.fs = 48e3; + + % Setup array + bf1.array='line'; + bf1.mic_n = 2; + bf1.mic_d = 50e-3; + + % Copy settings for bf2 + bf2 = bf1; + + % Design beamformer 1 (left) + bf1.steer_az = -10; + bf1.input_channel_select = [0 1]; % Input two channels + bf1.output_channel_mix = [1 1]; % Mix both filters to channel 2^0 + bf1.fn = 10; % Figs 10.... + bf1 = bf_filenames_helper(bf1); + bf1 = bf_design(bf1); + + % Design beamformer 2 (right) + bf2.steer_az = +10; + bf2.input_channel_select = [0 1]; % Input two channels + bf2.output_channel_mix = [2 2]; % Mix both filters to channel 2^1 + bf2.fn = 20; % Figs 20.... + bf2 = bf_filenames_helper(bf2); + bf2 = bf_design(bf2); + + % Merge two beamformers into single description, set file names + bfm = bf_merge(bf1, bf2); + bfm.sofctl_fn = fullfile(bfm.sofctl_path, 'coef_line2_50mm_pm10deg_48khz.txt'); + bfm.tplg_fn = fullfile(bfm.tplg_path, 'coef_line2_50mm_pm10deg_48khz.txt'); + + % Export files for topology and sof-ctl + bf_export(bfm); + +.. figure:: two_beams_left.png + :width: 600 + + Beam pattern for the left channel + + + +.. figure:: two_beams_right.png + :width: 600 + + Beam pattern for thr right channel + +Simulation +********** + +Measurement in anechoic chamber is recommended for validation. A quick +check is however available to check correctness of the configuration +blob and C code version TDFB operation. + +The script tdbf_test.m does a beam patten test. To test own beamformer +design the proper file name need to be edited to test-placback.m4 +(currently coef_line2_50mm_pm90deg_48khz.m4) and the test topologies +regenerated. + +.. code-block:: bash + + cd $SOF_WORKSPACE/sof/ + scripts/build-tools.sh -t + scripts/rebuild-testbench.sh + cd cd tools/test/audio + octave --gui & + tdfb_test + +This simulation is emprical and executed with testbench. The previous +bf_design() call for the array created the sine rotation, diffuse +field, and random field waveform data files that the simulation run +used. The theoretical and simulated beam patterns should match. diff --git a/algos/tdfb/two_beams_left.png b/algos/tdfb/two_beams_left.png new file mode 100644 index 0000000000000000000000000000000000000000..5663aa2b266c876a727affd2693e0b4601da3f43 GIT binary patch literal 42145 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