[patch 3/3] mmc, ARM: Add zboot from MMC support for SuperH Mobile ARM

Magnus Damm magnus.damm at gmail.com
Sun Dec 5 19:51:55 EST 2010


Hi Simon,

Thanks for your work on this!

On Mon, Dec 6, 2010 at 9:12 AM, Simon Horman <horms at verge.net.au> wrote:
> This allows a ROM-able zImage to be written to MMC and
> for SuperH Mobile ARM to boot directly from the MMCIF
> hardware block.
>
> This is achieved by the MaskROM loading the first portion
> of the image into MERAM and then jumping to it. This portion
> contains loader code which copies the entire image to SDRAM
> and jumps to it. From there the zImage boot code proceeds
> as normal, uncompressing the image into its final location
> and then jumping to it.
>
> Cc: Magnus Damm <magnus.damm at gmail.com>
> Signed-off-by: Simon Horman <horms at verge.net.au>
>
> ---
>
> This patch depends on "ARM: 6514/1: mach-shmobile: Add zboot support for
> SuperH Mobile ARM" which has been merged into the devel branch
> of Russell King's linux-2.6-arm tree.
>
> Index: linux-2.6-ap4/arch/arm/boot/compressed/mmcif-sh7372.c
> ===================================================================
> --- /dev/null   1970-01-01 00:00:00.000000000 +0000
> +++ linux-2.6-ap4/arch/arm/boot/compressed/mmcif-sh7372.c       2010-12-06 09:11:42.000000000 +0900
> @@ -0,0 +1,99 @@
> +/*
> + * sh7372 MMCIF loader
> + *
> + * Copyright (C) 2010 Magnus Damm
> + * Copyright (C) 2010 Simon Horman
> + *
> + * This file is subject to the terms and conditions of the GNU General Public
> + * License.  See the file "COPYING" in the main directory of this archive
> + * for more details.
> + */
> +
> +#include <linux/mmc/sh_mmcif.h>
> +#include <mach/mmcif.h>
> +
> +#define MMCIF_BASE      (void __iomem *)0xe6bd0000
> +
> +#define PORT84CR       0xe6050054
> +#define PORT85CR       0xe6050055
> +#define PORT86CR       0xe6050056
> +#define PORT87CR       0xe6050057
> +#define PORT88CR       0xe6050058
> +#define PORT89CR       0xe6050059
> +#define PORT90CR       0xe605005a
> +#define PORT91CR       0xe605005b
> +#define PORT92CR       0xe605005c
> +#define PORT99CR       0xe6050063
> +#define PORT185CR      0xe60520b9
> +#define PORT186CR      0xe60520ba
> +#define PORT187CR      0xe60520bb
> +#define PORT188CR      0xe60520bc
> +
> +#define SMSTPCR3       0xe615013c
> +
> +/* SH7372 specific MMCIF loader
> + *
> + * loads the zImage from an MMC card starting from block 1.
> + *
> + * The image must be start with a vrl4 header and
> + * the zImage must start at offset 512 of the image. That is,
> + * at block 2 (=byte 1024) on the media
> + *
> + * Use the following line to write the vrl4 formated zImage
> + * to an MMC card
> + * # dd if=vrl4.out of=/dev/sdx bs=512 seek=1
> + */
> +asmlinkage void mmcif_loader(unsigned char *buf, unsigned long len)
> +{
> +       /* Initialise LEDS1-4
> +        * registers: PORT185CR-PORT188CR (LED1-LED4 Control)
> +        * value:     0x10 - enable output
> +        */
> +       __raw_writeb(0x10, PORT185CR);
> +       __raw_writeb(0x10, PORT186CR);
> +       __raw_writeb(0x10, PORT187CR);
> +       __raw_writeb(0x10, PORT188CR);

Aren't these LEDs a board-specific property?

I believe the rest of the code is common across multiple boards, so
making it fully sharable would be nice.

Please break out the board-specific somehow, perhaps into
mmcif_update_progress().

> Index: linux-2.6-ap4/arch/arm/boot/compressed/head-shmobile.S
> ===================================================================
> --- linux-2.6-ap4.orig/arch/arm/boot/compressed/head-shmobile.S 2010-12-06 09:11:35.000000000 +0900
> +++ linux-2.6-ap4/arch/arm/boot/compressed/head-shmobile.S      2010-12-06 09:11:42.000000000 +0900
> @@ -40,14 +59,19 @@ __atags:@ tag #1
>        @ tag #3
>        .long   0                       @ tag->hdr.size = 0
>        .long   0                       @ tag->hdr.tag = ATAG_NONE;
> -1:
> +__mach_type:
> +       .long   MACH_TYPE
> +__image_start:
> +       .long   _start
> +__image_end:
> +       .long   _got_end
> +__load_base:
> +       .long   CONFIG_MEMORY_START + 0x02000000 @ Load at 32Mb into SDRAM

Just curious, where does these 32Mb come from?

Say that a board with be equipped with less than 32Mb, how is that handled?

> Index: linux-2.6-ap4/Documentation/arm/SH-Mobile/vrl4.c
> ===================================================================
> --- /dev/null   1970-01-01 00:00:00.000000000 +0000
> +++ linux-2.6-ap4/Documentation/arm/SH-Mobile/vrl4.c    2010-12-06 09:11:42.000000000 +0900
> @@ -0,0 +1,167 @@
> +/*
> + * vrl4 format generator
> + *
> + * Copyright (C) 2010 Magnus Damm
> + *
> + * This file is subject to the terms and conditions of the GNU General Public
> + * License.  See the file "COPYING" in the main directory of this archive
> + * for more details.
> + */

That's sweet, but I don't think I've got anything to do with this
portion of the code. =)

Apart from those minor points it all looks very good IMO!

/ magnus



More information about the linux-arm-kernel mailing list