forked from DGNum/liminix
think think
This commit is contained in:
parent
5c1f5fabe2
commit
6bbff2f5b3
1 changed files with 239 additions and 0 deletions
239
THOUGHTS.txt
239
THOUGHTS.txt
|
@ -2691,3 +2691,242 @@ to provide a commandline in that case, but maybe also no need to.
|
||||||
|
|
||||||
For tftpboot, am undecided. We could use the dtb rewriting thing
|
For tftpboot, am undecided. We could use the dtb rewriting thing
|
||||||
everywhere, in the interest of consistency.
|
everywhere, in the interest of consistency.
|
||||||
|
|
||||||
|
Mon Oct 9 20:45:54 BST 2023
|
||||||
|
|
||||||
|
we bumped the kernel entry point to the 32MB mark, as
|
||||||
|
|
||||||
|
(1) when using jffs2 (big rootfs image) it was clobbering the dtb at
|
||||||
|
the end of the filesystem
|
||||||
|
|
||||||
|
(2) it should be 2MB aligned anyway and wasn't
|
||||||
|
|
||||||
|
However, this has given us the next problem:
|
||||||
|
|
||||||
|
OF: fdt: Reserved memory: failed to reserve memory for node 'secmon@43000000': base 0x00000000430B
|
||||||
|
OF: reserved mem: OVERLAP DETECTED!
|
||||||
|
phram-rootfs (0x0000000040400000--0x0000000053a31488) overlaps with ramoops@42ff0000 (0x000000004)
|
||||||
|
Zone ranges:
|
||||||
|
DMA [mem 0x0000000040000000-0x000000005fffffff]
|
||||||
|
DMA32 empty
|
||||||
|
Normal empty
|
||||||
|
Movable zone start for each node
|
||||||
|
|
||||||
|
the end of that phram-rootfs region looks well sus.
|
||||||
|
|
||||||
|
[ turns out that decimal is not hex ]
|
||||||
|
|
||||||
|
Tue Oct 10 21:37:31 BST 2023
|
||||||
|
|
||||||
|
UBI bleurgh ...
|
||||||
|
|
||||||
|
The DTB for this device, and/or the OpenWrt installer, seems to
|
||||||
|
expect already that mtd4 is a UBI thing
|
||||||
|
|
||||||
|
mtdinfo -a says:
|
||||||
|
mtd4
|
||||||
|
Name: ubi
|
||||||
|
Type: nand
|
||||||
|
Eraseblock size: 131072 bytes, 128.0 KiB
|
||||||
|
Amount of eraseblocks: 1000 (131072000 bytes, 125.0 MiB)
|
||||||
|
Minimum input/output unit size: 2048 bytes
|
||||||
|
Sub-page size: 2048 bytes
|
||||||
|
OOB size: 64 bytes
|
||||||
|
Character device major/minor: 90:8
|
||||||
|
Bad blocks are allowed: true
|
||||||
|
Device is writable: true
|
||||||
|
|
||||||
|
<5>UBI: auto-attach mtd4
|
||||||
|
<5>ubi0: attaching mtd4
|
||||||
|
<5>ubi0: scanning is finished
|
||||||
|
<5>ubi0: attached mtd4 (name "ubi", size 125 MiB)
|
||||||
|
<5>ubi0: PEB size: 131072 bytes (128 KiB), LEB size: 126976 bytes
|
||||||
|
<5>ubi0: min./max. I/O unit sizes: 2048/2048, sub-page size 2048
|
||||||
|
|
||||||
|
we made a volume using "ubimkvol /dev/ubi0 -N liminix -S 825"
|
||||||
|
|
||||||
|
and from ubinfo -a we can see
|
||||||
|
|
||||||
|
0 ubootenv
|
||||||
|
1 ubootenv2
|
||||||
|
2 recovery
|
||||||
|
3 boot_backup
|
||||||
|
4 liminix
|
||||||
|
|
||||||
|
Now we could use "ubiupdatevol /dev/ubi0_4 /path/to/ubifs.img"
|
||||||
|
to put a ubifs on that volume, but obviously we'd have to boot the
|
||||||
|
device into Liminix somehow first.
|
||||||
|
|
||||||
|
Alternatively in the build environment we could use ubinize to
|
||||||
|
create the entire image that can be flashed to MTD, but
|
||||||
|
|
||||||
|
- this will overwrite erase counters.
|
||||||
|
- we have to give it a config file that describes all the volumes,
|
||||||
|
and I'm guessing they need to match up with the existing ones
|
||||||
|
otherwise we trash the uboot env
|
||||||
|
|
||||||
|
|
||||||
|
Wed Oct 11 17:37:09 BST 2023
|
||||||
|
|
||||||
|
We can write ubi volumes from u-boot. Let's for the moment use
|
||||||
|
mkfs.ubifs and tftp those files to u-boot - we can figure out the
|
||||||
|
ubinize dance later
|
||||||
|
|
||||||
|
We need either
|
||||||
|
|
||||||
|
(a) to write an analogue of our jffs2 graft option for mkfs.ubifs, or
|
||||||
|
(b) to have a "cpio-like" mkfs.ubifs variant that reads filenames on stdin
|
||||||
|
and writes only those, or
|
||||||
|
(c) to create a "staging" directory during build with all the store folders that need to go into the filesystem
|
||||||
|
|
||||||
|
although the least elegant, option (c) is the simplest and probably
|
||||||
|
not even slow, at least by comparison with unpacking the kernel source
|
||||||
|
tarball
|
||||||
|
|
||||||
|
we used
|
||||||
|
uboot> tftpboot 0x40400000 result/rootfs
|
||||||
|
uboot> ubi write 40400000 liminix $filesize
|
||||||
|
|
||||||
|
then can use ubifsmount ubi0:liminix ; ubifsls / to check that it wrote
|
||||||
|
something valid. To boot this:
|
||||||
|
|
||||||
|
setenv serverip 10.0.0.1
|
||||||
|
setenv ipaddr 10.0.0.8
|
||||||
|
setenv bootargs 'liminix console=ttyS0,115200 panic=10 oops=panic init=/bin/init loglevel=8 root=ubi0:liminix rootfstype=ubifs fw_devlink=off'
|
||||||
|
tftpboot 0x4007ff28 result/uimage
|
||||||
|
bootm 0x4007ff28
|
||||||
|
|
||||||
|
The other thing we had to fix here is that activate wasn't being built
|
||||||
|
statically. Have to add -Xlinker -static to CFLAGS - I don't know if
|
||||||
|
this is a no-op on MIPS
|
||||||
|
|
||||||
|
Mon Oct 16 20:51:08 BST 2023
|
||||||
|
|
||||||
|
Here's a thing: the u-boot installed by openwrt on this device has a
|
||||||
|
ubifsload command, and it has a writable ubootenv. So instead of
|
||||||
|
having a separate partition for the kernel we could put the kernel in
|
||||||
|
the actual filesystem
|
||||||
|
|
||||||
|
I think we should do this by excluding flashimage and including some
|
||||||
|
other module (to be written) instead. ubimage or somesuch, perhaps.
|
||||||
|
|
||||||
|
So the image we wish to create is a ubifs with a kernel inside it in
|
||||||
|
/boot and we also need to change the u-boot env value of
|
||||||
|
|
||||||
|
boot_production=led $bootled_pwr on ; run ubi_read_production && bootm $loadaddr#$bootconf ; led $bootled_pwr off
|
||||||
|
|
||||||
|
so that it mounts the rootfs and finds /boot/uimage inside it
|
||||||
|
|
||||||
|
From uboot this is setenv and saveenv; from a running linux this is fw_setenv
|
||||||
|
|
||||||
|
Thu Oct 19 09:34:15 BST 2023
|
||||||
|
|
||||||
|
setenv bootargs 'liminix console=ttyS0,115200 panic=10 oops=panic init=/bin/init loglevel=8 root=ubi0:liminix rootfstype=ubifs fw_devlink=off'
|
||||||
|
|
||||||
|
|
||||||
|
ubifsmount ubi0:liminix
|
||||||
|
ubifsload 4007ff28 boot/uimage
|
||||||
|
bootm 0x4007ff28
|
||||||
|
|
||||||
|
|
||||||
|
Thu Oct 19 23:11:17 BST 2023
|
||||||
|
|
||||||
|
Assuming you've done the openwrt installer to repartion the device,
|
||||||
|
what are the steps to install Liminix?
|
||||||
|
|
||||||
|
1) build rootfs, which incorporates kernel
|
||||||
|
|
||||||
|
2) from u-boot:
|
||||||
|
|
||||||
|
uboot> ubimkvol /dev/ubi0 -N liminix -S 825
|
||||||
|
uboot> tftpboot 0x40400000 result/rootfs
|
||||||
|
uboot> ubi write 40400000 liminix $filesize
|
||||||
|
uboot> setenv boot_production 'led $bootled_pwr on ; ubifsmount ubi0:liminix; ubifsload 4007ff28 boot/uimage; bootm 4007ff28'
|
||||||
|
|
||||||
|
What if we don't have a serial console? can we do all this from openwrt?
|
||||||
|
|
||||||
|
Fri Oct 27 23:21:08 BST 2023
|
||||||
|
|
||||||
|
setenv serverip 10.0.0.1
|
||||||
|
setenv ipaddr 10.0.0.8
|
||||||
|
setenv bootargs 'liminix earlyprintk earlycon=uart8250,mmio32,0xf1012000 ramoops.mem_address=0x8000000 ramoops.mem_size=0x40000 ramoops=max_reason=2 mem=128M earlycon=ttyS0 console=ttyS0,115200 panic=10 oops=panic init=/bin/init loglevel=8 root=ubi0:liminix rootfstype=ubifs fw_devlink=off'
|
||||||
|
setenv bootargs 'liminix ramoops.mem_address=0x8000000 ramoops.mem_size=0x40000 ramoops=max_reason=2 mem=128M console=ttyS0,115200 panic=10 oops=panic init=/bin/init loglevel=8 root=ubi0:liminix rootfstype=ubifs fw_devlink=off'
|
||||||
|
tftpboot ${kernel_addr_r} result
|
||||||
|
bootm ${kernel_addr_r}
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
this is potentially worth checkng out because we do have very slow
|
||||||
|
decompress speed
|
||||||
|
|
||||||
|
https://scm.linefinity.com/common/u-boot/commit/5818198e6a184963c6afc82178b23a64435ace6a
|
||||||
|
|
||||||
|
Commit 5bb2c550b1 ("arm: mvebu: Move internal registers in
|
||||||
|
arch_very_early_init() function") implemented code movement according to
|
||||||
|
(now incomplete) comments which resulted in semi-broken code.
|
||||||
|
|
||||||
|
The result is that I-cache is currently disabled for all Armada 38x boards
|
||||||
|
and maybe there are some other (unreported / undetected) issues.
|
||||||
|
|
||||||
|
[...] After this change lzmadec command with lzma image of 0x7000000 bytes is
|
||||||
|
doing decompression just 5 seconds. Before this change it was 30 seconds.
|
||||||
|
|
||||||
|
|
||||||
|
Mon Oct 30 21:03:55 GMT 2023
|
||||||
|
|
||||||
|
We have a kernel that boots on the Omnia, now we need to build a
|
||||||
|
rootfs. Given this device uses mmc for its primary storage, we should
|
||||||
|
use a block filesystem not a flash filesystem.
|
||||||
|
|
||||||
|
|
||||||
|
setenv serverip 10.0.0.1
|
||||||
|
setenv ipaddr 10.0.0.8
|
||||||
|
setenv bootargs 'liminix console=ttyS0,115200 panic=10 oops=panic init=/bin/init loglevel=8 root=/dev/mtdblock0 rootfstype=ext4fs fw_devlink=off mtdparts=phram0:22M(rootfs) phram.phram=phram0,0x1300000,23068672,65536 root=/dev/mtdblock0'
|
||||||
|
tftpboot 0x1000000 tftpboot/uimage ; tftpboot 0x1300000 tftpboot/dtb ; tftpboot 0x29b0000 tftpboot/dtb; tftpboot 0x29c0000 initrd.img
|
||||||
|
|
||||||
|
|
||||||
|
Sat Nov 4 12:22:37 GMT 2023
|
||||||
|
|
||||||
|
setenv serverip 10.0.0.1
|
||||||
|
setenv ipaddr 10.0.0.8
|
||||||
|
setenv bootargs 'liminix console=ttyS0,115200 panic=10 oops=panic init=/bin/init loglevel=8 root=/dev/mtdblock0 rootfstype=ext4 fw_devlink=off mtdparts=phram0:22M(rootfs) phram.phram=phram0,0x40300000,23068672,65536 root=/dev/mtdblock0'
|
||||||
|
tftpboot 0x40000800 tftpboot/uimage ; tftpboot 0x419b0800 tftpboot/dtb ; tftpboot 0x41a00000 initrd.img ; tftpboot 0x40300000 tftpboot/rootfs
|
||||||
|
bootm 0x40000800 0x41a00000 0x419b0800
|
||||||
|
|
||||||
|
kernel 0x40000800 + 2af400 = "402afc00"
|
||||||
|
rootfs 0x40300000 + 15f9400 = "418f9400"
|
||||||
|
dtb 0x419b0800 + 4e00 = "419b5600"
|
||||||
|
|
||||||
|
Sun Nov 5 00:01:56 GMT 2023
|
||||||
|
|
||||||
|
Open questions
|
||||||
|
|
||||||
|
1) using -device loader for qemu phram, how do we choose appropriate
|
||||||
|
start address for all architectures? we could try to unify this
|
||||||
|
with the tftpboot approach, but that would mean providing the dtb
|
||||||
|
ourselves somehow which seems silly when qemu already does it
|
||||||
|
|
||||||
|
2) flash erase block size for tftpboot phram, it need to match the hardware
|
||||||
|
- we don't use it at all for squashfs
|
||||||
|
- for jffs2 it needs to match if tftpboot is to use same rootfs image
|
||||||
|
as flash
|
||||||
|
- we don't have any way to do a tftpboot ubifs
|
||||||
|
- ext4 doesn't care
|
||||||
|
|
||||||
|
|
||||||
|
3) the rootfstype needs thought.
|
||||||
|
|
||||||
|
- for all but squashfs it implies an initramfs
|
||||||
|
- jffs2 can be flashed naively
|
||||||
|
- ubifs needs an installer to not clobber erase counts
|
||||||
|
- ext4 (for omnia) needs a block device and can't be flashed along
|
||||||
|
with the kernel/initramfs because it's a separate disk. or maybe
|
||||||
|
the omnia can load kernel from mmc?
|
||||||
|
|
||||||
|
phram plus mtd_block is ok for ext4 for qemu, so that's one thing
|
||||||
|
fewer to deal with
|
||||||
|
|
||||||
|
4) for tftpboot with a separate initramfs, is there any way to
|
||||||
|
make address selection easier?
|
||||||
|
|
||||||
|
5) ubifs needs a different set of flash parameters (PEB, LEB etc)
|
||||||
|
|
Loading…
Reference in a new issue