[Solved] Uboot - Not enough buffer for decompression LZMA ERROR 1

I bought a TP-Link Archer D7 it's not officially supported but, it's an Archer C7 (QCA9558) + modem (BCM6318).

I added this WIP wiki page few minutes ago.

Briefly, I was trying to boot using an initramfs image but it says:
Uncompressing Kernel Image ... Not enough buffer for decompression LZMA ERROR 1 - must RESET board to recover

Obviously my image is smaller than the RAM (few MBs vs 128MB).

Digging inside the GPL code from TP-Link, seems that uboot does some checks reading the size of the currently flashed kernel size and expects an equal or smaller kernel to boot.

I tried to tftpboot the oem firmware and it's working,

How can I solve this problem?

I was wondering (without overwriting the original firmware), is possible to create a "fake small kernel" initramfs that loads the real openwrt image?

To which adress did you tftpload?
That sound like a classic wrong adress,usually its 0x84000000

I use the same address from original firmware...

The OEM bootlog says:

## Booting image at 80800000 ...

So the address should be correct

No,that is not correct for using tftpboot.
Try using 0x84000000

Same error :frowning:

AP135> tftpboot 0x84000000 openwrt-ar71xx-generic-archer-c7-v2-initramfs-kernel.bin
Using eth0 device
TFTP from server 192.168.1.100; our IP address is 192.168.1.1
Filename 'openwrt-ar71xx-generic-archer-c7-v2-initramfs-kernel.bin'.
Load address: 0x84000000
Loading: #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         ###################################################
done
Bytes transferred = 2586914 (277922 hex)
AP135> bootm 0x84000000
## Booting image at 84000000 ...
        Uncompressing Kernel Image ... Not enough buffer for decompression
LZMA ERROR 1 - must RESET board to recover

Can you post u-boot env variables?

Here you are:

AP135> printenv
bootargs=console=ttyS0,115200 root=31:02 rootfstype=squashfs init=/sbin/init mtdparts=ath-nor0:128k(u-boot),1280k(kernel),14656k(rootfs),64k(radioDECT),64k(config),64k(romfs),64k(rom),64k(radio)
bootcmd=bootm 0x80800000
bootdelay=1
baudrate=115200
ethaddr=0x00:0xaa:0xbb:0xcc:0xdd:0xee
ipaddr=192.168.1.1
serverip=192.168.1.100
dir=
lu=tftp 0x80060000 ${dir}u-boot.bin&&erase 0x9f000000 +$filesize&&cp.b $fileaddr 0x9f000000 $filesize
lf=tftp 0x80060000 ${dir}ap135${bc}-jffs2&&erase 0x9f050000 +0x630000&&cp.b $fileaddr 0x9f050000 $filesize
lk=tftp 0x80060000 ${dir}vmlinux${bc}.lzma.uImage&&erase 0x9f680000 +$filesize&&cp.b $fileaddr 0x9f680000 $filesize
stdin=serial
stdout=serial
stderr=serial
ethact=eth0

Can you try using ${loadaddr} as adress in tftpboot?
Altough I doubt they defined it.

You can also try 0x80060000 as I can see it defined in flashing commands as a location to load into RAM

Something strange happens if I use ${loadaddr}. I think that ${loadaddr} is empty so uses openwrt-ar71xx-generic-archer-c7-v2-initramfs-kernel.bin as an address ...:joy:

AP135> tftpboot ${loadaddr} openwrt-ar71xx-generic-archer-c7-v2-initramfs-kernel
.bin
*** Warning: no boot file name; using '0101A8C0.img'
Using eth0 device
TFTP from server 192.168.1.100; our IP address is 192.168.1.1
Filename '0101A8C0.img'.
Load address: 0x0
Loading: *
TFTP error: 'Operation not permitte' (1)
Starting again

Using 80060000 I have the same Not enough buffer for decompression error...

Hm,then I am out of ideas

Thank you, anyway! :slight_smile:

P.s. I bought this router to have another device to test the ath79 target! :smiley:

Awesome,thanks for joining ath79 porting efforts

It may also be that the LZMA compression parameters at image creation cause the expand job to fail. I stumbled upon that 5 years ago with WNDR3700.

Basically the ar71xx compression parameters at image creation needed to be changed for WNDR3700 to use a slightly smaller "dictionary" size. The default was 23bit, causing it be max. 8 MB size, which semi-regularly broke decompression in Nov 2012. Restricting dictionary to 20 bits helped, and that has been the default for WNDR3700/3800 since then.

Read from here: https://dev.archive.openwrt.org/ticket/12454.html#comment:12

It is quite possible that there is something similar with your device. That LZMA error 1 is typically just a generic error flag.

It didn't work! :frowning: Same error
Before:

binwalk -I openwrt-ar71xx-generic-archer-c7-v2-initramfs-kernel.bin --dumb | grep LZMA
512           0x200           LZMA compressed data, properties: 0x6D, dictionary size: 8388608 bytes, uncompressed size: 5669300 bytes

After (The size is different because I rebuilt it from scratch):

