7
31
Fork
You've already forked blackmagic
23

Fix: Adjust DMI idle cycles for remote "Too soon" responses #2230

Merged
dragonmux merged 1 commit from ALTracer/blackmagic:fix/remote-riscv-soon into main 2026年04月16日 04:49:53 +02:00
Contributor
Copy link

Detailed description

  • This is not a new feature.
  • The existing problem is BMDA getting stuck in some busy-IO-loop in riscv_dmi_init() when operating a BMP with RISC-V acceleration enabled. BMP standalone not affected.
  • This PR solves it by mirroring the logic to increment DMI idle cycles.

Tested on BMDA via blackpill-f411ce against modified Hazard3 v1.0.1 softcore on 1BitSquared Icebreaker v1.0e. I have added 10k pull-up options in PCF on JTAG pins, this improved the connection but the described bug didn't go away.
It should really be tested on other JTAG DTM RISC-V targets (like GD32VF103); e.g. RP2350 has a custom ADI DTM and will not be affected.
I can't say whether DTMCS Idle hint of 4 is correct https://github.com/Wren6991/Hazard3/blob/v1.0.1/hdl/debug/dtm/hazard3_jtag_dtm_core.v , the debugger is probably supposed to make do anyways.

Your checklist for this pull request

Closing issues

## Detailed description * This is not a new feature. * The existing problem is BMDA getting stuck in some busy-IO-loop in `riscv_dmi_init()` when operating a BMP with RISC-V acceleration enabled. BMP standalone not affected. * This PR solves it by mirroring the logic to increment DMI idle cycles. Tested on BMDA via `blackpill-f411ce` against modified Hazard3 v1.0.1 softcore on 1BitSquared Icebreaker v1.0e. I have added 10k pull-up options in PCF on JTAG pins, this improved the connection but the described bug didn't go away. It should really be tested on other JTAG DTM RISC-V targets (like GD32VF103); e.g. RP2350 has a custom ADI DTM and will not be affected. I can't say whether DTMCS Idle hint of 4 is correct https://github.com/Wren6991/Hazard3/blob/v1.0.1/hdl/debug/dtm/hazard3_jtag_dtm_core.v , the debugger is probably supposed to make do anyways. ## Your checklist for this pull request * [x] I've read the [Code of Conduct](https://codeberg.org/blackmagic-debug/blackmagic/src/CODE_OF_CONDUCT.md) * [x] I've read the [guidelines for contributing](https://codeberg.org/blackmagic-debug/blackmagic/src/CONTRIBUTING.md) to this repository * [x] It builds for hardware native (see [Building the firmware](https://codeberg.org/blackmagic-debug/blackmagic?tab=readme-ov-file#building-the-firmware)) * [x] It builds as BMDA (see [Building the BMDA](https://codeberg.org/blackmagic-debug/blackmagic?tab=readme-ov-file#building-black-magic-debug-app)) * [ ] I've tested it to the best of my ability * [x] My commit messages provide a useful short description of what the commits do ## Closing issues
Author
Contributor
Copy link
Snippet of BMDA bad log
ID code 0xdeadbeef: Hazard3 RISC-V DTM.
Enumerated 1 devices
0: IR length = 5, ID deadbeef
-> IR prescan: 0, postscan: 0
-> DR prescan: 0, postscan: 0
!JT043#
 K0
!JD0510#
 K1F
!JT021#
 K0
!JT031#
 K0
!JD200#
 K4071
!JT021#
 K0
RISC-V debug v0.13/v1.0 DMI
!JT043#
 K0
!JD0511#
 K10
!JT021#
 K0
!RSJ#
 K0
!Rd00040700000011#
 E303
!Rd00040700000011#
 E303
!Rd00040700000011#
 E303
!Rd00040700000011#
 E303
!Rd00040700000011#
Snippet of BMDA good log after this fix
RISC-V debug v0.13/v1.0 DMI
!JT043#
 K0
!JD0511#
 K10
!JT021#
 K0
!RSJ#
 K0
!Rd00040700000011#
 E303
!Rd00050700000011#
 E303
!Rd00060700000011#
 KA20C4300
remote_v4_riscv_jtag_dmi_read: 00000011 -> 00430ca2
riscv_dmi_read: 00000011 -> 00430ca2
RISC-V debug v0.13 DM
riscv_dmi_write: 00000010 <- 00000001
!RD0006070000001000000001#
 K0
remote_v4_riscv_jtag_dmi_write: 00000010 <- 00000001
riscv_dmi_write: 00000010 <- 03ffffc1
!RD0006070000001003ffffc1#
 K0
remote_v4_riscv_jtag_dmi_write: 00000010 <- 03ffffc1
!Rd00060700000010#
 K01000000
