Bug#596889: flash-kernel: please add ARM-Versatile Express CA9x4 support
Hi Martin (and Loïc),
I re-factored this patch to incorporate the suggested changes and
so it will apply cleanly to the latest svn repository.
See comments in-line:
On 09/19/2010 09:38 AM, Loïc Minier wrote:
> Hey
>
> Sorry for the delay
>
> On Tue, Sep 14, 2010, Matt Waddel wrote:
>> + check_size "kernel" $(($kfilesize + 8 + 64)) $kmtdsize
>
> The 8+64 seems to be copied from other platforms which prepend 8 bytes
> of ARM assembly to set the machine id (the "devio" calls in the
> script) and wrap the resulting prefixed kernel in an uImage which
> presunably adds 64 bytes of header -- I checked the latter with a
> simple mkimage call on a vmlinuz file, and it showed exactly 64 bytes
> of increment, but I have no idea whether any padding / rounding is
> going on, or whether your specific mkimage args might require more than
> 64 bytes.
>
> So I think this should be:
> check_size "kernel" $(($kfilesize + 64)) $kmtdsize
> but am not sure.
Yep - this was a copy paste error. The extra 8 bytes are not required.
>
>> + tmp=$(tempfile)
>> + cat $kfile >> $tmp
>> + mkimage -A arm -O linux -T kernel -C none -a 0x60008000 \
>> + -e 0x60008000 -n "Linaro Kernel" -d $tmp $tmp.uboot \
>> + >&2 1>/dev/null
>
> Don't think you actually need a tmp file since you don't prepend
> anything to the kernel; just mkimage $kfile directly.
Removed the $tmp file creation.
>
>> + printf "Erasing Kernel NOR space... " >&2
>> + dd if=/dev/zero of=$kmtd bs=$kmtdsize count=1 2>/dev/null
>
> Does one really need to erase the NOR space? Given that access are
> done with mtdblock devices, I expected the kenrel would just do it. In
> some cases, it's useful to zero-pad, but I'm not sure I see why here.
Good catch - removing this step makes the upgrade go a _lot_ faster.
>
>> + initrd_nor_size=25165824
>
> Hardcoding the value sucks; could you please read it from /proc/mtd?
> Apparently, there's information since you do:
>> + imtd=$(mtdblock "initrd")
>
> you can get the size of the mtd just like for the kernel with:
> imtdsize=$(mtdsize "initrd")
Done.
>
> On Tue, Sep 14, 2010, Martin Michlmayr wrote:
>> That's fine but you should also add support for the udeb, i.e.
>> debian/flash-kernel-installer.isinstallable,
>> debian/flash-kernel-installer.postinst
>
> Perhaps not unless we add d-i support?
>
> Right now, this board is only used in Linaro images and we don't use
> d-i or udebs at all, only flash-kernel for upgrades. This might change
> in the future though.
>
> I didn't think about this when I suggested to Matt he could send the
> Vexpress support to Debian. Would you rather have us add d-i support
> as well, or can you live with just the flash-kernel.deb changes for
> now?
Martin - I am sending this patch in 2 sections. One to fix the
problems found in the code review and one to add the d-i parts.
However, like Loïc pointed out the d-i sections are not tested.
I think those changes are pretty straight forward, but without
testing it is risky to add them. I'm ok if you decide not to.
>
>> Would it also make sense to add the device to
>> initramfs-tools/hooks/flash_kernel_set_root?
>
> Ah good catch; Matt, this allows either setting a default root= in the
> initrd for cases where the bootloader might not pass one, or to always
> override the root= passed by the bootloader. Depending on what the
> default bootloader config is, pick one! :-)
>
> If you allow to install to anywhere and the bootloader has a hardcoded
> root=, "override" is the best choice; if the bootloader does not pass
> any root= by default, "default" is the best choice. If you tell people
> to upgrade the bootloader config, it doesn't matter.
>
>
> I didn't know or I didn't remember about this set_root infrastructure,
> but I suppose another option is to arrange to update the bootloader
> config to set root=, in which case one doesn't need the initramfs bits.
>
>> Colin, Loïc: can you comment on the patch since I don't know anything
>> about Versatile Express?
>
> Eh, I don't know much either; good idea to have copied Colin as I
> understand he knows the hardware quite well.
>
>>> case "$machine" in
>>> + "ARM-Versatile Express CA9x4")
>>> + check_mtd
>>
>> Should there be a call to check_subarch? Or there an agreen subarch
>> name for this platform?
>
> I think the subarch is "vexpress",
The subarch is "vexpress"
> but I need to note that I find this
> test quite bad for the mid-term. It means we're stuck with one kernel
> per-subarch.
>
> Perhaps we should check whether the corresponding kernel's config has
> support for this subarch instead?
Isn't the subarch variable is just the last value of the kernel
name? So in this case "vmlinuz-2.6.35-1006-linaro-vexpress" =>
vexpress. If there are other "tiles" that can connect to the
Versatile Express motherboard won't they have similar kernel
naming constructs? Wouldn't this mean we could have multiple
kernels per subarch?
>
>> This shouldn't say "Linaro". I wonder if it would make sense to drop
>> "Debian" from all kernel/ramdisk references.
I made this change by just removing "Debian" from "Debian kernel" and
"Debian ramdisk". Is that what you were looking for? Or do you
want me to add my own $kernel and $intrd variables?
>
> +1 and +1
>
>>> + >&2 1>/dev/null
>>> + printf "Erasing Kernel NOR space... " >&2
>>> + dd if=/dev/zero of=$kmtd bs=$kmtdsize count=1 2>/dev/null
>>
>> How large is this partition? The reason I ask is because I wonder why
>> you don't pad the file on disk before writing it, but maybe that's a
>> bad idea when the mtd partition is very large. (Same goes for the
>> initrd partition)
Right - padding isn't necessary on NOR writes anyway. So this whole
problem is moot.
>
> I don't see why this would be needed for the kernel myself.
>
> It might make sense for the initrd though, unless u-boot parses the
> uInitrd headers to copy just the right size (preferred).
Even if it's not zero padded it doesn't hurt u-boot. U-boot reads
the size of the initrd from the header and only copies the correct
size. So no calculations are required. This is the output from
u-boot when the ramdisk is loaded:
...
## Loading init Ramdisk from Legacy Image at 61000000 ...
Image Name: Ramdisk 2.6.35-1006-linaro-vexpr
Image Type: ARM Linux RAMDisk Image (uncompressed)
Data Size: 3058308 Bytes = 2.9 MiB
Load Address: 81000000
Entry Point: 81000000
Verifying Checksum ... OK
Loading Kernel Image ... OK
Thanks for spending time on this.
--Matt
>
> Thanks for the review!
>
> Cheers,
Index: flash-kernel
===================================================================
--- flash-kernel (revision 64840)
+++ flash-kernel (working copy)
@@ -85,6 +85,7 @@
if [ "x$1" = "x--supported" ]; then
case "$machine" in
+ "ARM-Versatile Express CA9x4") exit 0 ;;
"Buffalo Linkstation Pro/Live") exit 0 ;;
"Buffalo/Revogear Kurobox Pro") exit 0 ;;
"D-Link DNS-323") exit 0 ;;
@@ -112,8 +113,8 @@
kvers="$1"
kfile="/boot/vmlinuz-$kvers"
ifile="/boot/initrd.img-$kvers"
- desc="Debian kernel $1"
- idesc="Debian ramdisk $1"
+ desc="Kernel $1"
+ idesc="Ramdisk $1"
else
if [ -e /vmlinuz ]; then
kfile=/vmlinuz
@@ -124,8 +125,8 @@
else
error "Cannot find a default kernel in /vmlinuz or /boot/vmlinuz"
fi
- desc="Debian kernel"
- idesc="Debian ramdisk"
+ desc="Kernel"
+ idesc="Ramdisk"
fi
if [ ! -e $kfile ] || [ ! -e $ifile ]; then
@@ -141,6 +142,42 @@
subarch=$(echo "$kfile" | sed -e 's/.*-//')
case "$machine" in
+ "ARM-Versatile Express CA9x4")
+ check_subarch "vexpress"
+ check_mtd
+
+ kmtd=$(mtdblock "kernel")
+ if [ -z "$kmtd" ]; then
+ error "Cannot find mtd partition 'kernel'"
+ fi
+ check_dev_mtdblock "$kmtd"
+ kmtdsize=$(mtdsize "kernel")
+ check_size "kernel" $(($kfilesize + 64)) $kmtdsize
+ printf "Generating a u-boot compatible kernel image... " >&2
+ mkimage -A arm -O linux -T kernel -C none -a 0x60008000 \
+ -e 0x60008000 -n "$desc" -d $kfile $kfile.uboot \
+ >&2 1>/dev/null
+ printf "Writing kernel to flash... " >&2
+ cat $kfile.uboot > $kmtd || error "failed."
+ echo "done." >&2
+ rm -f $kfile.uboot
+
+ imtd=$(mtdblock "initrd")
+ if [ -z "$imtd" ]; then
+ error "Cannot find mtd partition for initrd"
+ fi
+ check_dev_mtdblock "$imtd"
+ imtdsize=$(mtdsize "initrd")
+ check_size "initrd" $ifilesize $imtdsize
+ printf "Generating u-boot compatible initrd image... " >&2
+ mkimage -A arm -O linux -T ramdisk -C none -a 0x81000000 \
+ -e 0x81000000 -n "$idesc" -d $ifile $ifile.uboot \
+ >&2 1>/dev/null
+ printf "Writing initrd to flash... " >&2
+ cat $ifile.uboot > $imtd || error "failed."
+ echo "done." >&2
+ rm -f $ifile.uboot
+ ;;
"Buffalo Linkstation Pro/Live" | "Buffalo/Revogear Kurobox Pro")
check_subarch "orion5x"
tmp="$(tempfile)"
Index: README
===================================================================
--- README (revision 64840)
+++ README (working copy)
@@ -12,6 +12,7 @@
The following systems are supported:
+ - ARM-Versatile Express CA9x4
- Buffalo Linkstation Live
- Buffalo Linkstation Pro
- Buffalo/Revogear Kurobox Pro
Index: debian/flash-kernel-installer.postinst
===================================================================
--- debian/flash-kernel-installer.postinst (revision 64840)
+++ debian/flash-kernel-installer.postinst (working copy)
@@ -23,6 +23,9 @@
# Are we writing to flash or constructing an image on disk?
write_to_flash() {
case "$machine" in
+ "ARM-Versatile Express CA9x4")
+ return 1
+ ;;
"Buffalo Linkstation Pro/Live")
return 1
;;
@@ -91,6 +94,12 @@
db_progress STEP 1
case "$machine" in
+ "ARM-Versatile Express CA9x4")
+ in-target update-initramfs -u || true
+ if ! apt-install uboot-mkimage; then
+ error "apt-install uboot-mkimage failed"
+ fi
+ ;;
"Buffalo Linkstation Pro/Live" | "Buffalo/Revogear Kurobox Pro")
in-target update-initramfs -u || true
if ! apt-install uboot-mkimage; then
Index: debian/flash-kernel-installer.isinstallable
===================================================================
--- debian/flash-kernel-installer.isinstallable (revision 64840)
+++ debian/flash-kernel-installer.isinstallable (working copy)
@@ -14,6 +14,9 @@
arm*/orion5x)
exit 0
;;
+ arm*/vexpress)
+ exit 0
+ ;;
# Don't activate it by default
*)
exit 1
Index: initramfs-tools/hooks/flash_kernel_set_root
===================================================================
--- initramfs-tools/hooks/flash_kernel_set_root (revision 64840)
+++ initramfs-tools/hooks/flash_kernel_set_root (working copy)
@@ -23,6 +23,9 @@
# device?
root_type() {
case "$1" in
+ "ARM-Versatile Express CA9x4")
+ echo "override"
+ ;;
"Buffalo Linkstation Pro/Live")
echo "override"
;;
Reply to: