On 2/16/24 17:09, Sean Anderson wrote:
On 2/16/24 11:03, Sean Anderson wrote:
On 2/16/24 10:06, Michal Simek wrote:


On 2/16/24 14:48, Michal Simek wrote:


On 2/15/24 20:31, Sean Anderson wrote:
On 2/15/24 14:08, Michal Simek wrote:


On 2/15/24 18:19, Sean Anderson wrote:
Currently, when we boot from JTAG we try to boot U-Boot from RAM.
However, this is a bit tricky to time, since the debugger has to wait
for SPL to initialize RAM before it can load U-Boot. This can result in
long waits, since occasionally initializing RAM (and other things in
psu_init) takes a long time to complete and the debugger must wait for
this worst case.

Support semihosting if it is enabled, as it lets U-Boot tell the
debugger when we are ready for the image. This means we don't have to
wait any more than necessary. We don't change the default config to
ensure we don't break compatibility with existing debuggers that don't
expect us to hit semihosting breakpoints.

Signed-off-by: Sean Anderson <sean.ander...@seco.com>
---

    arch/arm/mach-zynqmp/spl.c | 10 ++++++++--
    1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/arch/arm/mach-zynqmp/spl.c b/arch/arm/mach-zynqmp/spl.c
index a0f35f36faa..5af735aa5ce 100644
--- a/arch/arm/mach-zynqmp/spl.c
+++ b/arch/arm/mach-zynqmp/spl.c
@@ -9,6 +9,7 @@
    #include <image.h>
    #include <init.h>
    #include <log.h>
+#include <semihosting.h>
    #include <spl.h>
    #include <linux/delay.h>

@@ -66,6 +67,11 @@ void spl_board_init(void)
    }
    #endif

+static u32 jtag_boot_device(void)
+{
+       return semihosting_enabled() ? BOOT_DEVICE_SMH : BOOT_DEVICE_RAM;
+}
+
    void board_boot_order(u32 *spl_boot_list)
    {
           spl_boot_list[0] = spl_boot_device();
@@ -75,7 +81,7 @@ void board_boot_order(u32 *spl_boot_list)
           if (spl_boot_list[0] == BOOT_DEVICE_MMC2)
                   spl_boot_list[1] = BOOT_DEVICE_MMC1;

-       spl_boot_list[2] = BOOT_DEVICE_RAM;
+       spl_boot_list[2] = jtag_boot_device();
    }

    u32 spl_boot_device(void)
