Registered User No edit summary |
Registered User Tag: 2017 source edit |
||
(18 intermediate revisions by 4 users not shown) | |||
Line 1: | Line 1: | ||
{{ApplicableFor | |||
|MPUs list=STM32MP15x, STM32MP25x | |||
|MPUs checklist=STM32MP13x, STM32MP15x, STM32MP25x | |||
}} | |||
<noinclude></noinclude> | |||
<onlyinclude> | <onlyinclude> | ||
Some typical issues related to the management of a coprocessor are listed below. Solutions or debugging methods are proposed for these issues. | Some typical issues related to the management of a coprocessor are listed below. Solutions or debugging methods are proposed for these issues. | ||
If your issue is not listed, try looking in the articles in the [[:Category:Coprocessor management Linux| Coprocessor management Linux]], [[:Category:Coprocessor management STM32Cube | Coprocessor management STM32Cube]] or [[:Category:Troubleshooting grids|troubleshooting grids]] categories. | If your issue is not listed, try looking in the articles in the [[:Category:Coprocessor management Linux| Coprocessor management Linux]], [[:Category:Coprocessor management STM32Cube | Coprocessor management STM32Cube]] or [[:Category:Troubleshooting grids|troubleshooting grids]] categories. | ||
Line 17: | Line 21: | ||
|| | || | ||
This may happen for two reasons: | This may happen for two reasons: | ||
* The firmware does not include any [[Coprocessor_resource_table|resource table]] or the resource table does not define any [[Coprocessor_resource_table# | * The firmware does not include any [[Coprocessor_resource_table|resource table]] or the resource table does not define any [[Coprocessor_resource_table#How_to_add_trace_for_the_log_buffer_-28STM32MP15x_lines_only-29|trace]]. | ||
: Update the firmware resource table and rebuild the firmware | : Update the firmware resource table and rebuild the firmware | ||
* The ".resource_table" section is empty or not defined in the elf file. | * The ".resource_table" section is empty or not defined in the elf file. | ||
Line 34: | Line 38: | ||
This is only a warning that does not prevent the firmware from starting properly. | This is only a warning that does not prevent the firmware from starting properly. | ||
"rproc load_rsc" step can be bypassed. | "rproc load_rsc" step can be bypassed. | ||
|- | |||
| | |||
When Loading a signed firmware from OP-TEE: | |||
"remoteproc remoteproc0: bad phdr da 0x80123db8 mem 0x7f36a8" | |||
|| | |||
There is probably a mismatch between the firmware memory mapping and the memory regions declared in the [[Linux_remoteproc_framework_overview#Device_tree_configuration | Linux remoteproc device tree]]. | |||
Use the following command to verify it in the generated elf file: | |||
{{PC$}} readelf -l <elf file> | |||
and compare the elf program header with the [[OP-TEE_remoteproc_framework_overview#Device_tree_configuration | OPTEE device tree reserved-memory]] declaration. | |||
|- | |||
| | |||
When Loading a signed firmware from OP-TEE: | |||
"E/TA: remoteproc_load_segment:887 Fails to clear segment, res = 0xffff0001" | |||
|| | |||
There is probably a mismatch between the firmware memory mapping and the memory regions declared in the [[How_to_protect_the_coprocessor_firmware#Device_tree_configuration | OP-TEE remoteproc device tree]]. | |||
Use the following command to verify it in the generated elf file: | |||
{{PC$}} readelf -l <elf file> | |||
and compare the elf program header with the [[OP-TEE_remoteproc_framework_overview#Device_tree_configuration | OPTEE device tree reserved-memory]] declaration. | |||
|- | |||
| | |||
When Loading a signed firmware from OP-TEE: | |||
"E/TA: remoteproc_load_fw:1014 Can't Authenticate the firmware <res = 0xFFFF0000>" | |||
|| | |||
This means the OP-TEE remoteproc framework detect something not valid in the the firmware format. | |||
The root cause can be: | |||
* The firmware is a ELF while a signed image is required. Following format should return the '''TEE''' supported format: | |||
{{PC$}} cat sys/class/remoteproc/remoteproc0/fw_format | |||
* The firmware file is corrupted. | |||
* The firmware image(s) has(ve) not be signed. | |||
* The firmware image(s) has been signed with a bad key. | |||
* The TLV parameters are not valid. | |||
See [[How_to_protect_the_coprocessor_firmware#Firmware_signature_2 | Firmware_signature]] for details<BR> | |||
To debug some traces can be added in {{CodeSource | OP-TEE_OS | ta/remoteproc/remoteproc_core.c}} | |||
</onlyinclude> | </onlyinclude> | ||
|} | |} | ||
== Inter processor communication == | == Inter processor communication == | ||
{{ReviewsComments|-- [[User:Michel Jaouen|Michel Jaouen]] ([[User talk:Michel Jaouen|talk]]) 09:04, 14 June 2024 (CEST)<br />Add one error on table : when ipcc channel probing failed on linux, it can be a misalignment between channel number set in linux and protection on these channel set in optee rif dts (i.e dts RIF set protection on channel 1 , while linux dts set 0 to access channel 1}} | |||
{{:Troubleshooting grid table template}} | {{:Troubleshooting grid table template}} | ||
<onlyinclude> | <onlyinclude> | ||
Line 53: | Line 92: | ||
stm32-ipcc 4c001000.mailbox: Try increasing MBOX_TX_QUEUE_LEN | stm32-ipcc 4c001000.mailbox: Try increasing MBOX_TX_QUEUE_LEN | ||
|| | || | ||
On each IPCC interrupt, the coprocessor treats all the buffered RPMsgs (one IPCC event for several RPMsgs). On Linux side, one IPCC signal is programmed for each RPMsg sent. This can result is an overflow warning on Linux since too many IPCC events are queued. No RPMsgs are dropped but this message could be interpreted as the coprocessor reaches its capacity to treat the received messages in time. | * On each IPCC interrupt, the coprocessor treats all the buffered RPMsgs (one IPCC event for several RPMsgs). On Linux side, one IPCC signal is programmed for each RPMsg sent. This can result is an overflow warning on Linux since too many IPCC events are queued. No RPMsgs are dropped but this message could be interpreted as the coprocessor reaches its capacity to treat the received messages in time.Consider reworking the code so that the coprocessor processes messages more efficiently or decreasing the rate of messages sent by Linux. | ||
Consider reworking the code so that the coprocessor processes messages more efficiently or decreasing the rate of messages sent by Linux. | * Another possible root cause could be that the IPCC was not properly deinitialized when the STM32Cube firmware was previously stopped, and the IPCC channels were not released. To prevent this issue, the STM32Cube firmware should implement the shutdown process as shown in the CoproSync_ShutDown example, and calls the HAL_IPCC_DeInit() API. | ||
|- | |- | ||
| | | | ||
Line 79: | Line 118: | ||
* The Linux kernel is built without the support of the stm32 IPCC mailbox: to enable it, refer to [[Linux_Mailbox_framework_overview#Configuration|IPCC configuration]]. | * The Linux kernel is built without the support of the stm32 IPCC mailbox: to enable it, refer to [[Linux_Mailbox_framework_overview#Configuration|IPCC configuration]]. | ||
* The mailboxes are not or incorrectly defined in the Linux kernel DeviceTree: fix it as described in [[Linux_remoteproc_framework_overview#Device_tree_configuration|mailbox DeviceTree]]. | * The mailboxes are not or incorrectly defined in the Linux kernel DeviceTree: fix it as described in [[Linux_remoteproc_framework_overview#Device_tree_configuration|mailbox DeviceTree]]. | ||
</ | |- | ||
| | |||
stm32Cube error: | |||
VIRT_UART_Transmit() returns an error until a first message<br>is received from the Cortex-A. | |||
| style="width:500px;; text-align:left;" | Before the Cortex-M can send any message, the RPMsg protocol requires that the Linux application has sent a first message (to provide its address to the Cortex-M).<BR> | |||
The Linux and/or the Cortex-M applications shall be reworked to follow this constraint. | |||
|} | |} | ||
Latest revision as of 09:04, 14 June 2024
Some typical issues related to the management of a coprocessor are listed below. Solutions or debugging methods are proposed for these issues.
If your issue is not listed, try looking in the articles in the Coprocessor management Linux, Coprocessor management STM32Cube or troubleshooting grids categories.
1. Coprocessor firmware loading and control
Symptom | Resolution |
---|---|
The coprocessor traces are not available on Linux® side
cat /sys/kernel/debug/remoteproc/remoteproc0/trace0
No such file or directory
|
This may happen for two reasons:
readelf -l <elf file>
...
02 .data .resource_table .bss ._user_heap_stack
....
|
When starting the coprocessor from the bootloader (u-boot):
"unsupported fw ver: 0
Remote Processor 0 resource table Not found : 0x00000000-0x0 "
|
The firmware does not include any resource table. This is only a warning that does not prevent the firmware from starting properly. "rproc load_rsc" step can be bypassed. |
When Loading a signed firmware from OP-TEE:
"remoteproc remoteproc0: bad phdr da 0x80123db8 mem 0x7f36a8"
|
There is probably a mismatch between the firmware memory mapping and the memory regions declared in the Linux remoteproc device tree. Use the following command to verify it in the generated elf file:
readelf -l <elf file>
and compare the elf program header with the OPTEE device tree reserved-memory declaration. |
When Loading a signed firmware from OP-TEE:
"E/TA: remoteproc_load_segment:887 Fails to clear segment, res = 0xffff0001"
|
There is probably a mismatch between the firmware memory mapping and the memory regions declared in the OP-TEE remoteproc device tree. Use the following command to verify it in the generated elf file:
readelf -l <elf file>
and compare the elf program header with the OPTEE device tree reserved-memory declaration. |
When Loading a signed firmware from OP-TEE:
"E/TA: remoteproc_load_fw:1014 Can't Authenticate the firmware <res = 0xFFFF0000>"
|
This means the OP-TEE remoteproc framework detect something not valid in the the firmware format. The root cause can be:
cat sys/class/remoteproc/remoteproc0/fw_format
See Firmware_signature for details |
2. Inter processor communication
Symptom | Resolution |
---|---|
Frozen firmware as consequence of a deadlock in OpenAMP during IP communication with the the main processor. |
This Issue probably comes from rpmsg_virtio_rx_callback or rpmsg_virtio_send_offchannel_raw (rpmsg_virtio.c) functions that are called in interrupt context. These functions use a mutex lock in rpmsg_device struct when accessing the index of the virtio queue index. Rework your code so that these functions are not called in interrupt context. |
Linux kernel trace:
stm32-ipcc 4c001000.mailbox: Try increasing MBOX_TX_QUEUE_LEN
|
|
Linux kernel trace ( example with rpmsg_tty driver):
rpmsg_tty virtio0.rpmsg-tty-channel.-1.0: timeout waiting for a tx buffer
|
This message means that there is no more TX buffer available to transmit messages to the remote processor. This may happen for two reasons:
|
Linux kernel trace:
rpmsg_tty virtio0.rpmsg-tty-channel.-1.0: No memory for tty_prepare_flip_string
|
There is no more space in the TTY temporary buffer on reception. The root cause is probably that the Linux application did not read the tty device on time to treat the incoming TTY stream. Consider reworking the Linux application so that it takes less time to process messages or decreasing the message exchange rate. |
Linux kernel trace:
remoteproc remoteproc0: stm32_rproc_kick: failed (<mbx>, <error value>)
|
The Linux remoteproc driver cannot use the IPCC mailbox. This may happen for two reasons:
|
stm32Cube error:
VIRT_UART_Transmit() returns an error until a first message |
Before the Cortex-M can send any message, the RPMsg protocol requires that the Linux application has sent a first message (to provide its address to the Cortex-M). The Linux and/or the Cortex-M applications shall be reworked to follow this constraint. |