[PATCH 07/11] ARM: Add Altera SoCFPGA support
Jean-Christophe PLAGNIOL-VILLARD
plagnioj at jcrosoft.com
Tue Sep 17 10:46:49 EDT 2013
> +static int socfpga_env_init(void)
> +{
> + struct stat s;
> + char *diskdev, *partname;
> + int ret;
> +
> + diskdev = "mmc0";
> +
> + device_detect_by_name(diskdev);
> +
> + partname = asprintf("/dev/%s.1", diskdev);
> +
> + ret = stat(partname, &s);
> +
> + if (ret) {
> + printf("no %s. using default env\n", diskdev);
> + goto out_free;
> + }
> +
> + mkdir("/boot", 0666);
> + ret = mount(partname, "fat", "/boot");
> + if (ret) {
> + printf("failed to mount %s\n", diskdev);
> + goto out_free;
> + }
> +
> + if (IS_ENABLED(CONFIG_OMAP_BUILD_IFT))
OMAP?
> + default_environment_path = "/dev/defaultenv";
> + else
> + default_environment_path = "/boot/barebox.env";
> +
> +out_free:
> + free(partname);
> + return 0;
> +}
> +late_initcall(socfpga_env_init);
> +#endif
> diff --git a/arch/arm/mach-socfpga/include/mach/clkdev.h b/arch/arm/mach-socfpga/include/mach/clkdev.h
> new file mode 100644
> index 0000000..04b37a8
> --- /dev/null
> +++ b/arch/arm/mach-socfpga/include/mach/clkdev.h
> @@ -0,0 +1,7 @@
> +#ifndef __ASM_MACH_CLKDEV_H
> +#define __ASM_MACH_CLKDEV_H
> +
> +#define __clk_get(clk) ({ 1; })
> +#define __clk_put(clk) do { } while (0)
> +
do we still need this?
> +#endif
> diff --git a/arch/arm/mach-socfpga/include/mach/clock-manager.h b/arch/arm/mach-socfpga/include/mach/clock-manager.h
> new file mode 100644
> index 0000000..a2b6975
> --- /dev/null
> +#if ARRIAV || CYCLONEV
> + /* av/cv don't have out2 */
> + scc_mgr_set_dqs_out1_delay(write_group, IO_DQS_OUT_RESERVE);
> +#else
> + scc_mgr_set_dqs_out1_delay(write_group, 0);
> + scc_mgr_set_dqs_out2_delay(write_group, IO_DQS_OUT_RESERVE);
> +#endif
really?
> +
> + /* multicast to all DQS IO enables (only 1) */
> + IOWR_32DIRECT(SCC_MGR_DQS_IO_ENA, 0, 0);
> +
> + /* hit update to zero everything */
> + IOWR_32DIRECT(SCC_MGR_UPD, 0, 0);
> + }
> +}
> +
> +/* load up dqs config settings */
> +
> +static void scc_mgr_load_dqs (uint32_t dqs)
> +{
> + IOWR_32DIRECT(SCC_MGR_DQS_ENA, 0, dqs);
> +}
> +
> diff --git a/arch/arm/mach-socfpga/xload.c b/arch/arm/mach-socfpga/xload.c
> new file mode 100644
> index 0000000..18ea927
> --- /dev/null
> +++ b/arch/arm/mach-socfpga/xload.c
> @@ -0,0 +1,125 @@
> +#include <platform_data/dw_mmc.h>
> +#include <bootsource.h>
> +#include <ns16550.h>
> +#include <common.h>
> +#include <malloc.h>
> +#include <init.h>
> +#include <envfs.h>
> +#include <sizes.h>
> +#include <fs.h>
> +#include <io.h>
> +
> +#include <linux/clkdev.h>
> +#include <linux/stat.h>
> +#include <linux/clk.h>
> +
> +#include <mach/system-manager.h>
> +#include <mach/socfpga-regs.h>
> +
> +enum socfpga_clks {
> + timer, mmc, uart, clk_max
> +};
> +
> +static struct clk *clks[clk_max];
> +
> +static struct dw_mmc_platform_data mmc_pdata = {
> + .ciu_div = 3,
> +};
> +
> +static void socfpga_mmc_init(void)
> +{
> + clks[mmc] = clk_fixed("mmc", 400000000);
> + clkdev_add_physbase(clks[mmc], CYCLONE5_SDMMC_ADDRESS, NULL);
> + add_generic_device("dw_mmc", 0, NULL, CYCLONE5_SDMMC_ADDRESS, SZ_4K,
> + IORESOURCE_MEM, &mmc_pdata);
> +}
> +
> +static struct NS16550_plat uart_pdata = {
> + .clock = 100000000,
> + .shift = 2,
> +};
> +
> +static void socfpga_uart_init(void)
> +{
> + clks[uart] = clk_fixed("uart", 100000000);
> + clkdev_add_physbase(clks[uart], CYCLONE5_UART0_ADDRESS, NULL);
> + clkdev_add_physbase(clks[uart], CYCLONE5_UART1_ADDRESS, NULL);
> + add_ns16550_device(0, 0xffc02000, 1024, IORESOURCE_MEM_8BIT,
> + &uart_pdata);
> +}
> +
> +static void socfpga_timer_init(void)
> +{
> + clks[timer] = clk_fixed("timer", 200000000);
> + clkdev_add_physbase(clks[timer], CYCLONE5_SMP_TWD_ADDRESS, NULL);
> + add_generic_device("smp_twd", 0, NULL, CYCLONE5_SMP_TWD_ADDRESS, 0x100,
> + IORESOURCE_MEM, NULL);
> +}
> +
> +static void *socfpga_xload_mmc(void)
> +{
> + int ret;
> + void *buf;
> + int len;
> + const char *diskdev = "disk0.1";
> +
> + pr_info("loading bootloader from SD/MMC\n");
> +
> + ret = mount(diskdev, "fat", "/");
> + if (ret) {
> + printf("Unable to mount %s (%d)\n", diskdev, ret);
> + return NULL;
> + }
> +
> + buf = read_file("/barebox.bin", &len);
> + if (!buf) {
> + printf("could not read barebox.bin from sd card\n");
> + return NULL;
> + }
> +
> + return buf;
> +}
please use the generic bootstrap code
> +
> +static __noreturn int socfpga_xload(void)
> +{
> + enum bootsource bootsource = bootsource_get();
> + void *buf;
> + int (*func)(void *);
> +
> + switch (bootsource) {
> + case BOOTSOURCE_MMC:
> + buf = socfpga_xload_mmc();
> + break;
> + default:
> + pr_err("unknown bootsource %d\n", bootsource);
> + hang();
> + }
> +
> + if (!buf) {
> + pr_err("failed to load barebox.bin\n");
> + hang();
> + }
> +
> + func = buf;
> +
> + pr_info("starting bootloader...\n");
> +
> + shutdown_barebox();
> +
> + func(NULL);
> +
> + hang();
> +}
> +
> +static int socfpga_devices_init(void)
> +{
> + barebox_set_model("SoCFPGA");
> + socfpga_timer_init();
> + socfpga_uart_init();
> + socfpga_mmc_init();
> +
> + barebox_main = socfpga_xload;
> +
> + return 0;
> +}
> +coredevice_initcall(socfpga_devices_init);
> diff --git a/images/.gitignore b/images/.gitignore
> index 9cc1728..1f601e7 100644
> --- a/images/.gitignore
> +++ b/images/.gitignore
> @@ -7,6 +7,7 @@
> *.src
> *.kwbimg
> *.kwbuartimg
> +*.socfpgaimg
> pbl.lds
> barebox.x
> barebox.z
More information about the barebox
mailing list