]> www.infradead.org Git - users/borneoa/openocd-next.git/commitdiff
target: cortex_m: fix polling for target kept under reset
authorAntonio Borneo <borneo.antonio@gmail.com>
Mon, 15 Jul 2024 09:56:36 +0000 (11:56 +0200)
committerAntonio Borneo <borneo.antonio@gmail.com>
Sat, 2 Nov 2024 20:59:48 +0000 (20:59 +0000)
In multi-target SoC not all the targets are running simultaneously
and some target could be powered off or kept under reset.
Commit 4892e32294c6 ("target/cortex_m: allow poll quickly get out
of TARGET_RESET state") does not considers the case of a target
that is kept in reset and expects the target to change state from
TARGET_RESET immediately.
This causes OpenOCD to log continuously:
Info : [stm32mp15x.cm4] external reset detected
Info : [stm32mp15x.cm4] external reset detected
Info : [stm32mp15x.cm4] external reset detected

Read again dhcsr to detect the 'stable' reset status and quit,
waiting for next poll to re-check the target's status.

Change-Id: Ic66029b988404a1599bb99bc66d4a8845b8b02c6
Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com>
Fixes: 4892e32294c6 ("target/cortex_m: allow poll quickly get out of TARGET_RESET state")
Reviewed-on: https://review.openocd.org/c/openocd/+/8399
Reviewed-by: Tomas Vanek <vanekt@fbl.cz>
Tested-by: jenkins
src/target/cortex_m.c

index bd0e8d88673f9c861ba62ad6c8021daf5b0e359e..e78d2e29ba0cc464962e3f127df65a663618c440 100644 (file)
@@ -989,6 +989,18 @@ static int cortex_m_poll_one(struct target *target)
                         * and keep it until the next poll to allow its detection */
                        return ERROR_OK;
                }
+
+               /* refresh status bits */
+               retval = cortex_m_read_dhcsr_atomic_sticky(target);
+               if (retval != ERROR_OK)
+                       return retval;
+
+               /* If still under reset, quit and re-check at next poll */
+               if (cortex_m->dcb_dhcsr_cumulated_sticky & S_RESET_ST) {
+                       cortex_m->dcb_dhcsr_cumulated_sticky &= ~S_RESET_ST;
+                       return ERROR_OK;
+               }
+
                /* S_RESET_ST was expected (in a reset command). Continue processing
                 * to quickly get out of TARGET_RESET state */
        }