On Wednesday 27 October 2021 17:08:35 Marek Behún wrote:
> On Wed, 27 Oct 2021 16:10:21 +0200
> Pali Rohár <p...@kernel.org> wrote:
> 
> > On Wednesday 27 October 2021 15:52:47 Pali Rohár wrote:
> > > On Wednesday 27 October 2021 07:09:42 Stefan Roese wrote:  
> > > > On 26.10.21 20:48, Pali Rohár wrote:  
> > > > > On Tuesday 26 October 2021 16:21:02 Stefan Roese wrote:  
> > > > > > On 26.10.21 14:40, Pali Rohár wrote:  
> > > > > > > My another guess there could be a problem is usage of stack. 
> > > > > > > Maybe it is
> > > > > > > possible that register with stack pointer is not initialized 
> > > > > > > after the
> > > > > > > full transfer when going to execute main image. Same arm baudrate 
> > > > > > > change
> > > > > > > code is used after the SPL and before main U-Boot, and the first
> > > > > > > instruction is "push". Maybe modifying the arm code to not use 
> > > > > > > stack
> > > > > > > when switching the baudrate back to 115200 could also help. I 
> > > > > > > will look
> > > > > > > at it.  
> > > > > > 
> > > > > > Thanks.  
> > > > > 
> > > > > Here is dirty hack patch which completely disable calling code for
> > > > > changing baudrate back to 115200 on ARM side:
> > > > > 
> > > > > diff --git a/tools/kwboot.c b/tools/kwboot.c
> > > > > index 5f4ff673972e..00d58a239c71 100644
> > > > > --- a/tools/kwboot.c
> > > > > +++ b/tools/kwboot.c
> > > > > @@ -1070,17 +1070,17 @@ kwboot_xmodem(int tty, const void *_img, 
> > > > > size_t size, int baudrate)
> > > > >               return rc;
> > > > >       if (baudrate) {
> > > > > -             char buf[sizeof(kwb_baud_magic)];
> > > > > -
> > > > > -             kwboot_printv("Waiting 1s for baudrate change magic\n");
> > > > > -             rc = kwboot_tty_recv(tty, buf, sizeof(buf), 1000);
> > > > > -             if (rc)
> > > > > -                     return rc;
> > > > > -
> > > > > -             if (memcmp(buf, kwb_baud_magic, sizeof(buf))) {
> > > > > -                     errno = EPROTO;
> > > > > -                     return -1;
> > > > > -             }
> > > > > +//           char buf[sizeof(kwb_baud_magic)];
> > > > > +//
> > > > > +//           kwboot_printv("Waiting 1s for baudrate change magic\n");
> > > > > +//           rc = kwboot_tty_recv(tty, buf, sizeof(buf), 1000);
> > > > > +//           if (rc)
> > > > > +//                   return rc;
> > > > > +//
> > > > > +//           if (memcmp(buf, kwb_baud_magic, sizeof(buf))) {
> > > > > +//                   errno = EPROTO;
> > > > > +//                   return -1;
> > > > > +//           }
> > > > >               kwboot_printv("\nChanging baudrate back to 115200 
> > > > > Bd\n\n");
> > > > >               rc = kwboot_tty_change_baudrate(tty, 115200);
> > > > > @@ -1551,8 +1551,8 @@ kwboot_img_patch(void *img, size_t *size, int 
> > > > > baudrate)
> > > > >                * This code is appended after the data part of the 
> > > > > image and
> > > > >                * execaddr is changed to execute this code before 
> > > > > U-Boot proper.
> > > > >                */
> > > > > -             kwboot_printv("Injecting code for changing baudrate 
> > > > > back\n");
> > > > > -             _copy_baudrate_change_code(hdr, size, 1, baudrate, 
> > > > > 115200);
> > > > > +//           kwboot_printv("Injecting code for changing baudrate 
> > > > > back\n");
> > > > > +//           _copy_baudrate_change_code(hdr, size, 1, baudrate, 
> > > > > 115200);  
> > > > 
> > > > I do have this here in my version as well:
> > > > 
> > > >                 /* Update the 32-bit data checksum */
> > > >                 *kwboot_img_csum32_ptr(img) = kwboot_img_csum32(img);
> > > > 
> > > >                 /* recompute header size */
> > > >                 hdrsz = kwbheader_size(hdr);
> > > > 
> > > > So I'm using the newer version, just to be sure.  
> > > 
> > > Ok, I probably generated diff against older version, but you have
> > > figured out how to apply it.
> > >   
> > > > >               /* recompute header size */
> > > > >               hdrsz = kwbheader_size(hdr);
> > > > > 
> > > > > As main U-Boot binary on ARM resets UART, it means that baudrate is
> > > > > properly set to 115200. Probably beginning of the U-Boot output could 
> > > > > be
> > > > > lost but at least console should start.
> > > > > 
> > > > > Could you try this patch if it starts working now?  
> > > > 
> > > > Okay, applied this patch and and booting with different baudrates works
> > > > on this board again (tested with 230400):
> > > > 
> > > >  96 %
> > > > [......................................................................]
> > > >  98 %
> > > > [......................................................................]
> > > >  99 % [................       ]
> > > > Done
> > > > Finishing transfer
> > > > 
> > > > Changing baudrate back to 115200 Bd
> > > > 
> > > > [Type Ctrl-\ + c to quit]
> > > > 
> > > > 
> > > > U-Boot 2021.10-00908-gc129aa2f173a-dirty (Oct 27 2021 - 07:05:39 +0200)
> > > > 
> > > > SoC:   MV78260-B0 at 1333 MHz
> > > > I2C:   ready
> > > > DRAM:  2 GiB (667 MHz, 64-bit, ECC not enabled)
> > > > Loading Environment from SPIFlash... SF: Detected m25p128 with page 
> > > > size 256
> > > > Bytes, erase size 256 KiB, total 16 MiB
> > > > OK
> > > > Model: Marvell Armada XP theadorable
> > > > ...
> > > > 
> > > > 
> > > > Thanks,
> > > > Stefan  
> > > 
> > > Perfect! So it really looks like that issue is in the code which resets
> > > baudrate back to the value 115200.
> > > 
> > > I have there another diff which removes usage of the stack in code which
> > > resets baudrate back to default value:
> > > 
> > > diff --git a/tools/kwboot.c b/tools/kwboot.c
> > > index b56c9a0c8104..8f0e50501398 100644
> > > --- a/tools/kwboot.c
> > > +++ b/tools/kwboot.c
> > > @@ -1444,6 +1444,11 @@ _inject_baudrate_change_code(void *img, size_t 
> > > *size, int pre,
> > >   memcpy(code, kwboot_baud_code, codesz - 8);
> > >   *(uint32_t *)(code + codesz - 8) = cpu_to_le32(old_baud);
> > >   *(uint32_t *)(code + codesz - 4) = cpu_to_le32(new_baud);
> > > +
> > > + if (!pre) {  
> > 
> > Ou, there is a mistake, it should be "if (pre) {"
> > 
> > > +         *(uint32_t *)code = cpu_to_le32(0xe1a00000); /* arm nop */
> > > +         *(uint32_t *)(code + codesz - 4*7) = cpu_to_le32(0xe12fff1e); 
> > > /* bx lr */
> > > + }
> 
> This fixes it for me as well, for that one Omnia which didn't work
> which I was debugging a few days ago.
> 
> I guess this can't be done in the binhdr? So we need 2 different
> versions? I don't quite like this ad-hoc change, but I also don't
> like two copies with just a small change between them...
> 
> Marek

I will prepare cleanup / proper patch with one (configurable) version.
Just I need to know if this change fixes issue also for AXP.

Reply via email to