diff options
| -rw-r--r-- | arch/arm/include/asm/arch-bcm2835/mbox.h | 26 | ||||
| -rw-r--r-- | board/raspberrypi/rpi_b/rpi_b.c | 26 | ||||
| -rw-r--r-- | 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 4752091b9..b07c4a02b 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 3c654a1ac..6b3e095ba 100644 --- a/board/raspberrypi/rpi_b/rpi_b.c +++ b/board/raspberrypi/rpi_b/rpi_b.c @@ -16,6 +16,7 @@  #include <common.h>  #include <asm/arch/mbox.h> +#include <asm/arch/sdhci.h>  #include <asm/global_data.h>  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 e485a061a..3d55d36c6 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 <config_cmd_default.h>  #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 |