diff --git a/arch/arc/Kconfig b/arch/arc/Kconfig index aee15d5..6f139d5 100644 --- a/arch/arc/Kconfig +++ b/arch/arc/Kconfig @@ -150,6 +150,10 @@ config TARGET_AXS101 config TARGET_AXS103 bool "Support Synopsys Designware SDP board AXS103" +config TARGET_EMDK + bool "Synopsys EM Development kit" + select CPU_ARCEM6 + config TARGET_HSDK bool "Support Synpsys HS DevelopmentKit board" @@ -158,6 +162,7 @@ endchoice source "board/abilis/tb100/Kconfig" source "board/synopsys/Kconfig" source "board/synopsys/axs10x/Kconfig" +source "board/synopsys/emdk/Kconfig" source "board/synopsys/hsdk/Kconfig" endmenu diff --git a/arch/arc/dts/Makefile b/arch/arc/dts/Makefile index 6eccec9..491a4f4 100644 --- a/arch/arc/dts/Makefile +++ b/arch/arc/dts/Makefile @@ -4,6 +4,7 @@ dtb-$(CONFIG_TARGET_AXS101) += axs101.dtb dtb-$(CONFIG_TARGET_AXS103) += axs103.dtb dtb-$(CONFIG_TARGET_NSIM) += nsim.dtb dtb-$(CONFIG_TARGET_TB100) += abilis_tb100.dtb +dtb-$(CONFIG_TARGET_EMDK) += emdk.dtb dtb-$(CONFIG_TARGET_HSDK) += hsdk.dtb targets += $(dtb-y) diff --git a/arch/arc/dts/emdk.dts b/arch/arc/dts/emdk.dts new file mode 100644 index 0000000..5e853e3 --- /dev/null +++ b/arch/arc/dts/emdk.dts @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2018 Synopsys, Inc. All rights reserved. + */ +/dts-v1/; + +#include "skeleton.dtsi" + +/ { + #address-cells = <1>; + #size-cells = <1>; + + aliases { + console = &uart0; + }; + + cpu_card { + core_clk: core_clk { + #clock-cells = <0>; + compatible = "fixed-clock"; + clock-frequency = <40000000>; + u-boot,dm-pre-reloc; + }; + }; + + uart0: serial0@f0004000 { + compatible = "snps,dw-apb-uart"; + clock-frequency = <100000000>; + reg = <0xf0004000 0x1000>; + reg-shift = <2>; + reg-io-width = <4>; + }; +}; diff --git a/board/synopsys/emdk/Kconfig b/board/synopsys/emdk/Kconfig new file mode 100644 index 0000000..a9b834d --- /dev/null +++ b/board/synopsys/emdk/Kconfig @@ -0,0 +1,12 @@ +if TARGET_EMDK + +config SYS_BOARD + default "emdk" + +config SYS_VENDOR + default "synopsys" + +config SYS_CONFIG_NAME + default "emdk" + +endif diff --git a/board/synopsys/emdk/MAINTAINERS b/board/synopsys/emdk/MAINTAINERS new file mode 100644 index 0000000..605e338 --- /dev/null +++ b/board/synopsys/emdk/MAINTAINERS @@ -0,0 +1,5 @@ +EM DEVELOPMENT KIT BOARD +M: Alexey Brodkin +S: Maintained +F: board/synopsys/emdk/ +F: configs/emdk_defconfig diff --git a/board/synopsys/emdk/Makefile b/board/synopsys/emdk/Makefile new file mode 100644 index 0000000..4926c4e --- /dev/null +++ b/board/synopsys/emdk/Makefile @@ -0,0 +1,7 @@ +# +# Copyright (C) 2018 Synopsys, Inc. All rights reserved. +# +# SPDX-License-Identifier: GPL-2.0+ +# + +obj-y += emdk.o diff --git a/board/synopsys/emdk/emdk.c b/board/synopsys/emdk/emdk.c new file mode 100644 index 0000000..bbb946a --- /dev/null +++ b/board/synopsys/emdk/emdk.c @@ -0,0 +1,92 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2018 Synopsys, Inc. All rights reserved. + */ + +#include +#include +#include + +DECLARE_GLOBAL_DATA_PTR; + +#define ARC_PERIPHERAL_BASE 0xF0000000 +#define SDIO_BASE (ARC_PERIPHERAL_BASE + 0x10000) + +int board_mmc_init(bd_t *bis) +{ + struct dwmci_host *host = NULL; + + host = malloc(sizeof(struct dwmci_host)); + if (!host) { + printf("dwmci_host malloc fail!\n"); + return 1; + } + + memset(host, 0, sizeof(struct dwmci_host)); + host->name = "Synopsys Mobile storage"; + host->ioaddr = (void *)SDIO_BASE; + host->buswidth = 4; + host->dev_index = 0; + host->bus_hz = 50000000; + + add_dwmci(host, host->bus_hz / 2, 400000); + + return 0; +} + +#define CREG_BASE 0xF0001000 +#define CREG_BOOT_OFFSET 0 +#define CREG_BOOT_WP_OFFSET 8 + +#define CGU_BASE 0xF0000000 +#define CGU_IP_SW_RESET 0x0FF0 + +void reset_cpu(ulong addr) +{ + writel(1, (u32 *)(CGU_BASE + CGU_IP_SW_RESET)); + while (1) + ; /* loop forever till reset */ +} + +static int do_emdk_rom(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) +{ + u32 creg_boot = readl((u32 *)(CREG_BASE + CREG_BOOT_OFFSET)); + + if (!strcmp(argv[1], "unlock")) + creg_boot &= ~BIT(CREG_BOOT_WP_OFFSET); + else if (!strcmp(argv[1], "lock")) + creg_boot |= BIT(CREG_BOOT_WP_OFFSET); + else + return CMD_RET_USAGE; + + writel(creg_boot, (u32 *)(CREG_BASE + CREG_BOOT_OFFSET)); + + return CMD_RET_SUCCESS; +} + +cmd_tbl_t cmd_emdk[] = { + U_BOOT_CMD_MKENT(rom, 2, 0, do_emdk_rom, "", ""), +}; + +static int do_emdk(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) +{ + cmd_tbl_t *c; + + c = find_cmd_tbl(argv[1], cmd_emdk, ARRAY_SIZE(cmd_emdk)); + + /* Strip off leading 'emdk' command */ + argc--; + argv++; + + if (c == NULL || argc > c->maxargs) + return CMD_RET_USAGE; + + return c->cmd(cmdtp, flag, argc, argv); +} + +U_BOOT_CMD( + emdk, CONFIG_SYS_MAXARGS, 0, do_emdk, + "Synopsys EMDK specific commands", + "rom unlock - Unlock non-volatile memory for writing\n" + "emdk rom lock - Lock non-volatile memory to prevent writing\n" +); diff --git a/configs/emdk_defconfig b/configs/emdk_defconfig new file mode 100644 index 0000000..e3bccd2 --- /dev/null +++ b/configs/emdk_defconfig @@ -0,0 +1,31 @@ +CONFIG_ARC=y +CONFIG_ISA_ARCV2=y +CONFIG_CPU_ARCEM6=y +CONFIG_TARGET_EMDK=y +CONFIG_SYS_TEXT_BASE=0x00000000 +CONFIG_SYS_CLK_FREQ=40000000 +CONFIG_DEFAULT_DEVICE_TREE="emdk" +# CONFIG_ARCH_FIXUP_FDT_MEMORY is not set +CONFIG_VERSION_VARIABLE=y +CONFIG_HUSH_PARSER=y +CONFIG_SYS_PROMPT="emdk# " +# CONFIG_CMD_BOOTD is not set +# CONFIG_CMD_ELF is not set +# CONFIG_CMD_XIMG is not set +CONFIG_CMD_MMC=y +CONFIG_CMD_CACHE=y +CONFIG_CMD_FAT=y +CONFIG_OF_CONTROL=y +CONFIG_OF_EMBED=y +CONFIG_ENV_IS_IN_FAT=y +CONFIG_ENV_FAT_INTERFACE="mmc" +CONFIG_ENV_FAT_DEVICE_AND_PART="0:1" +# CONFIG_NET is not set +CONFIG_DM=y +CONFIG_MMC=y +CONFIG_MMC_DW=y +CONFIG_DM_SERIAL=y +CONFIG_SYS_NS16550=y +CONFIG_FS_FAT_MAX_CLUSTSIZE=4096 +CONFIG_USE_PRIVATE_LIBGCC=y +CONFIG_PANIC_HANG=y diff --git a/include/configs/emdk.h b/include/configs/emdk.h new file mode 100644 index 0000000..dca13e2 --- /dev/null +++ b/include/configs/emdk.h @@ -0,0 +1,40 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/* + * Copyright (C) 2018 Synopsys, Inc. All rights reserved. + */ + +#ifndef _CONFIG_EMDK_H_ +#define _CONFIG_EMDK_H_ + +#include + +#define CONFIG_SYS_MONITOR_BASE CONFIG_SYS_TEXT_BASE + +#define CONFIG_SYS_SDRAM_BASE 0x10000000 +#define CONFIG_SYS_SDRAM_SIZE SZ_8M + +#define CONFIG_SYS_INIT_SP_ADDR (CONFIG_SYS_SDRAM_BASE + SZ_1M) + +#define CONFIG_SYS_MALLOC_LEN SZ_64K +#define CONFIG_SYS_LOAD_ADDR CONFIG_SYS_SDRAM_BASE + +/* Required by DW MMC driver */ +#define CONFIG_BOUNCE_BUFFER + +/* + * Environment + */ +#define CONFIG_ENV_SIZE SZ_4K +#define CONFIG_BOOTFILE "app.bin" +#define CONFIG_LOADADDR CONFIG_SYS_LOAD_ADDR + +#define CONFIG_EXTRA_ENV_SETTINGS \ + "upgrade_image=u-boot.bin\0" \ + "upgrade=emdk rom unlock && " \ + "fatload mmc 0 ${loadaddr} ${upgrade_image} && " \ + "cp.b ${loadaddr} 0 ${filesize} && " \ + "dcache flush && " \ + "emdk rom lock\0" + +#endif /* _CONFIG_EMDK_H_ */ +