remote_v4_riscv_jtag_dmi_read: 00000010 -> 00000001
riscv_dmi_read: 00000010 -> 00000001
riscv_dmi_write: 00000010 <- 00000001
!RD0006070000001000000001#
 K0
remote_v4_riscv_jtag_dmi_write: 00000010 <- 00000001
!Rd00060700000011#
 KA20C4300
remote_v4_riscv_jtag_dmi_read: 00000011 -> 00430ca2
riscv_dmi_read: 00000011 -> 00430ca2
riscv_dmi_write: 00000010 <- 80000001
!RD0006070000001080000001#
 K0
remote_v4_riscv_jtag_dmi_write: 00000010 <- 80000001
!Rd00060700000011#
 KA2034300
remote_v4_riscv_jtag_dmi_read: 00000011 -> 004303a2
riscv_dmi_read: 00000011 -> 004303a2
riscv_dmi_write: 00000010 <- 00000001
!RD0006070000001000000001#
 K0
remote_v4_riscv_jtag_dmi_write: 00000010 <- 00000001
!Rd00060700000016#
 K01000002
remote_v4_riscv_jtag_dmi_read: 00000016 -> 02000001
riscv_dmi_read: 00000016 -> 02000001
Hart has 1 data registers and 2 progbuf registers
Attempting 32-bit read on misa
Reading 32-bit CSR 301
<details> <summary>Snippet of BMDA bad log</summary> ``` ID code 0xdeadbeef: Hazard3 RISC-V DTM. Enumerated 1 devices 0: IR length = 5, ID deadbeef -> IR prescan: 0, postscan: 0 -> DR prescan: 0, postscan: 0 !JT043# K0 !JD0510# K1F !JT021# K0 !JT031# K0 !JD200# K4071 !JT021# K0 RISC-V debug v0.13/v1.0 DMI !JT043# K0 !JD0511# K10 !JT021# K0 !RSJ# K0 !Rd00040700000011# E303 !Rd00040700000011# E303 !Rd00040700000011# E303 !Rd00040700000011# E303 !Rd00040700000011# ``` </details> <details> <summary>Snippet of BMDA good log after this fix</summary> ``` RISC-V debug v0.13/v1.0 DMI !JT043# K0 !JD0511# K10 !JT021# K0 !RSJ# K0 !Rd00040700000011# E303 !Rd00050700000011# E303 !Rd00060700000011# KA20C4300 remote_v4_riscv_jtag_dmi_read: 00000011 -> 00430ca2 riscv_dmi_read: 00000011 -> 00430ca2 RISC-V debug v0.13 DM riscv_dmi_write: 00000010 <- 00000001 !RD0006070000001000000001# K0 remote_v4_riscv_jtag_dmi_write: 00000010 <- 00000001 riscv_dmi_write: 00000010 <- 03ffffc1 !RD0006070000001003ffffc1# K0 remote_v4_riscv_jtag_dmi_write: 00000010 <- 03ffffc1 !Rd00060700000010# K01000000 remote_v4_riscv_jtag_dmi_read: 00000010 -> 00000001 riscv_dmi_read: 00000010 -> 00000001 riscv_dmi_write: 00000010 <- 00000001 !RD0006070000001000000001# K0 remote_v4_riscv_jtag_dmi_write: 00000010 <- 00000001 !Rd00060700000011# KA20C4300 remote_v4_riscv_jtag_dmi_read: 00000011 -> 00430ca2 riscv_dmi_read: 00000011 -> 00430ca2 riscv_dmi_write: 00000010 <- 80000001 !RD0006070000001080000001# K0 remote_v4_riscv_jtag_dmi_write: 00000010 <- 80000001 !Rd00060700000011# KA2034300 remote_v4_riscv_jtag_dmi_read: 00000011 -> 004303a2 riscv_dmi_read: 00000011 -> 004303a2 riscv_dmi_write: 00000010 <- 00000001 !RD0006070000001000000001# K0 remote_v4_riscv_jtag_dmi_write: 00000010 <- 00000001 !Rd00060700000016# K01000002 remote_v4_riscv_jtag_dmi_read: 00000016 -> 02000001 riscv_dmi_read: 00000016 -> 02000001 Hart has 1 data registers and 2 progbuf registers Attempting 32-bit read on misa Reading 32-bit CSR 301 ``` </details>
dragonmux requested changes 2026年04月15日 03:22:00 +02:00
Dismissed
dragonmux left a comment
Copy link

Only a couple of changes needed - one of which entirely our fault because we told you on Discord to stick the adjustment code in the wrong place. Apologies for that! The general idea looks sound though and we're glad you spotted the sticky dmi->fault code bug too as that isn't right.

With these adjustments made, we'll be more than happy to merge this and fix the remote protocol handling for RISC-V debug.

Only a couple of changes needed - one of which entirely our fault because we told you on Discord to stick the adjustment code in the wrong place. Apologies for that! The general idea looks sound though and we're glad you spotted the sticky `dmi->fault` code bug too as that isn't right. With these adjustments made, we'll be more than happy to merge this and fix the remote protocol handling for RISC-V debug.
@ -80,3 +80,3 @@
/* Read back the answer and check for errors */
length = platform_buffer_read(buffer, REMOTE_MAX_MSG_SIZE);
if (!remote_v4_riscv_check_error(__func__, dmi, buffer, length))
if (!remote_v4_riscv_check_error(__func__, dmi, buffer, length)) {

Turns out we told you to put this new logic in the wrong place.. please would you be so kind as to move the too-soon -> idle cycles adjustment logic in remote_v4_riscv_check_error().

dmi->fault is not supposed to be sticky, either, so after the line 67 DEBUG_ERROR(), an else needs adding (because of the logic, this can only be for OK) which sets dmi->fault = RV_DMI_SUCCESS. That'll solve this for both reads and writes.

You can put the adjustment logic in the error == REMOTE_ERROR_FAULT branch so it more than just sets up dmi->fault, but then actually also handles the too-soon fault in a way that matches how the low-level logic does too.

Turns out we told you to put this new logic in the wrong place.. please would you be so kind as to move the too-soon -> idle cycles adjustment logic in `remote_v4_riscv_check_error()`. `dmi->fault` is not supposed to be sticky, either, so after the line 67 `DEBUG_ERROR()`, an `else` needs adding (because of the logic, this can only be for OK) which sets `dmi->fault = RV_DMI_SUCCESS`. That'll solve this for both reads and writes. You can put the adjustment logic in the `error == REMOTE_ERROR_FAULT` branch so it more than just sets up dmi->fault, but then actually also handles the too-soon fault in a way that matches how the low-level logic does too.
dragonmux marked this conversation as resolved
@ -83,0 +84,4 @@
* If we got RV_DMI_TOO_SOON and we're under 8 idle cycles, increase the number
* of idle cycles used to compensate and have the outer code re-run the transfers
*/
if (dmi->fault == RV_DMI_TOO_SOON && dmi->idle_cycles < 8)

U on the end of the constant please.

`U` on the end of the constant please.
dragonmux marked this conversation as resolved
ALTracer force-pushed fix/remote-riscv-soon from d07fcfc6f0
Some checks failed
ci/woodpecker/pr/build-firmware/4 Pipeline was successful
ci/woodpecker/pr/build-firmware/7 Pipeline was successful
ci/woodpecker/pr/build-firmware/8 Pipeline was successful
ci/woodpecker/pr/build-firmware/5 Pipeline was successful
ci/woodpecker/pr/build-firmware/2 Pipeline was successful
ci/woodpecker/pr/build-firmware/6 Pipeline was successful
ci/woodpecker/pr/build-firmware/3 Pipeline was successful
ci/woodpecker/pr/build-firmware/1 Pipeline was successful
ci/woodpecker/pr/build-firmware/16 Pipeline was successful
ci/woodpecker/pr/build-firmware/15 Pipeline was successful
ci/woodpecker/pr/build-firmware/14 Pipeline was successful
ci/woodpecker/pr/build-firmware/13 Pipeline was successful
ci/woodpecker/pr/build-firmware/9 Pipeline was successful
ci/woodpecker/pr/build-firmware/10 Pipeline was successful
ci/woodpecker/pr/build-firmware/11 Pipeline was successful
ci/woodpecker/pr/build-firmware/12 Pipeline was successful
ci/woodpecker/pr/build-linux/2 Pipeline was successful
ci/woodpecker/pr/build-linux/1 Pipeline was successful
ci/woodpecker/pr/build-firmware/20 Pipeline was successful
ci/woodpecker/pr/build-firmware/18 Pipeline failed
ci/woodpecker/pr/build-firmware/19 Pipeline was successful
ci/woodpecker/pr/build-windows Pipeline was successful
ci/woodpecker/pr/build-firmware/17 Pipeline was successful
to f4c3baca4b
Some checks are pending
ci/woodpecker/pr/build-firmware/1 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/2 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/3 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/4 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/5 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/6 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/7 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/8 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/9 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/10 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/11 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/12 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/13 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/14 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/15 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/16 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/17 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/18 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/19 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/20 Pipeline is pending approval
ci/woodpecker/pr/build-linux/1 Pipeline is pending approval
ci/woodpecker/pr/build-linux/2 Pipeline is pending approval
ci/woodpecker/pr/build-windows Pipeline is pending approval
2026年04月16日 04:12:48 +02:00
Compare
ALTracer force-pushed fix/remote-riscv-soon from f4c3baca4b
Some checks are pending
ci/woodpecker/pr/build-firmware/1 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/2 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/3 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/4 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/5 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/6 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/7 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/8 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/9 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/10 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/11 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/12 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/13 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/14 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/15 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/16 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/17 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/18 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/19 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/20 Pipeline is pending approval
ci/woodpecker/pr/build-linux/1 Pipeline is pending approval
ci/woodpecker/pr/build-linux/2 Pipeline is pending approval
ci/woodpecker/pr/build-windows Pipeline is pending approval
to d16b5e0f86
Some checks failed
ci/woodpecker/pr/build-firmware/16 Pipeline was successful
ci/woodpecker/pr/build-firmware/19 Pipeline was successful
ci/woodpecker/pr/build-firmware/17 Pipeline was successful
ci/woodpecker/pr/build-firmware/18 Pipeline failed
ci/woodpecker/pr/build-firmware/20 Pipeline was successful
ci/woodpecker/pr/build-linux/2 Pipeline was successful
ci/woodpecker/pr/build-windows Pipeline was successful
ci/woodpecker/push/build-firmware/1 Pipeline was successful
ci/woodpecker/push/build-firmware/2 Pipeline was successful
ci/woodpecker/push/build-firmware/5 Pipeline was successful
ci/woodpecker/push/build-firmware/4 Pipeline was successful
ci/woodpecker/push/build-firmware/3 Pipeline was successful
ci/woodpecker/push/build-firmware/6 Pipeline was successful
ci/woodpecker/push/build-firmware/7 Pipeline was successful
ci/woodpecker/push/build-firmware/9 Pipeline was successful
ci/woodpecker/push/build-firmware/8 Pipeline was successful
ci/woodpecker/push/build-firmware/10 Pipeline was successful
ci/woodpecker/push/build-firmware/12 Pipeline was successful
ci/woodpecker/push/build-firmware/11 Pipeline was successful
ci/woodpecker/push/build-firmware/16 Pipeline was successful
ci/woodpecker/push/build-firmware/17 Pipeline was successful
ci/woodpecker/push/build-firmware/14 Pipeline was successful
ci/woodpecker/push/build-firmware/15 Pipeline was successful
ci/woodpecker/push/build-firmware/13 Pipeline was successful
ci/woodpecker/push/build-firmware/18 Pipeline failed
ci/woodpecker/push/build-linux/1 Pipeline was successful
ci/woodpecker/push/build-firmware/19 Pipeline was successful
ci/woodpecker/push/build-firmware/20 Pipeline was successful
ci/woodpecker/push/build-linux/2 Pipeline was successful
ci/woodpecker/push/build-windows Pipeline was successful
2026年04月16日 04:32:40 +02:00
Compare
dragonmux left a comment
Copy link

LGTM, merging. Thank you for the contribution and fixing this part of the BMD remote protocol implementation!

LGTM, merging. Thank you for the contribution and fixing this part of the BMD remote protocol implementation!
Sign in to join this conversation.
No reviewers
Labels
Clear labels
BMD App
Black Magic Debug App (aka. PC hosted) (not firmware)
BMP Firmware
Black Magic Probe Firmware (not PC hosted software)
Bug
Confirmed bug
Build system
Build system
Can't reproduce
Maintainers can't reproduce this problem
CI
Continuous Integration System
Contribution wanted
User contributions welcome
Documentation
Project documentation
Draft
Work in progress draft
Duplicate
This issue or pull request already exists
Enhancement
General project improvement
Feedback wanted
Requires additional submitter feedback
Foreign Host Board
Non Native hardware to runing Black Magic firmware on
GDB
Issue/PR related to GDB
Good first issue
Good for newcommers
HwIssue Mitigation
Solving or mitigating a Hardware issue in Software
Information Needed
Maintainers need more information
NativeHardware
Official Black Magic Debug Hardware
New Host Board
New hardware to run Black Magic firmware on
New Target
New debug target
Off Topic
Something that does not involve the project in any way
Potential Bug
A potential, unconfirmed or very special circumstance bug
Regression
Bug caused by a regression
User Interest Needed
More user interest required before consideration
User Testing Needed
Looking for user testing reports
Won't fix
Outside of the project scope or works as intended
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
blackmagic-debug/blackmagic!2230
Reference in a new issue
blackmagic-debug/blackmagic
No description provided.
Delete branch "ALTracer/blackmagic:fix/remote-riscv-soon"

Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?