Skip to content

Commit b236619

Browse files
jxsteltermmaka1
authored andcommitted
arch: fw: library manager description.
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 <[email protected]> Co-authored-by: Marcin Maka <[email protected]>
1 parent bbab560 commit b236619

File tree

5 files changed

+229
-0
lines changed

5 files changed

+229
-0
lines changed
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
@startuml
2+
3+
box "Host" #LightGreen
4+
participant "Driver" as host_driver
5+
end box
6+
7+
box "SOF" #LightSkyBlue
8+
participant "IPC4 Handler" as ipc4_handler
9+
participant "Component Manager" as component_manager
10+
participant "Library Manager" as library_manager
11+
end box
12+
13+
box "Zephyr RTOS" #LightBlue
14+
participant "Memory Management Driver" as memory_management_driver
15+
end box
16+
17+
host_driver -> ipc4_handler: SOF_IPC4_MOD_DELETE_INSTANCE
18+
activate ipc4_handler
19+
ipc4_handler -> component_manager: Free comp_driver
20+
activate component_manager
21+
alt IADK module
22+
component_manager -> library_manager: Deinitialize comp_driver \nwith Processing Module Adapter
23+
activate library_manager
24+
library_manager -> component_manager: return status
25+
deactivate library_manager
26+
else SOF module
27+
component_manager -> library_manager: Deinitialize comp_driver
28+
activate library_manager
29+
library_manager -> component_manager: return status
30+
deactivate library_manager
31+
end alt
32+
component_manager -> library_manager: Free comp_driver resources
33+
activate library_manager
34+
library_manager -> memory_management_driver: Free/Unmap L2 memory for code and rodata
35+
activate memory_management_driver
36+
memory_management_driver -> library_manager
37+
deactivate memory_management_driver
38+
library_manager -> memory_management_driver: Free/Unmap L2 memory for bss
39+
activate memory_management_driver
40+
memory_management_driver -> library_manager
41+
deactivate memory_management_driver
42+
loop Search library for shared module
43+
library_manager -> library_manager: Check if shared module exists and is loaded
44+
library_manager -> memory_management_driver: Free/Unmap L2 memory for shared module
45+
activate memory_management_driver
46+
memory_management_driver -> library_manager
47+
deactivate memory_management_driver
48+
end loop
49+
library_manager -> component_manager: return status
50+
deactivate library_manager
51+
component_manager -> ipc4_handler: return status
52+
deactivate component_manager
53+
ipc4_handler -> host_driver: Complete IPC request
54+
deactivate ipc4_handler
55+
56+
@enduml
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
@startuml
2+
3+
box "Host" #LightGreen
4+
participant "Driver" as host_driver
5+
end box
6+
7+
box "SOF" #LightSkyBlue
8+
participant "IPC4 Handler" as ipc4_handler
9+
participant "Component Manager" as component_manager
10+
participant "Library Manager" as library_manager
11+
end box
12+
13+
box "Zephyr RTOS" #LightBlue
14+
participant "Memory Management Driver" as memory_management_driver
15+
end box
16+
17+
host_driver -> ipc4_handler: SOF_IPC4_MOD_INIT_INSTANCE
18+
activate ipc4_handler
19+
ipc4_handler -> library_manager: lib_manager_register_module()
20+
activate library_manager
21+
library_manager -> ipc4_handler: return status
22+
deactivate library_manager
23+
ipc4_handler -> component_manager: Create comp_driver
24+
activate component_manager
25+
component_manager -> library_manager: Allocate L2 memory for module
26+
activate library_manager
27+
library_manager -> memory_management_driver: Map L2 memory
28+
deactivate library_manager
29+
activate memory_management_driver
30+
memory_management_driver -> library_manager
31+
deactivate memory_management_driver
32+
activate library_manager
33+
library_manager -> memory_management_driver: Load module code and rodata \nfrom L3 to L2 memory
34+
activate memory_management_driver
35+
memory_management_driver -> library_manager
36+
deactivate memory_management_driver
37+
library_manager -> memory_management_driver: Initialize L2 memory for bss
38+
activate memory_management_driver
39+
memory_management_driver -> library_manager
40+
deactivate memory_management_driver
41+
loop Search library for shared module
42+
library_manager -> library_manager: Check if shared module exists and is not loaded
43+
library_manager -> memory_management_driver: Allocate/Map L2 memory for shared module
44+
activate memory_management_driver
45+
memory_management_driver -> library_manager
46+
deactivate memory_management_driver
47+
library_manager -> memory_management_driver: Load shared module code and rodata \nfrom L3 to L2 memory
48+
activate memory_management_driver
49+
memory_management_driver -> library_manager
50+
deactivate memory_management_driver
51+
end loop
52+
alt IADK module
53+
component_manager -> library_manager: Create/Initialize comp_driver \nwith IADK Module Adapter
54+
library_manager -> component_manager: return status
55+
else SOF module
56+
component_manager -> library_manager: Create/Initialize comp_driver
57+
library_manager -> component_manager: return status
58+
deactivate library_manager
59+
end alt
60+
component_manager -> ipc4_handler: return status
61+
deactivate component_manager
62+
ipc4_handler -> host_driver: Complete IPC request
63+
deactivate ipc4_handler
64+
65+
@enduml
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
@startuml
2+
3+
box "Host" #LightGreen
4+
participant "Driver" as host_driver
5+
end box
6+
7+
box "SOF" #LightBlue
8+
participant "IPC4 Handler" as ipc4_handler
9+
participant "Library Manager" as library_manager
10+
participant "MPP Memory Manager" as mpp_memory_manager
11+
end box
12+
13+
box "ACE Platform" #LightYellow
14+
participant "ROM EXT" as rom_ext
15+
end box
16+
17+
18+
host_driver -> ipc4_handler: SOF_IPC4_GLB_LOAD_LIBRARY
19+
activate ipc4_handler
20+
ipc4_handler -> library_manager: lib_manager_load_library()
21+
activate library_manager
22+
library_manager -> library_manager: Parse Manifest \nPrepare Storage Memory
23+
library_manager -> mpp_memory_manager: Allocate L3 memory for library
24+
activate mpp_memory_manager
25+
mpp_memory_manager -> library_manager
26+
deactivate mpp_memory_manager
27+
library_manager -> library_manager: Prepare HDA DMA transfer
28+
host_driver -> library_manager: Transfer library manifest over DMA\nto L3 memory
29+
note right: if SoC does not support L3 memory\nthen L2 memory has to be used
30+
opt if AUTH_API_ENABLED
31+
library_manager -> rom_ext: Verify Manifest
32+
activate rom_ext
33+
rom_ext -> library_manager: result
34+
deactivate rom_ext
35+
end opt
36+
host_driver -> library_manager: Transfer library code over DMA\nto L3 memory
37+
opt if AUTH_API_ENABLED
38+
library_manager -> rom_ext: Verify whole Library
39+
activate rom_ext
40+
rom_ext -> library_manager: result
41+
deactivate rom_ext
42+
end opt
43+
library_manager -> library_manager: Update Library \ndescriptors table
44+
library_manager -> ipc4_handler: return status
45+
deactivate library_manager
46+
ipc4_handler -> host_driver: Complete IPC request
47+
deactivate ipc4_handler
48+
49+
@enduml