@@ -97,7 +103,7 @@ u32 spl_boot_device(void)

           switch (bootmode) {
           case JTAG_MODE:
-               return BOOT_DEVICE_RAM;
+               return jtag_boot_device();
    #ifdef CONFIG_SPL_MMC
           case SD_MODE1:
           case SD1_LSHFT_MODE: /* not working on silicon v1 */

Good timing. Can you please tell me how to test this? What's the setup?
Which debugger are you using?

I am using OpenOCD with the patches at 
https://cas5-0-urlprotect.trendmicro.com:443/wis/clicktime/v1/query?url=https%3a%2f%2freview.openocd.org%2fc%2fopenocd%2f%2b%2f8133&umid=6e1be473-0b3f-4bc4-a4f0-403592e74baf&auth=d807158c60b7d2502abde8a2fc01f40662980862-afc15b07b0f91c910f832185958363d84f990a08


I am trying it on the top of the latest git but getting issue with event block 
and no idea how to fix it.

# sudo openocd -f 
/usr/local/share/openocd/scripts/interface/ftdi/digilent_jtag_hs3.cfg -f 
/usr/local/share/openocd/scripts/target/xilinx_zynqmp.cfg
Open On-Chip Debugger 0.12.0+dev-01509-g6d288937cb2d (2024-02-16-12:22)
Licensed under GNU GPL v2
For bug reports, read
      
https://cas5-0-urlprotect.trendmicro.com:443/wis/clicktime/v1/query?url=http%3a%2f%2fopenocd.org%2fdoc%2fdoxygen%2fbugs.html&umid=6e1be473-0b3f-4bc4-a4f0-403592e74baf&auth=d807158c60b7d2502abde8a2fc01f40662980862-f501ab9aa5516ff666e387e53598fd624398f1bc
Info : auto-selecting first available session transport "jtag". To override use 
'transport select <transport>'.
wrong # args: should be "-event <event-name> <event-body>"


Do you know how to fix it?


I actually bisect it and found that it is caused by
jtag: rewrite jim_jtag_configure() as COMMAND_HANDLER
ea2e26f7d521f5755b4bfda7bf12d99650277421

Interesting. I have been testing with 0.12.

# sudo openocd -f 
/usr/local/share/openocd/scripts/interface/ftdi/digilent_jtag_smt2_nc.cfg -f 
/usr/local/share/openocd/scripts/target/xilinx_zynqmp.cfg

FWIW after installing the udev rules I do not need sudo

Open On-Chip Debugger 0.12.0+dev-01512-g214206ebb972 (2024-02-16-15:38)
Licensed under GNU GPL v2
For bug reports, read
     
https://cas5-0-urlprotect.trendmicro.com:443/wis/clicktime/v1/query?url=http%3a%2f%2fopenocd.org%2fdoc%2fdoxygen%2fbugs.html&umid=6e1be473-0b3f-4bc4-a4f0-403592e74baf&auth=d807158c60b7d2502abde8a2fc01f40662980862-f501ab9aa5516ff666e387e53598fd624398f1bc
none separate
Info : auto-selecting first available session transport "jtag". To override use 
'transport select <transport>'.
Info : Hardware thread awareness created
boot_apu
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Warn : An adapter speed is not selected in the init scripts. OpenOCD will try 
to run the adapter at very low speed (100 kHz).
Warn : To remove this warnings and achieve reasonable communication speed with the target, set 
"adapter speed" or "jtag_rclk" in the init scripts.
Info : clock speed 100 kHz
Info : TAP uscale.tap does not have valid IDCODE (idcode=0x48e70126)
Info : JTAG tap: uscale.ps tap/device found: 0x24738093 (mfg: 0x049 (Xilinx), 
part: 0x4738, ver: 0x2)
Info : JTAG tap: uscale.tap tap/device found: 0x5ba00477 (mfg: 0x23b (ARM Ltd), 
part: 0xba00, ver: 0x5)
Info : JTAG tap: uscale.ps tap/device found: 0x24738093 (mfg: 0x049 (Xilinx), 
part: 0x4738, ver: 0x2)
Error: JTAG-DP STICKY ERROR
Error: [uscale.a53.0] Examination failed
Warn : target uscale.a53.0 examination failed
Info : [uscale.axi] Examination succeed
Info : starting gdb server for uscale.a53.0 on 3333
Info : Listening on port 3333 for gdb connections
Info : gdb port disabled

but with zcu102 I am still not able to connect because error above.
The same behavior with recording SOM IDs I see on kv260 (via hs3 cable).
It looks like that not everything is working for zynqmp.

Is this with the boot mode set to JTAG? If so, you will not be able to
examine any of the CPUs until you have released them from reset. So you
should be able to run

         targets uscale.axi
         boot_pmu /path/to/pmu-firmware.bin
         boot_apu /path/to/u-boot-spl.bin

to boot a CPU. If you want to silence the above error, you can add

         uscale.a53.0 configure -defer-examine

to your config. So the full command would be

$ openocd -f interface/ftdi/digilent_jtag_smt2_nc.cfg \
         -f target/xilinx_zynqmp.cfg \
         -c 'uscale.a53.o configure -defer-examine' \
         -c init -c 'targets uscale.axi' \
         -c 'boot_pmu /path/to/pmu-firmware.bin' \
         -c 'boot_apu /path/to/boot.bin'

Let me know if that works for you.

Oh, and I forgot to mention, but if you are testing semihosting then you will 
need to add

-c 'uscale.a53.0 arm semihosting enable'

to the end of that. I also find setting the semihosting base directory with

-c 'uscale.a53.0 arm semihosting_basedir $IMAGEDIR'

to be helpful.

As you can imagine this is a long command line, so I have a config which looks 
like

source [find interface/ftdi/digilent_jtag_smt2_nc.cfg]
adapter speed 25000
source [find target/xilinx_zynqmp.cfg]
uscale.a53.0 configure -defer-examine

proc boot {imagedir machine} {
         targets uscale.axi
         boot_pmu "${imagedir}/pmu-firmware-${machine}.bin"
         boot_apu "${imagedir}/u-boot-spl.bin"
         uscale.a53.0 arm semihosting enable
         uscale.a53.0 arm semihosting_basedir $imagedir
}

which I invoke like

$ openocd -f my_config.cfg -c init -c 'boot /path/to/images my-machine'


ok. 0.12.0 version is working better. I am able to load firmware to APU but I was not able to load pmufw. It was saying timeout like this.

> boot_pmu /mnt/disk/som/pmu_obj.bin
/usr/local/bin/../share/openocd/scripts/target/xilinx_zynqmp.cfg:173: Error: Timed out waiting for PMU firmware
in procedure 'boot_pmu'
in procedure 'resume_pmu' called at file "/usr/local/bin/../share/openocd/scripts/target/xilinx_zynqmp.cfg", line 232
at file "/usr/local/bin/../share/openocd/scripts/target/xilinx_zynqmp.cfg", 
line 173
>

Then I looked at pmu and use below snipset which I use on xsdb to make it visible for debugger and also small waiting time.


@@ -141,6 +146,13 @@ add_help_text halt_pmu "Halt the PMU in preparation for loading new firmware.\
        This should be matched with a call to resume_pmu."
 proc halt_pmu {} {
        set axi $::_CHIPNAME.axi
+
+       puts "Enable PMU target"
+       set val [$axi read_memory 0xFFCA0038 32 1]
+       $axi write_memory 0xFFCA0038 32 [expr {$val | 0x1C0}]
+       sleep 5
+       puts "PMU target should be enabled"
+
        set val [$axi read_memory $::IPI_PMU_0_IER 32 1]
        $axi write_memory $::IPI_PMU_0_IER 32 [expr {$val | $::IPI_PMU_0}]

With that I am able to test your patch but it is kind of slow.
Max freq I am able to use on zcu102 is 2MHz which is far from 15MHz used by 
xsdb.

After some time I am seeing

Error: Invalid ACK (4) in DAP response
Polling target uscale.a53.0 failed, trying to reexamine
Error: Invalid ACK (0) in DAP response
Error: Could not initialize the APB-AP
Examination failed, GDB will be halted. Polling again in 100ms
Error: Invalid ACK (0) in DAP response
Polling target uscale.a53.0 failed, trying to reexamine
Error: Invalid ACK (0) in DAP response
Error: Could not initialize the APB-AP
Examination failed, GDB will be halted. Polling again in 300ms
Error: Invalid ACK (0) in DAP response
Polling target uscale.a53.0 failed, trying to reexamine
Error: Invalid ACK (0) in DAP response
Error: Could not initialize the APB-AP
Examination failed, GDB will be halted. Polling again in 700ms
Error: Invalid ACK (0) in DAP response

OpenOCD is far from stable but it does something.

Thanks,
Michal






Reply via email to