binwalk -I openwrt-ar71xx-generic-archer-c7-v2-initramfs-kernel.bin --dumb | grep LZMA
512           0x200           LZMA compressed data, properties: 0x6D, dictionary size: 1048576 bytes, uncompressed size: 7012972 bytes

If can help, I tried binwalk on the OEM dump firrmware without the uboot partition:

 binwalk -I archer_d7.bin --dumb | grep LZMA
131584        0x20200         LZMA compressed data, properties: 0x5D, dictionary size: 8388608 bytes, uncompressed size: 3078192 bytes
1441888       0x160060        LZMA compressed data, properties: 0x6D, dictionary size: 131072 bytes, uncompressed size: 131072 bytes
1488455       0x16B647        LZMA compressed data, properties: 0x6D, dictionary size: 131072 bytes, uncompressed size: 131072 bytes
etc....

The dictionary is above 8M. However I noticed that the property id is different (0x6D vs 0x5D)

Can you try using 0x81000000 as adress?
I got an AR7242 board using that

Sadly no luck.

AP135> tftpboot 0x81000000 openwrt-ar71xx-generic-archer-c7-v2-initramfs-kernel.
bin
dup 1 speed 1000
Using eth0 device
TFTP from server 192.168.1.100; our IP address is 192.168.1.1
Filename 'openwrt-ar71xx-generic-archer-c7-v2-initramfs-kernel.bin'.
Load address: 0x81000000
Loading: #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         ########################
done
Bytes transferred = 4115789 (3ecd4d hex)
AP135> bootm 0x81000000
## Booting image at 81000000 ...
        Uncompressing Kernel Image ... Not enough buffer for decompression
LZMA ERROR 1 - must RESET board to recover

However I think that the problem isn't related to the position in ram... in fact if I try to tftpboot the OEM image works in every position:

AP135> tftpboot 0x81000000 archer_d7_flash_after_uboot.bin
Using eth0 device
TFTP from server 192.168.1.100; our IP address is 192.168.1.1
Filename 'archer_d7_flash_after_uboot.bin'.
Load address: 0x81000000
Loading: #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         ##
done
Bytes transferred = 16646144 (fe0000 hex)
AP135> bootm 0x81000000
## Booting image at 81000000 ...
        Uncompressing Kernel Image ... OK

Starting kernel ...

Booting QCA955x
Linux version 2.6.31--LSDK-9.5.2.18 (root@localhost.localdomain) (gcc version 4.
3.3 (GCC) ) #2 Thu Jan 21 16:05:34 CST 2016
flash_size passed from bootloader = 16
arg 1: console=ttyS0,115200
arg 2: root=31:02
arg 3: rootfstype=squashfs
arg 4: init=/sbin/init
arg 5: mtdparts=ath-nor0:128k(u-boot),1280k(kernel),14656k(rootfs),64k(radioDECT
),64k(config),64k(romfs),64k(rom),64k(radio)
arg 6: mem=128M
CPU revision is: 00019750 (MIPS 74Kc)
cpu apb ddr apb ath_sys_frequency: cpu 720 ddr 600 ahb 200
Determined physical RAM map:
 memory: 02000000 @ 00000000 (usable)
User-defined physical RAM map:
 memory: 08000000 @ 00000000 (usable)
Zone PFN ranges:
  Normal   0x00000000 -> 0x00008000
Movable zone start PFN for each node
early_node_map[1] active PFN ranges
    0: 0x00000000 -> 0x00008000
etc..

Do you know if is possible to boot another u-boot from u-boot in ram? (u-boot-inception ahah :D) I could try to compile a custom uboot and then start my initarmfs.... :roll_eyes:

Hm,well it should be possible

what is the code for the image building ? 1043 v4 needed tplink-safeloader, the rest did not
or you could try gzip the initrd instead of lzma

If you have the "go" command in your main bl, it should be possible... But you need probably a build without low level initialization...

I think there is no jtag on board?
I would use pepe2k's u-boot_mod and modify this one for your board... There are other board with the same soc, so this shouldn be that hard...
If you backup your spi flash and have a programmer you could also try to replace the factory u-boot with that.

Edit: I have to correct me, he mentions that he supports qca955x soc, but there is no board with this soc mentioned in the readme.

What code should I check?
I think your are talking about this: (I commentend "lzma | tplink-v1-header" to try other compression methods)

define Device/tplink
  TPLINK_HWREV := 0x1
  TPLINK_HEADER_VERSION := 1
  LOADER_TYPE := gz
  KERNEL := kernel-bin | patch-cmdline | lzma
  KERNEL_INITRAMFS := kernel-bin | patch-cmdline #| lzma | tplink-v1-header
  IMAGES := sysupgrade.bin factory.bin
  IMAGE/sysupgrade.bin := append-rootfs | mktplinkfw sysupgrade
  IMAGE/factory.bin := append-rootfs | mktplinkfw factory
endef

However if I try to boot an image without compression it says:

Uncompressing Kernel Image ... OK

Starting kernel ...

but it stops here... so probably I should give some other instruction to u-boot to start the kernel correctly. Unfortunately I can't find anything online...