architectures/firmware/sof-zephyr/mpp_layer/index.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,4 @@ to the Application layer.
1313
mpp_overview
1414
mpp_scheduling
1515
async_messaging
16+
lib_manager
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
.. _lib_manager:
2+
3+
Loadable Library Manager
4+
########################
5+
6+
The Loadable Library Manager is a MPP Layer component responsible for loading
7+
and running loadable components provided in external libraries. It supports SOF
8+
native components as well as IADK cAVS/ACE developed modules through
9+
:doc:`../../intel/ace/iadk_modules`.
10+
11+
Loading an external library is a feature available only for IPC4 protocol with
12+
command: `SOF_IPC4_GLB_LOAD_LIBRARY`.
13+
14+
.. uml:: images/lib_manager/library_manager_load.pu
15+
:caption: Library Manager: Load library flow
16+
17+
In the `SOF_IPC4_GLB_LOAD_LIBRARY` IPC flow the ``lib_manager_load_library()`` api
18+
function loads binary from host driver to DSP memory and updates its internal
19+
structure with library descriptor data. If ``AUTH_API`` Kconfig option is
20+
selected, library manager communicates with platform ROM Extension library to
21+
perform library image verification. In that case only trusted libraries will be
22+
successfully loaded.
23+
24+
**NOTE:** ``AUTH_API`` Kconfig option is available only for Intel platforms.
25+
26+
During the `SOF_IPC4_MOD_INIT_INSTANCE` IPC4 protocol call, handler searches
27+
for specific module among build-in components and if not found, verifies
28+
manifests of all already loaded external libraries. When module is found in
29+
external library, it is registered in SOF Firmware ``struct comp_driver_list``
30+
with ``lib_manager_register_module()`` api function and loaded from L3 memory to
31+
L2 memory. Afterwards module is created with standard component device
32+
operation.
33+
34+
**NOTE:** If L3 memory is not available, the L2 memory has to be used and there
35+
is no memory load operation required.
36+
37+
.. uml:: images/lib_manager/library_manager_init_instance.pu
38+
:caption: Init instance flow for loadable module
39+
40+
External libraries could contain not only processing modules but also shared
41+
library code that could be reused across several external modules. The library
42+
manager searches external library manifest for such entities and loads them
43+
together with first processing module loaded.
44+
45+
When an external processing module is no longer needed, it could be unloaded
46+
with the IPC4 call `SOF_IPC4_MOD_DELETE_INSTANCE`. The command performs reverse
47+
flow to the previous one. It frees L2 SRAM memory allocated for the processing
48+
module and if it is last one unloaded from given library, it frees also
49+
resources used for all shared libraries loaded previously.
50+
51+
.. uml:: images/lib_manager/library_manager_delete_instance.pu
52+
:caption: Delete instance flow for loadable module
53+
54+
In `SOF_IPC4_MOD_INIT_INSTANCE` and `SOF_IPC4_MOD_DELETE_INSTANCE` flows,
55+
particular module could be loaded in more than one instance. Its `.text` and
56+
`.rodata` memory sections are allocated only for the first instance and shared
57+
for all other instances. Also the `.text` and `.rodata` resources are released
58+
only for the last instance of given processing module.

0 commit comments

Comments
 (0)