From mboxrd@z Thu Jan 1 00:00:00 1970 From: Albert ARIBAUD Date: Wed, 20 Mar 2013 16:31:57 +0100 Subject: [U-Boot] [PATCH V5 REPOST 7/7] ARM: rpi_b: enable SD controller, add related env/cmds In-Reply-To: <1358303219-17503-7-git-send-email-swarren@wwwdotorg.org> References: <1358303219-17503-1-git-send-email-swarren@wwwdotorg.org> <1358303219-17503-7-git-send-email-swarren@wwwdotorg.org> Message-ID: <20130320163157.6d522905@lilith> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Hi Stephen, On Tue, 15 Jan 2013 19:26:59 -0700, Stephen Warren wrote: > Enable the SD controller driver for the Raspberry Pi. Enable a number > of useful MMC, partition, and filesystem-related commands. Set up the > environment to provide standard locations for loading a kernel, DTB, > etc. Provide a boot command that loads and executes boot.scr.uimg from > the SD card; this is written considering future extensibilty to USB > storage. > > Signed-off-by: Stephen Warren > --- > v5: No change. > v4: > * Merged with video patch series due to dependencies in rpi_b.h. > * Rebased onto latest u-boot-arm/master; no real changes. > v3: No such version was posted. > v2: No change. > --- > arch/arm/include/asm/arch-bcm2835/mbox.h | 26 ++++++++++++ > board/raspberrypi/rpi_b/rpi_b.c | 26 ++++++++++++ > include/configs/rpi_b.h | 68 ++++++++++++++++++++++++++++-- > 3 files changed, 117 insertions(+), 3 deletions(-) > > diff --git a/arch/arm/include/asm/arch-bcm2835/mbox.h b/arch/arm/include/asm/arch-bcm2835/mbox.h > index 4752091..b07c4a0 100644 > --- a/arch/arm/include/asm/arch-bcm2835/mbox.h > +++ b/arch/arm/include/asm/arch-bcm2835/mbox.h > @@ -144,6 +144,32 @@ struct bcm2835_mbox_tag_get_arm_mem { > } body; > }; > > +#define BCM2835_MBOX_TAG_GET_CLOCK_RATE 0x00030002 > + > +#define BCM2835_MBOX_CLOCK_ID_EMMC 1 > +#define BCM2835_MBOX_CLOCK_ID_UART 2 > +#define BCM2835_MBOX_CLOCK_ID_ARM 3 > +#define BCM2835_MBOX_CLOCK_ID_CORE 4 > +#define BCM2835_MBOX_CLOCK_ID_V3D 5 > +#define BCM2835_MBOX_CLOCK_ID_H264 6 > +#define BCM2835_MBOX_CLOCK_ID_ISP 7 > +#define BCM2835_MBOX_CLOCK_ID_SDRAM 8 > +#define BCM2835_MBOX_CLOCK_ID_PIXEL 9 > +#define BCM2835_MBOX_CLOCK_ID_PWM 10 > + > +struct bcm2835_mbox_tag_get_clock_rate { > + struct bcm2835_mbox_tag_hdr tag_hdr; > + union { > + struct { > + u32 clock_id; > + } req; > + struct { > + u32 clock_id; > + u32 rate_hz; > + } resp; > + } body; > +}; > + > #define BCM2835_MBOX_TAG_ALLOCATE_BUFFER 0x00040001 > > struct bcm2835_mbox_tag_allocate_buffer { > diff --git a/board/raspberrypi/rpi_b/rpi_b.c b/board/raspberrypi/rpi_b/rpi_b.c > index 3c654a1..6b3e095 100644 > --- a/board/raspberrypi/rpi_b/rpi_b.c > +++ b/board/raspberrypi/rpi_b/rpi_b.c > @@ -16,6 +16,7 @@ > > #include > #include > +#include > #include > > DECLARE_GLOBAL_DATA_PTR; > @@ -26,6 +27,12 @@ struct msg_get_arm_mem { > u32 end_tag; > }; > > +struct msg_get_clock_rate { > + struct bcm2835_mbox_hdr hdr; > + struct bcm2835_mbox_tag_get_clock_rate get_clock_rate; > + u32 end_tag; > +}; > + > int dram_init(void) > { > ALLOC_ALIGN_BUFFER(struct msg_get_arm_mem, msg, 1, 16); > @@ -51,3 +58,22 @@ int board_init(void) > > return 0; > } > + > +int board_mmc_init(void) > +{ > + ALLOC_ALIGN_BUFFER(struct msg_get_clock_rate, msg_clk, 1, 16); > + int ret; > + > + BCM2835_MBOX_INIT_HDR(msg_clk); > + BCM2835_MBOX_INIT_TAG(&msg_clk->get_clock_rate, GET_CLOCK_RATE); > + msg_clk->get_clock_rate.body.req.clock_id = BCM2835_MBOX_CLOCK_ID_EMMC; > + > + ret = bcm2835_mbox_call_prop(BCM2835_MBOX_PROP_CHAN, &msg_clk->hdr); > + if (ret) { > + printf("bcm2835: Could not query eMMC clock rate\n"); > + return -1; > + } > + > + return bcm2835_sdhci_init(BCM2835_SDHCI_BASE, > + msg_clk->get_clock_rate.body.resp.rate_hz); > +} > diff --git a/include/configs/rpi_b.h b/include/configs/rpi_b.h > index e485a06..3d55d36 100644 > --- a/include/configs/rpi_b.h > +++ b/include/configs/rpi_b.h > @@ -51,6 +51,7 @@ > #define CONFIG_SYS_MALLOC_LEN SZ_4M > #define CONFIG_SYS_MEMTEST_START 0x00100000 > #define CONFIG_SYS_MEMTEST_END 0x00200000 > +#define CONFIG_LOADADDR 0x00200000 > > /* Flash */ > #define CONFIG_SYS_NO_FLASH > @@ -70,6 +71,13 @@ > #define CONFIG_VIDEO_BCM2835 > #define CONFIG_SYS_WHITE_ON_BLACK > > +/* SD/MMC configuration */ > +#define CONFIG_GENERIC_MMC > +#define CONFIG_MMC > +#define CONFIG_SDHCI > +#define CONFIG_MMC_SDHCI_IO_ACCESSORS > +#define CONFIG_BCM2835_SDHCI > + > /* Console UART */ > #define CONFIG_PL011_SERIAL > #define CONFIG_PL011_CLOCK 3000000 > @@ -85,12 +93,59 @@ > /* Environment */ > #define CONFIG_ENV_SIZE SZ_16K > #define CONFIG_ENV_IS_NOWHERE > +#define CONFIG_ENV_VARS_UBOOT_CONFIG > #define CONFIG_SYS_LOAD_ADDR 0x1000000 > #define CONFIG_CONSOLE_MUX > #define CONFIG_SYS_CONSOLE_IS_IN_ENV > -#define CONFIG_EXTRA_ENV_SETTINGS "stdin=serial\0" \ > - "stderr=serial,lcd\0" \ > - "stdout=serial,lcd\0" > +/* > + * Memory layout for where various images get loaded by boot scripts: > + * > + * scriptaddr can be pretty much anywhere that doesn't conflict with something > + * else. Put it low in memory to avoid conflicts. > + * > + * kernel_addr_r must be within the first 128M of RAM in order for the > + * kernel's CONFIG_AUTO_ZRELADDR option to work. Since the kernel will > + * decompress itself to 0x8000 after the start of RAM, kernel_addr_r > + * should not overlap that area, or the kernel will have to copy itself > + * somewhere else before decompression. Similarly, the address of any other > + * data passed to the kernel shouldn't overlap the start of RAM. Pushing > + * this up to 16M allows for a sizable kernel to be decompressed below the > + * compressed load address. > + * > + * fdt_addr_r simply shouldn't overlap anything else. Choosing 32M allows for > + * the compressed kernel to be up to 16M too. > + * > + * ramdisk_addr_r simply shouldn't overlap anything else. Choosing 33M allows > + * for the FDT/DTB to be up to 1M, which is hopefully plenty. > + */ > +#define CONFIG_EXTRA_ENV_SETTINGS \ > + "stdin=serial\0" \ > + "stderr=serial,lcd\0" \ > + "stdout=serial,lcd\0" \ > + "scriptaddr=0x00000000\0" \ > + "kernel_addr_r=0x01000000\0" \ > + "fdt_addr_r=0x02000000\0" \ > + "ramdisk_addr_r=0x02100000\0" \ > + "boot_targets=mmc0\0" \ > + \ > + "script_boot=" \ > + "if fatload ${devtype} ${devnum}:1 " \ > + "${scriptaddr} boot.scr.uimg; then " \ > + "source ${scriptaddr}; " \ > + "fi;\0" \ > + \ > + "mmc_boot=" \ > + "setenv devtype mmc; " \ > + "if mmc dev ${devnum}; then " \ > + "run script_boot; " \ > + "fi\0" \ > + \ > + "bootcmd_mmc0=setenv devnum 0; run mmc_boot\0" \ > + > +#define CONFIG_BOOTCOMMAND \ > + "for target in ${boot_targets}; do run bootcmd_${target}; done" > + > +#define CONFIG_BOOTDELAY 2 > > /* Shell */ > #define CONFIG_SYS_HUSH_PARSER > @@ -105,6 +160,13 @@ > #include > #define CONFIG_CMD_BOOTZ > #define CONFIG_CMD_GPIO > +#define CONFIG_CMD_MMC > +#define CONFIG_DOS_PARTITION > +#define CONFIG_PARTITION_UUIDS > +#define CONFIG_CMD_PART > +#define CONFIG_CMD_FS_GENERIC > +#define CONFIG_CMD_FAT > +#define CONFIG_CMD_EXT > /* Some things don't make sense on this HW or yet */ > #undef CONFIG_CMD_FPGA > #undef CONFIG_CMD_NET Applied to u-boot-arm/master, thanks! Amicalement, -- Albert.