* [U-Boot] [PATCH 1/5 v2] mips: Add basic MediaTek MT7620/88 support
@ 2018-08-10 7:48 Stefan Roese
2018-08-10 7:48 ` [U-Boot] [PATCH 2/5 v2] mips: Add arch/mips/include/asm/atomic.h Stefan Roese
` (4 more replies)
0 siblings, 5 replies; 11+ messages in thread
From: Stefan Roese @ 2018-08-10 7:48 UTC (permalink / raw)
To: u-boot
This patch adds basic support for the MediaTek MT7620/88 SoCs. Parts of
the code is copied from the MediaTek GitHub repository:
https://github.com/MediaTek-Labs/linkit-smart-uboot.git
Support for the LinkIt Smart 7688 module and the Gardena Smart Gateway
both based on the MT7688 will be added in further patches.
Signed-off-by: Stefan Roese <sr@denx.de>
Cc: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
---
v2:
- Sort Kconfig symbols alphabetically
- Use MIPS_TUNE_24KC
- Use imply for SPI support
- Dont' add LinkIt module support yet (is added with the board support)
- Move SKIP_LOWLEVEL_INIT from Kconfig to config header
- Use DT to get the base address of the system controller (for
display_cpuinfo)
- Remove _machine_restart - a separate driver is provided in a new patch
- Remove cachop_op() and cal_invalidate_dcache_range and use the
generic invalidate_dcache_range function instead
Daniel I tried to change to CPU_HAS PREFETCH, but this did not work
smoothly. It seems this option is very old and outdated. Perhaps I
can revisit this again, once this patchset has settled a bit.
arch/mips/Kconfig | 15 ++
arch/mips/Makefile | 1 +
arch/mips/mach-mt7620/Kconfig | 113 +++++++++
arch/mips/mach-mt7620/Makefile | 8 +
arch/mips/mach-mt7620/cpu.c | 72 ++++++
arch/mips/mach-mt7620/ddr_calibrate.c | 307 +++++++++++++++++++++++
arch/mips/mach-mt7620/lowlevel_init.S | 337 ++++++++++++++++++++++++++
arch/mips/mach-mt7620/mt76xx.h | 38 +++
8 files changed, 891 insertions(+)
create mode 100644 arch/mips/mach-mt7620/Kconfig
create mode 100644 arch/mips/mach-mt7620/Makefile
create mode 100644 arch/mips/mach-mt7620/cpu.c
create mode 100644 arch/mips/mach-mt7620/ddr_calibrate.c
create mode 100644 arch/mips/mach-mt7620/lowlevel_init.S
create mode 100644 arch/mips/mach-mt7620/mt76xx.h
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
index 31b622ff51..b7c5fa3114 100644
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -87,6 +87,20 @@ config ARCH_BMIPS
select SYSRESET
imply CMD_DM
+config ARCH_MT7620
+ bool "Support MT7620/7688 SoCs"
+ select DISPLAY_CPUINFO
+ select DM
+ select DM_SERIAL
+ imply DM_SPI
+ imply DM_SPI_FLASH
+ select MIPS_TUNE_24KC
+ select OF_CONTROL
+ select ROM_EXCEPTION_VECTORS
+ select SUPPORTS_CPU_MIPS32_R1
+ select SUPPORTS_CPU_MIPS32_R2
+ select SUPPORTS_LITTLE_ENDIAN
+
config MACH_PIC32
bool "Support Microchip PIC32"
select DM
@@ -141,6 +155,7 @@ source "board/qemu-mips/Kconfig"
source "arch/mips/mach-ath79/Kconfig"
source "arch/mips/mach-bmips/Kconfig"
source "arch/mips/mach-pic32/Kconfig"
+source "arch/mips/mach-mt7620/Kconfig"
if MIPS
diff --git a/arch/mips/Makefile b/arch/mips/Makefile
index 5deec9a202..cc8ea5d7d4 100644
--- a/arch/mips/Makefile
+++ b/arch/mips/Makefile
@@ -15,6 +15,7 @@ machine-$(CONFIG_SOC_AU1X00) += au1x00
machine-$(CONFIG_ARCH_ATH79) += ath79
machine-$(CONFIG_ARCH_BMIPS) += bmips
machine-$(CONFIG_MACH_PIC32) += pic32
+machine-$(CONFIG_ARCH_MT7620) += mt7620
machdirs := $(patsubst %,arch/mips/mach-%/,$(machine-y))
libs-y += $(machdirs)
diff --git a/arch/mips/mach-mt7620/Kconfig b/arch/mips/mach-mt7620/Kconfig
new file mode 100644
index 0000000000..396fbd0141
--- /dev/null
+++ b/arch/mips/mach-mt7620/Kconfig
@@ -0,0 +1,113 @@
+menu "MediaTek MIPS platforms"
+ depends on ARCH_MT7620
+
+config SYS_MALLOC_F_LEN
+ default 0x1000
+
+config SYS_SOC
+ default "mt7620" if SOC_MT7620
+
+choice
+ prompt "MediaTek MIPS SoC select"
+
+config SOC_MT7620
+ bool "MT7620/8"
+ select MIPS_L1_CACHE_SHIFT_5
+ help
+ This supports MediaTek MIPS MT7620 family.
+
+endchoice
+
+choice
+ prompt "Board select"
+
+endchoice
+
+choice
+ prompt "Boot mode"
+
+config BOOT_RAM
+ bool "RAM boot"
+ depends on SUPPORTS_BOOT_RAM
+ help
+ This builds an image that is linked to a RAM address. It can be used
+ for booting from CFE via TFTP using an ELF image, but it can also be
+ booted from RAM by other bootloaders using a BIN image.
+
+config BOOT_ROM
+ bool "ROM boot"
+ depends on SUPPORTS_BOOT_RAM
+ help
+ This builds an image that is linked to a ROM address. It can be
+ used as main bootloader image which is programmed onto the onboard
+ flash storage (SPI NOR).
+
+endchoice
+
+choice
+ prompt "DDR2 size"
+
+config ONBOARD_DDR2_SIZE_256MBIT
+ bool "256MBit (32MByte) total size"
+ depends on BOOT_ROM
+ help
+ Use 256MBit (32MByte) of DDR total size
+
+config ONBOARD_DDR2_SIZE_512MBIT
+ bool "512MBit (64MByte) total size"
+ depends on BOOT_ROM
+ help
+ Use 512MBit (64MByte) of DDR total size
+
+config ONBOARD_DDR2_SIZE_1024MBIT
+ bool "1024MBit (128MByte) total size"
+ depends on BOOT_ROM
+ help
+ Use 1024MBit (128MByte) of DDR total size
+
+config ONBOARD_DDR2_SIZE_2048MBIT
+ bool "2048MBit (256MByte) total size"
+ depends on BOOT_ROM
+ help
+ Use 2048MBit (256MByte) of DDR total size
+
+endchoice
+
+choice
+ prompt "DDR2 chip width"
+
+config ONBOARD_DDR2_CHIP_WIDTH_8BIT
+ bool "8bit DDR chip width"
+ depends on BOOT_ROM
+ help
+ Use DDR chips with 8bit width
+
+config ONBOARD_DDR2_CHIP_WIDTH_16BIT
+ bool "16bit DDR chip width"
+ depends on BOOT_ROM
+ help
+ Use DDR chips with 16bit width
+
+endchoice
+
+choice
+ prompt "DDR2 bus width"
+
+config ONBOARD_DDR2_BUS_WIDTH_16BIT
+ bool "16bit DDR bus width"
+ depends on BOOT_ROM
+ help
+ Use 16bit DDR bus width
+
+config ONBOARD_DDR2_BUS_WIDTH_32BIT
+ bool "32bit DDR bus width"
+ depends on BOOT_ROM
+ help
+ Use 32bit DDR bus width
+
+endchoice
+
+config SUPPORTS_BOOT_RAM
+ bool
+
+endmenu
diff --git a/arch/mips/mach-mt7620/Makefile b/arch/mips/mach-mt7620/Makefile
new file mode 100644
index 0000000000..1f3e65e8a5
--- /dev/null
+++ b/arch/mips/mach-mt7620/Makefile
@@ -0,0 +1,8 @@
+# SPDX-License-Identifier: GPL-2.0+
+
+obj-y += cpu.o
+
+ifndef CONFIG_SKIP_LOWLEVEL_INIT
+obj-y += ddr_calibrate.o
+obj-y += lowlevel_init.o
+endif
diff --git a/arch/mips/mach-mt7620/cpu.c b/arch/mips/mach-mt7620/cpu.c
new file mode 100644
index 0000000000..f21209522b
--- /dev/null
+++ b/arch/mips/mach-mt7620/cpu.c
@@ -0,0 +1,72 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2018 Stefan Roese <sr@denx.de>
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <ram.h>
+#include <asm/io.h>
+#include <linux/io.h>
+#include <linux/sizes.h>
+#include "mt76xx.h"
+
+#define STR_LEN 6
+
+#ifdef CONFIG_BOOT_ROM
+int mach_cpu_init(void)
+{
+ void (*ptr)(void);
+
+ /*
+ * DDR calibration routine needs to be called very early. This
+ * function also configures the clock to run at full speed.
+ */
+ ptr = (void *)CKSEG0ADDR(ddr_calibrate);
+ (*ptr)();
+
+ return 0;
+}
+#endif
+
+int dram_init(void)
+{
+ gd->ram_size = get_ram_size((void *)CONFIG_SYS_SDRAM_BASE, SZ_256M);
+
+ return 0;
+}
+
+int print_cpuinfo(void)
+{
+ static const char * const boot_str[] = { "PLL (3-Byte SPI Addr)",
+ "PLL (4-Byte SPI Addr)",
+ "XTAL (3-Byte SPI Addr)",
+ "XTAL (4-Byte SPI Addr)" };
+ const void *blob = gd->fdt_blob;
+ char buf[STR_LEN + 1];
+ fdt_addr_t base;
+ char *str;
+ int node;
+ u32 val;
+
+ /* Get system controller base address */
+ node = fdt_node_offset_by_compatible(blob, -1, "ralink,mt7620a-sysc");
+ if (node < 0)
+ return -FDT_ERR_NOTFOUND;
+
+ base = fdtdec_get_addr_size_auto_noparent(blob, node, "reg",
+ 0, NULL, true);
+ if (base == FDT_ADDR_T_NONE)
+ return -EINVAL;
+
+ str = (char *)base + MT76XX_CHIPID_OFFS;
+ snprintf(buf, STR_LEN + 1, "%s", str);
+ val = readl((void *)base + MT76XX_CHIP_REV_ID_OFFS);
+ printf("CPU: %-*s Rev %ld.%ld - ", STR_LEN, buf,
+ (val & GENMASK(11, 8)) >> 8, val & GENMASK(3, 0));
+
+ val = (readl((void *)base + MT76XX_SYSCFG0_OFFS) & GENMASK(3, 1)) >> 1;
+ printf("Boot from %s\n", boot_str[val]);
+
+ return 0;
+}
diff --git a/arch/mips/mach-mt7620/ddr_calibrate.c b/arch/mips/mach-mt7620/ddr_calibrate.c
new file mode 100644
index 0000000000..623816019b
--- /dev/null
+++ b/arch/mips/mach-mt7620/ddr_calibrate.c
@@ -0,0 +1,307 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2018 Stefan Roese <sr@denx.de>
+ *
+ * This code is mostly based on the code extracted from this MediaTek
+ * github repository:
+ *
+ * https://github.com/MediaTek-Labs/linkit-smart-uboot.git
+ *
+ * I was not able to find a specific license or other developers
+ * copyrights here, so I can't add them here.
+ *
+ * Most functions in this file are copied from the MediaTek U-Boot
+ * repository. Without any documentation, it was impossible to really
+ * implement this differently. So its mostly a cleaned-up version of
+ * the original code, with only support for the MT7628 / MT7688 SoC.
+ */
+
+#include <common.h>
+#include <linux/io.h>
+#include <asm/cacheops.h>
+#include <asm/io.h>
+#include "mt76xx.h"
+
+#define NUM_OF_CACHELINE 64
+#define MIN_START 6
+#define MIN_FINE_START 0xf
+#define MAX_START 7
+#define MAX_FINE_START 0x0
+
+#define CPU_FRAC_DIV 1
+
+#if defined(CONFIG_ONBOARD_DDR2_SIZE_256MBIT)
+#define DRAM_BUTTOM 0x02000000
+#endif
+#if defined(CONFIG_ONBOARD_DDR2_SIZE_512MBIT)
+#define DRAM_BUTTOM 0x04000000
+#endif
+#if defined(CONFIG_ONBOARD_DDR2_SIZE_1024MBIT)
+#define DRAM_BUTTOM 0x08000000
+#endif
+#if defined(CONFIG_ONBOARD_DDR2_SIZE_2048MBIT)
+#define DRAM_BUTTOM 0x10000000
+#endif
+
+static inline void cal_memcpy(void *src, void *dst, u32 size)
+{
+ u8 *psrc = (u8 *)src;
+ u8 *pdst = (u8 *)dst;
+ int i;
+
+ for (i = 0; i < size; i++, psrc++, pdst++)
+ *pdst = *psrc;
+}
+
+static inline void cal_memset(void *src, u8 pat, u32 size)
+{
+ u8 *psrc = (u8 *)src;
+ int i;
+
+ for (i = 0; i < size; i++, psrc++)
+ *psrc = pat;
+}
+
+#define pref_op(hint, addr) \
+ __asm__ __volatile__( \
+ ".set push\n" \
+ ".set noreorder\n" \
+ "pref %0, %1\n" \
+ ".set pop\n" \
+ : \
+ : "i" (hint), "R" (*(u8 *)(addr)))
+
+static inline void cal_patgen(u32 start_addr, u32 size, u32 bias)
+{
+ u32 *addr = (u32 *)start_addr;
+ int i;
+
+ for (i = 0; i < size; i++)
+ addr[i] = start_addr + i + bias;
+}
+
+static inline int test_loop(int k, int dqs, u32 test_dqs, u32 *coarse_dqs,
+ u32 offs, u32 pat, u32 val)
+{
+ u32 nc_addr;
+ u32 *c_addr;
+ int i;
+
+ for (nc_addr = 0xa0000000;
+ nc_addr < (0xa0000000 + DRAM_BUTTOM - NUM_OF_CACHELINE * 32);
+ nc_addr += (DRAM_BUTTOM >> 6) + offs) {
+ writel(0x00007474, MT76XX_MEMCTRL_BASE + 0x64);
+ wmb(); /* Make sure store if finished */
+
+ c_addr = (u32 *)(nc_addr & 0xdfffffff);
+ cal_memset(((u8 *)c_addr), 0x1F, NUM_OF_CACHELINE * 32);
+ cal_patgen(nc_addr, NUM_OF_CACHELINE * 8, pat);
+
+ if (dqs > 0)
+ writel(0x00000074 |
+ (((k == 1) ? coarse_dqs[dqs] : test_dqs) << 12) |
+ (((k == 0) ? val : test_dqs) << 8),
+ MT76XX_MEMCTRL_BASE + 0x64);
+ else
+ writel(0x00007400 |
+ (((k == 1) ? coarse_dqs[dqs] : test_dqs) << 4) |
+ (((k == 0) ? val : test_dqs) << 0),
+ MT76XX_MEMCTRL_BASE + 0x64);
+ wmb(); /* Make sure store if finished */
+
+ invalidate_dcache_range((u32)c_addr,
+ (u32)c_addr +
+ NUM_OF_CACHELINE * 32);
+ wmb(); /* Make sure store if finished */
+
+ for (i = 0; i < NUM_OF_CACHELINE * 8; i++) {
+ if (i % 8 == 0)
+ pref_op(0, &c_addr[i]);
+ }
+
+ for (i = 0; i < NUM_OF_CACHELINE * 8; i++) {
+ if (c_addr[i] != nc_addr + i + pat)
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+void ddr_calibrate(void)
+{
+ u32 min_coarse_dqs[2];
+ u32 max_coarse_dqs[2];
+ u32 min_fine_dqs[2];
+ u32 max_fine_dqs[2];
+ u32 coarse_dqs[2];
+ u32 fine_dqs[2];
+ int reg = 0, ddr_cfg2_reg;
+ int flag;
+ int i, k;
+ int dqs = 0;
+ u32 min_coarse_dqs_bnd, min_fine_dqs_bnd, coarse_dqs_dll, fine_dqs_dll;
+ u32 val;
+ u32 fdiv = 0, frac = 0;
+
+ /* Setup clock to run@full speed */
+ val = readl(MT76XX_DYN_CFG0_REG);
+ fdiv = (u32)((val >> 8) & 0x0F);
+ if (CPU_FRAC_DIV < 1 || CPU_FRAC_DIV > 10)
+ frac = val & 0x0f;
+ else
+ frac = CPU_FRAC_DIV;
+
+ while (frac < fdiv) {
+ val = readl(MT76XX_DYN_CFG0_REG);
+ fdiv = (val >> 8) & 0x0f;
+ fdiv--;
+ val &= ~(0x0f << 8);
+ val |= (fdiv << 8);
+ writel(val, MT76XX_DYN_CFG0_REG);
+ udelay(500);
+ val = readl(MT76XX_DYN_CFG0_REG);
+ fdiv = (val >> 8) & 0x0f;
+ }
+
+ clrbits_le32(MT76XX_MEMCTRL_BASE + 0x10, BIT(4));
+ ddr_cfg2_reg = readl(MT76XX_MEMCTRL_BASE + 0x48);
+ clrbits_le32(MT76XX_MEMCTRL_BASE + 0x48, (0x3 << 28) | (0x3 << 26));
+
+ min_coarse_dqs[0] = MIN_START;
+ min_coarse_dqs[1] = MIN_START;
+ min_fine_dqs[0] = MIN_FINE_START;
+ min_fine_dqs[1] = MIN_FINE_START;
+ max_coarse_dqs[0] = MAX_START;
+ max_coarse_dqs[1] = MAX_START;
+ max_fine_dqs[0] = MAX_FINE_START;
+ max_fine_dqs[1] = MAX_FINE_START;
+ dqs = 0;
+
+ /* Add by KP, DQS MIN boundary */
+ reg = readl(MT76XX_MEMCTRL_BASE + 0x20);
+ coarse_dqs_dll = (reg & 0xf00) >> 8;
+ fine_dqs_dll = (reg & 0xf0) >> 4;
+ if (coarse_dqs_dll <= 8)
+ min_coarse_dqs_bnd = 8 - coarse_dqs_dll;
+ else
+ min_coarse_dqs_bnd = 0;
+
+ if (fine_dqs_dll <= 8)
+ min_fine_dqs_bnd = 8 - fine_dqs_dll;
+ else
+ min_fine_dqs_bnd = 0;
+ /* DQS MIN boundary */
+
+DQS_CAL:
+
+ for (k = 0; k < 2; k++) {
+ u32 test_dqs;
+
+ if (k == 0)
+ test_dqs = MAX_START;
+ else
+ test_dqs = MAX_FINE_START;
+
+ do {
+ flag = test_loop(k, dqs, test_dqs, max_coarse_dqs,
+ 0x400, 0x3, 0xf);
+ if (flag == -1)
+ break;
+
+ test_dqs++;
+ } while (test_dqs <= 0xf);
+
+ if (k == 0) {
+ max_coarse_dqs[dqs] = test_dqs;
+ } else {
+ test_dqs--;
+
+ if (test_dqs == MAX_FINE_START - 1) {
+ max_coarse_dqs[dqs]--;
+ max_fine_dqs[dqs] = 0xf;
+ } else {
+ max_fine_dqs[dqs] = test_dqs;
+ }
+ }
+ }
+
+ for (k = 0; k < 2; k++) {
+ u32 test_dqs;
+
+ if (k == 0)
+ test_dqs = MIN_START;
+ else
+ test_dqs = MIN_FINE_START;
+
+ do {
+ flag = test_loop(k, dqs, test_dqs, min_coarse_dqs,
+ 0x480, 0x1, 0x0);
+ if (k == 0) {
+ if (flag == -1 ||
+ test_dqs == min_coarse_dqs_bnd)
+ break;
+
+ test_dqs--;
+
+ if (test_dqs < min_coarse_dqs_bnd)
+ break;
+ } else {
+ if (flag == -1) {
+ test_dqs++;
+ break;
+ } else if (test_dqs == min_fine_dqs_bnd) {
+ break;
+ }
+
+ test_dqs--;
+
+ if (test_dqs < min_fine_dqs_bnd)
+ break;
+ }
+ } while (test_dqs >= 0);
+
+ if (k == 0) {
+ min_coarse_dqs[dqs] = test_dqs;
+ } else {
+ if (test_dqs == MIN_FINE_START + 1) {
+ min_coarse_dqs[dqs]++;
+ min_fine_dqs[dqs] = 0x0;
+ } else {
+ min_fine_dqs[dqs] = test_dqs;
+ }
+ }
+ }
+
+ if (dqs == 0) {
+ dqs = 1;
+ goto DQS_CAL;
+ }
+
+ for (i = 0; i < 2; i++) {
+ u32 temp;
+
+ coarse_dqs[i] = (max_coarse_dqs[i] + min_coarse_dqs[i]) >> 1;
+ temp =
+ (((max_coarse_dqs[i] + min_coarse_dqs[i]) % 2) * 4) +
+ ((max_fine_dqs[i] + min_fine_dqs[i]) >> 1);
+ if (temp >= 0x10) {
+ coarse_dqs[i]++;
+ fine_dqs[i] = (temp - 0x10) + 0x8;
+ } else {
+ fine_dqs[i] = temp;
+ }
+ }
+ reg = (coarse_dqs[1] << 12) | (fine_dqs[1] << 8) |
+ (coarse_dqs[0] << 4) | fine_dqs[0];
+
+ clrbits_le32(MT76XX_MEMCTRL_BASE + 0x10, BIT(4));
+ writel(reg, MT76XX_MEMCTRL_BASE + 0x64);
+ writel(ddr_cfg2_reg, MT76XX_MEMCTRL_BASE + 0x48);
+ setbits_le32(MT76XX_MEMCTRL_BASE + 0x10, BIT(4));
+
+ for (i = 0; i < 2; i++)
+ debug("[%02X%02X%02X%02X]", min_coarse_dqs[i],
+ min_fine_dqs[i], max_coarse_dqs[i], max_fine_dqs[i]);
+ debug("\nDDR Calibration DQS reg = %08X\n", reg);
+}
diff --git a/arch/mips/mach-mt7620/lowlevel_init.S b/arch/mips/mach-mt7620/lowlevel_init.S
new file mode 100644
index 0000000000..92b2fcd2bb
--- /dev/null
+++ b/arch/mips/mach-mt7620/lowlevel_init.S
@@ -0,0 +1,337 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * (c) 2018 Stefan Roese <sr@denx.de>
+ *
+ * This code is mostly based on the code extracted from this MediaTek
+ * github repository:
+ *
+ * https://github.com/MediaTek-Labs/linkit-smart-uboot.git
+ *
+ * I was not able to find a specific license or other developers
+ * copyrights here, so I can't add them here.
+ */
+
+#include <config.h>
+#include <asm/regdef.h>
+#include <asm/mipsregs.h>
+#include <asm/asm.h>
+#include "mt76xx.h"
+
+#ifndef BIT
+#define BIT(nr) (1 << (nr))
+#endif
+
+#define DELAY_USEC(us) ((us) / 100)
+
+#define DDR_CFG1_CHIP_WIDTH_MASK (0x3 << 16)
+#define DDR_CFG1_BUS_WIDTH_MASK (0x3 << 12)
+
+#if defined(CONFIG_ONBOARD_DDR2_SIZE_256MBIT)
+#define DDR_CFG1_SIZE_VAL 0x222e2323
+#define DDR_CFG4_SIZE_VAL 7
+#endif
+#if defined(CONFIG_ONBOARD_DDR2_SIZE_512MBIT)
+#define DDR_CFG1_SIZE_VAL 0x22322323
+#define DDR_CFG4_SIZE_VAL 9
+#endif
+#if defined(CONFIG_ONBOARD_DDR2_SIZE_1024MBIT)
+#define DDR_CFG1_SIZE_VAL 0x22362323
+#define DDR_CFG4_SIZE_VAL 9
+#endif
+#if defined(CONFIG_ONBOARD_DDR2_SIZE_2048MBIT)
+#define DDR_CFG1_SIZE_VAL 0x223a2323
+#define DDR_CFG4_SIZE_VAL 9
+#endif
+
+#if defined(CONFIG_ONBOARD_DDR2_CHIP_WIDTH_8BIT)
+#define DDR_CFG1_CHIP_WIDTH_VAL (0x1 << 16)
+#endif
+#if defined(CONFIG_ONBOARD_DDR2_CHIP_WIDTH_16BIT)
+#define DDR_CFG1_CHIP_WIDTH_VAL (0x2 << 16)
+#endif
+
+#if defined(CONFIG_ONBOARD_DDR2_BUS_WIDTH_16BIT)
+#define DDR_CFG1_BUS_WIDTH_VAL (0x2 << 12)
+#endif
+#if defined(CONFIG_ONBOARD_DDR2_BUS_WIDTH_32BIT)
+#define DDR_CFG1_BUS_WIDTH_VAL (0x3 << 12)
+#endif
+
+LEAF(lowlevel_init)
+ /* polling CPLL is ready */
+ li t1, DELAY_USEC(1000000)
+ la t5, MT76XX_ROM_STATUS_REG
+1:
+ lw t2, 0(t5)
+ andi t2, t2, 0x1
+ bnez t2, CPLL_READY
+ subu t1, t1, 1
+ bgtz t1, 1b
+ nop
+ la t0, MT76XX_CLKCFG0_REG
+ lw t3, 0(t0)
+ ori t3, t3, 0x1
+ sw t3, 0(t0)
+ j CPLL_DONE
+ nop
+CPLL_READY:
+ la t0, MT76XX_CLKCFG0_REG
+ lw t1, 0(t0)
+ li t2, ~0x0c
+ and t1, t1, t2
+ ori t1, t1, 0xc
+ sw t1, 0(t0)
+ la t0, MT76XX_DYN_CFG0_REG
+ lw t3, 0(t0)
+ li t5, ~((0x0f << 8) | (0x0f << 0))
+ and t3, t3, t5
+ li t5, (10 << 8) | (1 << 0)
+ or t3, t3, t5
+ sw t3, 0(t0)
+ la t0, MT76XX_CLKCFG0_REG
+ lw t3, 0(t0)
+ li t4, ~0x0F
+ and t3, t3, t4
+ ori t3, t3, 0xc
+ sw t3, 0(t0)
+ lw t3, 0(t0)
+ ori t3, t3, 0x08
+ sw t3, 0(t0)
+
+CPLL_DONE:
+ /*
+ * SDR and DDR initialization: delay 200us
+ */
+ li t0, DELAY_USEC(200 + 40)
+ li t1, 0x1
+1:
+ sub t0, t0, t1
+ bnez t0, 1b
+ nop
+
+ /* set DRAM IO PAD for MT7628IC */
+ /* DDR LDO Enable */
+ li t1, MT76XX_RGCTRL_BASE+0x100
+ lw t4, 0(t1)
+ li t2, BIT(31)
+ or t4, t4, t2
+ sw t4, 0(t1)
+ li t1, MT76XX_RGCTRL_BASE+0x10c
+ lw t4, 0(t1)
+ j LDO_1P8V
+ nop
+LDO_1P8V:
+ li t2, ~BIT(6)
+ and t4, t4, t2
+ li t1, MT76XX_RGCTRL_BASE+0x10c
+ sw t4, 0(t1)
+ j DDRLDO_SOFT_START
+LDO_2P5V:
+ /* suppose external DDR1 LDO 2.5V */
+ li t2, BIT(6)
+ or t4, t4, t2
+ li t1, MT76XX_RGCTRL_BASE+0x10c
+ sw t4, 0(t1)
+
+DDRLDO_SOFT_START:
+ li t1, MT76XX_RGCTRL_BASE+0x10c
+ lw t2, 0(t1)
+ li t3, BIT(16)
+ or t2, t2, t3
+ sw t2, 0(t1)
+ li t3, DELAY_USEC(250*50)
+LDO_DELAY:
+ subu t3, t3, 1
+ bnez t3, LDO_DELAY
+ nop
+
+ li t1, MT76XX_RGCTRL_BASE+0x10c
+ lw t2, 0(t1)
+ li t3, BIT(18)
+ or t2, t2, t3
+ sw t2, 0(t1)
+
+SET_RG_BUCK_FPWM:
+ li t1, MT76XX_RGCTRL_BASE+0x104
+ lw t2, 0(t1)
+ ori t2, t2, BIT(10)
+ sw t2, 0(t1)
+
+DDR_PAD_CFG:
+ /* clean CLK PAD */
+ li t1, MT76XX_RGCTRL_BASE+0x704
+ lw t2, 0(t1)
+ li t8, 0xfffff0f0
+ and t2, t2, t8
+ /* clean CMD PAD */
+ li t1, MT76XX_RGCTRL_BASE+0x70c
+ lw t3, 0(t1)
+ li t8, 0xfffff0f0
+ and t3, t3, t8
+ /* clean DQ IPAD */
+ li t1, MT76XX_RGCTRL_BASE+0x710
+ lw t4, 0(t1)
+ li t8, 0xfffff8ff
+ and t4, t4, t8
+ /* clean DQ OPAD */
+ li t1, MT76XX_RGCTRL_BASE+0x714
+ lw t5, 0(t1)
+ li t8, 0xfffff0f0
+ and t5, t5, t8
+ /* clean DQS IPAD */
+ li t1, MT76XX_RGCTRL_BASE+0x718
+ lw t6, 0(t1)
+ li t8, 0xfffff8ff
+ and t6, t6, t8
+ /* clean DQS OPAD */
+ li t1, MT76XX_RGCTRL_BASE+0x71c
+ lw t7, 0(t1)
+ li t8, 0xfffff0f0
+ and t7, t7, t8
+
+ li t1, MT76XX_SYSCTL_BASE+0xC
+ lw t9, 0(t1)
+ srl t9, t9, 16
+ andi t9, t9, 0x1
+ bnez t9, MT7628_AN_DDR1_PAD
+MT7628_KN_PAD:
+ li t8, 0x00000303
+ or t2, t2, t8
+ or t3, t3, t8
+ or t5, t5, t8
+ or t7, t7, t8
+ li t8, 0x00000000
+ or t4, t4, t8
+ or t6, t6, t8
+ j SET_PAD_CFG
+MT7628_AN_DDR1_PAD:
+ li t1, MT76XX_SYSCTL_BASE+0x10
+ lw t1, 0(t1)
+ andi t1, t1, 0x1
+ beqz t1, MT7628_AN_DDR2_PAD
+ li t8, 0x00000c0c
+ or t2, t2, t8
+ li t8, 0x00000202
+ or t3, t3, t8
+ li t8, 0x00000707
+ or t5, t5, t8
+ li t8, 0x00000c0c
+ or t7, t7, t8
+ li t8, 0x00000000
+ or t4, t4, t8
+ or t6, t6, t8
+ j SET_PAD_CFG
+MT7628_AN_DDR2_PAD:
+ li t8, 0x00000c0c
+ or t2, t2, t8
+ li t8, 0x00000202
+ or t3, t3, t8
+ li t8, 0x00000404
+ or t5, t5, t8
+ li t8, 0x00000c0c
+ or t7, t7, t8
+ li t8, 0x00000000 /* ODT off */
+ or t4, t4, t8
+ or t6, t6, t8
+
+SET_PAD_CFG:
+ li t1, MT76XX_RGCTRL_BASE+0x704
+ sw t2, 0(t1)
+ li t1, MT76XX_RGCTRL_BASE+0x70c
+ sw t3, 0(t1)
+ li t1, MT76XX_RGCTRL_BASE+0x710
+ sw t4, 0(t1)
+ li t1, MT76XX_RGCTRL_BASE+0x714
+ sw t5, 0(t1)
+ li t1, MT76XX_RGCTRL_BASE+0x718
+ sw t6, 0(t1)
+ li t1, MT76XX_RGCTRL_BASE+0x71c
+ sw t7, 0(t1)
+
+ /*
+ * DDR initialization: reset pin to 0
+ */
+ li t1, MT76XX_SYSCTL_BASE + 0x34
+ lw t2, 0(t1)
+ and t2, ~BIT(10)
+ sw t2, 0(t1)
+ nop
+
+ /*
+ * DDR initialization: wait til reg DDR_CFG1 bit 21 equal to 1 (ready)
+ */
+DDR_READY:
+ li t1, DDR_CFG1_REG
+ lw t0, 0(t1)
+ nop
+ and t2, t0, BIT(21)
+ beqz t2, DDR_READY
+ nop
+
+ /*
+ * DDR initialization
+ *
+ * Only DDR2 supported right now. DDR2 support can be added, once
+ * boards using it will get added to mainline U-Boot.
+ */
+ li t1, DDR_CFG2_REG
+ lw t0, 0(t1)
+ nop
+ and t0, ~BIT(30)
+ and t0, ~(7 << 4)
+ or t0, (4 << 4)
+ or t0, BIT(30)
+ or t0, BIT(11)
+ sw t0, 0(t1)
+ nop
+
+ li t1, DDR_CFG3_REG
+ lw t2, 0(t1)
+ /* Disable ODT; reference board ok, ev board fail */
+ and t2, ~BIT(6)
+ or t2, BIT(2)
+ li t0, DDR_CFG4_REG
+ lw t1, 0(t0)
+ li t2, ~(0x01f | 0x0f0)
+ and t1, t1, t2
+ ori t1, t1, DDR_CFG4_SIZE_VAL
+ sw t1, 0(t0)
+ nop
+
+ /*
+ * DDR initialization: config size and width on reg DDR_CFG1
+ */
+ li t6, DDR_CFG1_SIZE_VAL
+
+ and t6, ~DDR_CFG1_CHIP_WIDTH_MASK
+ or t6, DDR_CFG1_CHIP_WIDTH_VAL
+
+ /* CONFIG DDR_CFG1[13:12] about TOTAL WIDTH */
+ and t6, ~DDR_CFG1_BUS_WIDTH_MASK
+ or t6, DDR_CFG1_BUS_WIDTH_VAL
+
+ li t5, DDR_CFG1_REG
+ sw t6, 0(t5)
+ nop
+
+ /*
+ * DDR: enable self auto refresh for power saving
+ * enable it by default for both RAM and ROM version (for CoC)
+ */
+ li t0, MT76XX_MEMCTRL_BASE + 0x14
+ lw t1, 0(t0)
+ nop
+ and t1, 0xff000000
+ or t1, 0x01
+ sw t1, 0(t0)
+ nop
+ li t0, MT76XX_MEMCTRL_BASE + 0x10
+ lw t1, 0(t0)
+ nop
+ or t1, 0x10
+ sw t1, 0(t0)
+ nop
+
+ jr ra
+ nop
+ END(lowlevel_init)
diff --git a/arch/mips/mach-mt7620/mt76xx.h b/arch/mips/mach-mt7620/mt76xx.h
new file mode 100644
index 0000000000..fb3d4582bf
--- /dev/null
+++ b/arch/mips/mach-mt7620/mt76xx.h
@@ -0,0 +1,38 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright (C) 2018 Stefan Roese <sr@denx.de>
+ */
+
+#ifndef __MT76XX_H
+#define __MT76XX_H
+
+#ifdef __ASSEMBLY__
+#define VOID_PTR
+#else
+#define VOID_PTR (void *)
+#endif
+
+#define MT76XX_SYSCTL_BASE 0xb0000000
+
+#define MT76XX_CHIPID_OFFS 0x00
+#define MT76XX_CHIP_REV_ID_OFFS 0x0c
+#define MT76XX_SYSCFG0_OFFS 0x10
+
+#define MT76XX_MEMCTRL_BASE (VOID_PTR(MT76XX_SYSCTL_BASE + 0x0300))
+#define MT76XX_RGCTRL_BASE (VOID_PTR(MT76XX_SYSCTL_BASE + 0x1000))
+
+#define MT76XX_ROM_STATUS_REG (VOID_PTR(MT76XX_SYSCTL_BASE + 0x0028))
+#define MT76XX_CLKCFG0_REG (VOID_PTR(MT76XX_SYSCTL_BASE + 0x002c))
+#define MT76XX_DYN_CFG0_REG (VOID_PTR(MT76XX_SYSCTL_BASE + 0x0440))
+
+#define DDR_CFG1_REG (MT76XX_MEMCTRL_BASE + 0x44)
+#define DDR_CFG2_REG (MT76XX_MEMCTRL_BASE + 0x48)
+#define DDR_CFG3_REG (MT76XX_MEMCTRL_BASE + 0x4c)
+#define DDR_CFG4_REG (MT76XX_MEMCTRL_BASE + 0x50)
+
+#ifndef __ASSEMBLY__
+/* Prototypes */
+void ddr_calibrate(void);
+#endif
+
+#endif
--
2.18.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [U-Boot] [PATCH 2/5 v2] mips: Add arch/mips/include/asm/atomic.h
2018-08-10 7:48 [U-Boot] [PATCH 1/5 v2] mips: Add basic MediaTek MT7620/88 support Stefan Roese
@ 2018-08-10 7:48 ` Stefan Roese
2018-08-10 7:48 ` [U-Boot] [PATCH 3/5 v2] mips: Add LinkIt Smart 7688 support Stefan Roese
` (3 subsequent siblings)
4 siblings, 0 replies; 11+ messages in thread
From: Stefan Roese @ 2018-08-10 7:48 UTC (permalink / raw)
To: u-boot
This is needed for the UBIFS support. The file is a copy of
arch/xtensa/include/asm/atomic.h
Signed-off-by: Stefan Roese <sr@denx.de>
Cc: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
---
v2:
- No change
arch/mips/include/asm/atomic.h | 54 ++++++++++++++++++++++++++++++++++
1 file changed, 54 insertions(+)
create mode 100644 arch/mips/include/asm/atomic.h
diff --git a/arch/mips/include/asm/atomic.h b/arch/mips/include/asm/atomic.h
new file mode 100644
index 0000000000..7551bf6e6c
--- /dev/null
+++ b/arch/mips/include/asm/atomic.h
@@ -0,0 +1,54 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright (C) 2016 Cadence Design Systems Inc.
+ */
+
+#ifndef _MIPS_ATOMIC_H
+#define _MIPS_ATOMIC_H
+
+#include <asm/system.h>
+
+typedef struct { volatile int counter; } atomic_t;
+
+#define ATOMIC_INIT(i) { (i) }
+
+#define atomic_read(v) ((v)->counter)
+#define atomic_set(v, i) ((v)->counter = (i))
+
+static inline void atomic_add(int i, atomic_t *v)
+{
+ unsigned long flags;
+
+ local_irq_save(flags);
+ v->counter += i;
+ local_irq_restore(flags);
+}
+
+static inline void atomic_sub(int i, atomic_t *v)
+{
+ unsigned long flags;
+
+ local_irq_save(flags);
+ v->counter -= i;
+ local_irq_restore(flags);
+}
+
+static inline void atomic_inc(atomic_t *v)
+{
+ unsigned long flags;
+
+ local_irq_save(flags);
+ ++v->counter;
+ local_irq_restore(flags);
+}
+
+static inline void atomic_dec(atomic_t *v)
+{
+ unsigned long flags;
+
+ local_irq_save(flags);
+ --v->counter;
+ local_irq_restore(flags);
+}
+
+#endif
--
2.18.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [U-Boot] [PATCH 3/5 v2] mips: Add LinkIt Smart 7688 support
2018-08-10 7:48 [U-Boot] [PATCH 1/5 v2] mips: Add basic MediaTek MT7620/88 support Stefan Roese
2018-08-10 7:48 ` [U-Boot] [PATCH 2/5 v2] mips: Add arch/mips/include/asm/atomic.h Stefan Roese
@ 2018-08-10 7:48 ` Stefan Roese
2018-08-15 14:30 ` Daniel Schwierzeck
2018-08-15 22:34 ` Daniel Schwierzeck
2018-08-10 7:48 ` [U-Boot] [PATCH 4/5 v2] mips: Add Gardena Smart-Gateway board support Stefan Roese
` (2 subsequent siblings)
4 siblings, 2 replies; 11+ messages in thread
From: Stefan Roese @ 2018-08-10 7:48 UTC (permalink / raw)
To: u-boot
The LinkIt Smart 7688 modules have a MT7688 SoC with 128 MiB of RAM
and 32 MiB of flash (SPI NOR).
The mt7628a.dtsi file is imported from Linux v4.17.
This patch also includes 2 targets. One is the target that can be
programmed into the SPI NOR flash and a 2nd target "xxx-ram" is
added to support loading and booting via an already running U-Boot
version. This allows easy development and testing without the
need to flash the image each time.
Signed-off-by: Stefan Roese <sr@denx.de>
Cc: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
---
v2:
- Kconfig entries added with this patch now
arch/mips/dts/linkit-smart-7688.dts | 46 ++++++++
arch/mips/dts/mt7628a.dtsi | 135 ++++++++++++++++++++++
arch/mips/mach-mt7620/Kconfig | 13 +++
board/seeed/linkit-smart-7688/Kconfig | 12 ++
board/seeed/linkit-smart-7688/MAINTAINERS | 8 ++
board/seeed/linkit-smart-7688/Makefile | 3 +
board/seeed/linkit-smart-7688/board.c | 22 ++++
configs/linkit-smart-7688-ram_defconfig | 58 ++++++++++
configs/linkit-smart-7688_defconfig | 62 ++++++++++
include/configs/linkit-smart-7688.h | 52 +++++++++
10 files changed, 411 insertions(+)
create mode 100644 arch/mips/dts/linkit-smart-7688.dts
create mode 100644 arch/mips/dts/mt7628a.dtsi
create mode 100644 board/seeed/linkit-smart-7688/Kconfig
create mode 100644 board/seeed/linkit-smart-7688/MAINTAINERS
create mode 100644 board/seeed/linkit-smart-7688/Makefile
create mode 100644 board/seeed/linkit-smart-7688/board.c
create mode 100644 configs/linkit-smart-7688-ram_defconfig
create mode 100644 configs/linkit-smart-7688_defconfig
create mode 100644 include/configs/linkit-smart-7688.h
diff --git a/arch/mips/dts/linkit-smart-7688.dts b/arch/mips/dts/linkit-smart-7688.dts
new file mode 100644
index 0000000000..df4bf907c6
--- /dev/null
+++ b/arch/mips/dts/linkit-smart-7688.dts
@@ -0,0 +1,46 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2018 Stefan Roese <sr@denx.de>
+ */
+
+/dts-v1/;
+
+#include "mt7628a.dtsi"
+
+/ {
+ compatible = "seeed,linkit-smart-7688", "ralink,mt7628a-soc";
+ model = "LinkIt-Smart-7688";
+
+ aliases {
+ serial0 = &uart2;
+ spi0 = &spi0;
+ };
+
+ memory at 0 {
+ device_type = "memory";
+ reg = <0x0 0x08000000>;
+ };
+
+ chosen {
+ bootargs = "console=ttyS0,57600";
+ stdout-path = &uart2;
+ };
+};
+
+&uart2 {
+ status = "okay";
+ clock-frequency = <40000000>;
+};
+
+&spi0 {
+ status = "okay";
+ num-cs = <2>;
+
+ spi-flash at 0 {
+ #address-cells = <1>;
+ #size-cells = <1>;
+ compatible = "spi-flash", "jedec,spi-nor";
+ spi-max-frequency = <25000000>;
+ reg = <0>;
+ };
+};
diff --git a/arch/mips/dts/mt7628a.dtsi b/arch/mips/dts/mt7628a.dtsi
new file mode 100644
index 0000000000..d00f528e1f
--- /dev/null
+++ b/arch/mips/dts/mt7628a.dtsi
@@ -0,0 +1,135 @@
+// SPDX-License-Identifier: GPL-2.0
+
+/ {
+ #address-cells = <1>;
+ #size-cells = <1>;
+ compatible = "ralink,mt7628a-soc";
+
+ cpus {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ cpu at 0 {
+ compatible = "mti,mips24KEc";
+ device_type = "cpu";
+ reg = <0>;
+ };
+ };
+
+ resetc: reset-controller {
+ compatible = "ralink,rt2880-reset";
+ #reset-cells = <1>;
+ };
+
+ cpuintc: interrupt-controller {
+ #address-cells = <0>;
+ #interrupt-cells = <1>;
+ interrupt-controller;
+ compatible = "mti,cpu-interrupt-controller";
+ };
+
+ palmbus at 10000000 {
+ compatible = "palmbus", "simple-bus";
+ reg = <0x10000000 0x200000>;
+ ranges = <0x0 0x10000000 0x1FFFFF>;
+
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ sysc: system-controller at 0 {
+ compatible = "ralink,mt7620a-sysc", "syscon";
+ reg = <0x0 0x100>;
+ };
+
+ intc: interrupt-controller at 200 {
+ compatible = "ralink,rt2880-intc";
+ reg = <0x200 0x100>;
+
+ interrupt-controller;
+ #interrupt-cells = <1>;
+
+ resets = <&resetc 9>;
+ reset-names = "intc";
+
+ interrupt-parent = <&cpuintc>;
+ interrupts = <2>;
+
+ ralink,intc-registers = <0x9c 0xa0
+ 0x6c 0xa4
+ 0x80 0x78>;
+ };
+
+ memory-controller at 300 {
+ compatible = "ralink,mt7620a-memc";
+ reg = <0x300 0x100>;
+ };
+
+ spi0: spi at b00 {
+ compatible = "ralink,mt7621-spi";
+ reg = <0xb00 0x40>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ };
+
+ uart0: uartlite at c00 {
+ compatible = "ns16550a";
+ reg = <0xc00 0x100>;
+
+ resets = <&resetc 12>;
+ reset-names = "uart0";
+
+ interrupt-parent = <&intc>;
+ interrupts = <20>;
+
+ reg-shift = <2>;
+ };
+
+ uart1: uart1 at d00 {
+ compatible = "ns16550a";
+ reg = <0xd00 0x100>;
+
+ resets = <&resetc 19>;
+ reset-names = "uart1";
+
+ interrupt-parent = <&intc>;
+ interrupts = <21>;
+
+ reg-shift = <2>;
+ };
+
+ uart2: uart2 at e00 {
+ compatible = "ns16550a";
+ reg = <0xe00 0x100>;
+
+ resets = <&resetc 20>;
+ reset-names = "uart2";
+
+ interrupt-parent = <&intc>;
+ interrupts = <22>;
+
+ reg-shift = <2>;
+ };
+ };
+
+ usb_phy: usb-phy at 10120000 {
+ compatible = "mediatek,mt7628-usbphy";
+ reg = <0x10120000 0x1000>;
+
+ #phy-cells = <0>;
+
+ ralink,sysctl = <&sysc>;
+ resets = <&resetc 22 &resetc 25>;
+ reset-names = "host", "device";
+ };
+
+ ehci at 101c0000 {
+ compatible = "generic-ehci";
+ reg = <0x101c0000 0x1000>;
+
+ phys = <&usb_phy>;
+ phy-names = "usb";
+
+ interrupt-parent = <&intc>;
+ interrupts = <18>;
+ };
+};
diff --git a/arch/mips/mach-mt7620/Kconfig b/arch/mips/mach-mt7620/Kconfig
index 396fbd0141..ef1211d172 100644
--- a/arch/mips/mach-mt7620/Kconfig
+++ b/arch/mips/mach-mt7620/Kconfig
@@ -21,6 +21,17 @@ endchoice
choice
prompt "Board select"
+config BOARD_LINKIT_SMART_7688
+ bool "LinkIt Smart 7688"
+ depends on SOC_MT7620
+ select SUPPORTS_BOOT_RAM
+ help
+ Seeed LinkIt Smart 7688 boards have a MT7688 SoC with 128 MiB of RAM
+ and 32 MiB of flash (SPI).
+ Between its different peripherals there's an integrated switch with 4
+ ethernet ports, 1 USB port, 1 UART, GPIO buttons and LEDs, and
+ a MT7688 (PCIe).
+
endchoice
choice
@@ -110,4 +121,6 @@ endchoice
config SUPPORTS_BOOT_RAM
bool
+source "board/seeed/linkit-smart-7688/Kconfig"
+
endmenu
diff --git a/board/seeed/linkit-smart-7688/Kconfig b/board/seeed/linkit-smart-7688/Kconfig
new file mode 100644
index 0000000000..a9d63285c3
--- /dev/null
+++ b/board/seeed/linkit-smart-7688/Kconfig
@@ -0,0 +1,12 @@
+if BOARD_LINKIT_SMART_7688
+
+config SYS_BOARD
+ default "linkit-smart-7688"
+
+config SYS_VENDOR
+ default "seeed"
+
+config SYS_CONFIG_NAME
+ default "linkit-smart-7688"
+
+endif
diff --git a/board/seeed/linkit-smart-7688/MAINTAINERS b/board/seeed/linkit-smart-7688/MAINTAINERS
new file mode 100644
index 0000000000..c3bbad4231
--- /dev/null
+++ b/board/seeed/linkit-smart-7688/MAINTAINERS
@@ -0,0 +1,8 @@
+LINKIT_SMART_7688 BOARD
+M: Stefan Roese <sr@denx.de>
+S: Maintained
+F: board/seeed/linkit-smart-7688
+F: include/configs/linkit-smart-7688.h
+F: configs/linkit-smart-7688_defconfig
+F: configs/linkit-smart-7688_ram_defconfig
+F: arch/mips/dts/linkit-smart-7688.dts
diff --git a/board/seeed/linkit-smart-7688/Makefile b/board/seeed/linkit-smart-7688/Makefile
new file mode 100644
index 0000000000..70cd7a8e56
--- /dev/null
+++ b/board/seeed/linkit-smart-7688/Makefile
@@ -0,0 +1,3 @@
+# SPDX-License-Identifier: GPL-2.0+
+
+obj-y += board.o
diff --git a/board/seeed/linkit-smart-7688/board.c b/board/seeed/linkit-smart-7688/board.c
new file mode 100644
index 0000000000..fbe94cc292
--- /dev/null
+++ b/board/seeed/linkit-smart-7688/board.c
@@ -0,0 +1,22 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2018 Stefan Roese <sr@denx.de>
+ */
+
+#include <common.h>
+#include <asm/io.h>
+
+#define MT76XX_GPIO1_MODE 0xb0000060
+
+void board_debug_uart_init(void)
+{
+ /* Select UART2 mode instead of GPIO mode (default) */
+ clrbits_le32((void __iomem *)MT76XX_GPIO1_MODE, GENMASK(27, 26));
+}
+
+int board_early_init_f(void)
+{
+ board_debug_uart_init();
+
+ return 0;
+}
diff --git a/configs/linkit-smart-7688-ram_defconfig b/configs/linkit-smart-7688-ram_defconfig
new file mode 100644
index 0000000000..4b269f459b
--- /dev/null
+++ b/configs/linkit-smart-7688-ram_defconfig
@@ -0,0 +1,58 @@
+CONFIG_MIPS=y
+CONFIG_SYS_TEXT_BASE=0x80010000
+CONFIG_DEBUG_UART_BOARD_INIT=y
+CONFIG_DEBUG_UART_BASE=0x10000e00
+CONFIG_DEBUG_UART_CLOCK=40000000
+CONFIG_ARCH_MT7620=y
+# CONFIG_MIPS_BOOT_CMDLINE_LEGACY is not set
+# CONFIG_MIPS_BOOT_ENV_LEGACY is not set
+CONFIG_MIPS_BOOT_FDT=y
+CONFIG_DEFAULT_DEVICE_TREE="linkit-smart-7688"
+CONFIG_DEBUG_UART=y
+# CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
+CONFIG_OF_STDOUT_VIA_ALIAS=y
+CONFIG_SYS_CONSOLE_INFO_QUIET=y
+CONFIG_BOARD_EARLY_INIT_F=y
+CONFIG_HUSH_PARSER=y
+CONFIG_CMD_CPU=y
+CONFIG_CMD_LICENSE=y
+# CONFIG_CMD_BOOTD is not set
+# CONFIG_CMD_ELF is not set
+# CONFIG_CMD_XIMG is not set
+CONFIG_CMD_MEMINFO=y
+# CONFIG_CMD_FLASH is not set
+# CONFIG_CMD_LOADS is not set
+CONFIG_CMD_SF=y
+CONFIG_CMD_SPI=y
+# CONFIG_CMD_NET is not set
+CONFIG_CMD_TIME=y
+CONFIG_OF_EMBED=y
+CONFIG_ENV_IS_IN_SPI_FLASH=y
+# CONFIG_DM_DEVICE_REMOVE is not set
+CONFIG_HAVE_BLOCK_DEVICE=y
+CONFIG_CLK=y
+CONFIG_CPU=y
+CONFIG_DM_GPIO=y
+CONFIG_LED=y
+CONFIG_LED_BLINK=y
+CONFIG_LED_GPIO=y
+CONFIG_SPI_FLASH=y
+CONFIG_SPI_FLASH_4BYTE_MODE_ONLY=y
+CONFIG_SPI_FLASH_GIGADEVICE=y
+CONFIG_SPI_FLASH_MACRONIX=y
+CONFIG_SPI_FLASH_SPANSION=y
+CONFIG_SPI_FLASH_STMICRO=y
+CONFIG_SPI_FLASH_WINBOND=y
+CONFIG_SPI_FLASH_MTD=y
+CONFIG_PHY=y
+CONFIG_POWER_DOMAIN=y
+CONFIG_RAM=y
+CONFIG_DM_RESET=y
+CONFIG_BAUDRATE=57600
+# CONFIG_SPL_SERIAL_PRESENT is not set
+CONFIG_DEBUG_UART_SHIFT=2
+CONFIG_DEBUG_UART_ANNOUNCE=y
+CONFIG_SYS_NS16550=y
+CONFIG_SPI=y
+CONFIG_MT76XX_SPI=y
+CONFIG_SYSRESET_SYSCON=y
diff --git a/configs/linkit-smart-7688_defconfig b/configs/linkit-smart-7688_defconfig
new file mode 100644
index 0000000000..cdb8c06517
--- /dev/null
+++ b/configs/linkit-smart-7688_defconfig
@@ -0,0 +1,62 @@
+CONFIG_MIPS=y
+CONFIG_SYS_TEXT_BASE=0xbc000000
+CONFIG_DEBUG_UART_BOARD_INIT=y
+CONFIG_DEBUG_UART_BASE=0x10000e00
+CONFIG_DEBUG_UART_CLOCK=40000000
+CONFIG_ARCH_MT7620=y
+CONFIG_BOOT_ROM=y
+CONFIG_ONBOARD_DDR2_SIZE_1024MBIT=y
+CONFIG_ONBOARD_DDR2_CHIP_WIDTH_16BIT=y
+# CONFIG_MIPS_BOOT_CMDLINE_LEGACY is not set
+# CONFIG_MIPS_BOOT_ENV_LEGACY is not set
+CONFIG_MIPS_BOOT_FDT=y
+CONFIG_DEFAULT_DEVICE_TREE="linkit-smart-7688"
+CONFIG_DEBUG_UART=y
+# CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
+CONFIG_OF_STDOUT_VIA_ALIAS=y
+CONFIG_SYS_CONSOLE_INFO_QUIET=y
+CONFIG_BOARD_EARLY_INIT_F=y
+CONFIG_HUSH_PARSER=y
+CONFIG_CMD_CPU=y
+CONFIG_CMD_LICENSE=y
+# CONFIG_CMD_BOOTD is not set
+# CONFIG_CMD_ELF is not set
+# CONFIG_CMD_XIMG is not set
+# CONFIG_CMD_CRC32 is not set
+CONFIG_CMD_MEMINFO=y
+# CONFIG_CMD_FLASH is not set
+# CONFIG_CMD_LOADS is not set
+CONFIG_CMD_SF=y
+CONFIG_CMD_SPI=y
+# CONFIG_CMD_NET is not set
+CONFIG_CMD_TIME=y
+CONFIG_OF_EMBED=y
+CONFIG_ENV_IS_IN_SPI_FLASH=y
+# CONFIG_DM_DEVICE_REMOVE is not set
+CONFIG_HAVE_BLOCK_DEVICE=y
+CONFIG_CLK=y
+CONFIG_CPU=y
+CONFIG_DM_GPIO=y
+CONFIG_LED=y
+CONFIG_LED_BLINK=y
+CONFIG_LED_GPIO=y
+CONFIG_SPI_FLASH=y
+CONFIG_SPI_FLASH_4BYTE_MODE_ONLY=y
+CONFIG_SPI_FLASH_GIGADEVICE=y
+CONFIG_SPI_FLASH_MACRONIX=y
+CONFIG_SPI_FLASH_SPANSION=y
+CONFIG_SPI_FLASH_STMICRO=y
+CONFIG_SPI_FLASH_WINBOND=y
+CONFIG_SPI_FLASH_MTD=y
+CONFIG_PHY=y
+CONFIG_POWER_DOMAIN=y
+CONFIG_RAM=y
+CONFIG_DM_RESET=y
+CONFIG_BAUDRATE=57600
+# CONFIG_SPL_SERIAL_PRESENT is not set
+CONFIG_DEBUG_UART_SHIFT=2
+CONFIG_DEBUG_UART_ANNOUNCE=y
+CONFIG_SYS_NS16550=y
+CONFIG_SPI=y
+CONFIG_MT76XX_SPI=y
+CONFIG_SYSRESET_SYSCON=y
diff --git a/include/configs/linkit-smart-7688.h b/include/configs/linkit-smart-7688.h
new file mode 100644
index 0000000000..be6cffee35
--- /dev/null
+++ b/include/configs/linkit-smart-7688.h
@@ -0,0 +1,52 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright (C) 2018 Stefan Roese <sr@denx.de>
+ */
+
+#ifndef __CONFIG_LINKIT_SMART_7688_H
+#define __CONFIG_LINKIT_SMART_7688_H
+
+/* CPU */
+#define CONFIG_SYS_MIPS_TIMER_FREQ 200000000
+
+/* RAM */
+#define CONFIG_NR_DRAM_BANKS 1
+#define CONFIG_SYS_SDRAM_BASE 0x80000000
+
+#define CONFIG_SYS_LOAD_ADDR CONFIG_SYS_SDRAM_BASE + 0x100000
+
+#define CONFIG_SYS_INIT_SP_OFFSET 0x400000
+
+#ifdef CONFIG_BOOT_RAM
+#define CONFIG_SKIP_LOWLEVEL_INIT
+#endif
+
+/* UART */
+#define CONFIG_SYS_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200, \
+ 230400, 500000, 1500000 }
+
+/* RAM */
+#define CONFIG_SYS_MEMTEST_START 0x80100000
+#define CONFIG_SYS_MEMTEST_END 0x80400000
+
+/* Memory usage */
+#define CONFIG_SYS_MAXARGS 64
+#define CONFIG_SYS_MALLOC_LEN (1024 * 1024)
+#define CONFIG_SYS_BOOTPARAMS_LEN (128 * 1024)
+#define CONFIG_SYS_CBSIZE 512
+
+/* U-Boot */
+#define CONFIG_SYS_MONITOR_BASE CONFIG_SYS_TEXT_BASE
+
+/* Environment settings */
+#define CONFIG_ENV_OFFSET 0x40000
+#define CONFIG_ENV_SIZE (16 << 10)
+#define CONFIG_ENV_SECT_SIZE (64 << 10)
+
+/*
+ * Environment is right behind U-Boot in flash. Make sure U-Boot
+ * doesn't grow into the environment area.
+ */
+#define CONFIG_BOARD_SIZE_LIMIT CONFIG_ENV_OFFSET
+
+#endif /* __CONFIG_LINKIT_SMART_7688_H */
--
2.18.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [U-Boot] [PATCH 4/5 v2] mips: Add Gardena Smart-Gateway board support
2018-08-10 7:48 [U-Boot] [PATCH 1/5 v2] mips: Add basic MediaTek MT7620/88 support Stefan Roese
2018-08-10 7:48 ` [U-Boot] [PATCH 2/5 v2] mips: Add arch/mips/include/asm/atomic.h Stefan Roese
2018-08-10 7:48 ` [U-Boot] [PATCH 3/5 v2] mips: Add LinkIt Smart 7688 support Stefan Roese
@ 2018-08-10 7:48 ` Stefan Roese
2018-08-15 14:36 ` Daniel Schwierzeck
2018-08-10 7:48 ` [U-Boot] [PATCH 5/5 v2] mips: mt76xx: Add sysreset support Stefan Roese
2018-08-15 23:09 ` [U-Boot] [PATCH 1/5 v2] mips: Add basic MediaTek MT7620/88 support Daniel Schwierzeck
4 siblings, 1 reply; 11+ messages in thread
From: Stefan Roese @ 2018-08-10 7:48 UTC (permalink / raw)
To: u-boot
The Gardena Smart-Gateway boards have a MT7688 SoC with 128 MiB of RAM
and 8 MiB of flash (SPI NOR) and additional 128MiB SPI NAND storage.
This patch also includes 2 targets. One is the target that can be
programmed into the SPI NOR flash and a 2nd target "xxx-ram" is
added to support loading and booting via an already running U-Boot
version. This allows easy development and testing without the
need to flash the image each time.
Signed-off-by: Stefan Roese <sr@denx.de>
Cc: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
---
v2:
- No change
.../mips/dts/gardena-smart-gateway-mt7688.dts | 54 +++++++++++++++
arch/mips/mach-mt7620/Kconfig | 9 +++
board/gardena/smart-gateway-mt7688/Kconfig | 12 ++++
.../gardena/smart-gateway-mt7688/MAINTAINERS | 8 +++
board/gardena/smart-gateway-mt7688/Makefile | 3 +
board/gardena/smart-gateway-mt7688/board.c | 18 +++++
...gardena-smart-gateway-mt7688-ram_defconfig | 68 +++++++++++++++++++
.../gardena-smart-gateway-mt7688_defconfig | 67 ++++++++++++++++++
.../configs/gardena-smart-gateway-mt7688.h | 56 +++++++++++++++
9 files changed, 295 insertions(+)
create mode 100644 arch/mips/dts/gardena-smart-gateway-mt7688.dts
create mode 100644 board/gardena/smart-gateway-mt7688/Kconfig
create mode 100644 board/gardena/smart-gateway-mt7688/MAINTAINERS
create mode 100644 board/gardena/smart-gateway-mt7688/Makefile
create mode 100644 board/gardena/smart-gateway-mt7688/board.c
create mode 100644 configs/gardena-smart-gateway-mt7688-ram_defconfig
create mode 100644 configs/gardena-smart-gateway-mt7688_defconfig
create mode 100644 include/configs/gardena-smart-gateway-mt7688.h
diff --git a/arch/mips/dts/gardena-smart-gateway-mt7688.dts b/arch/mips/dts/gardena-smart-gateway-mt7688.dts
new file mode 100644
index 0000000000..6b2600a446
--- /dev/null
+++ b/arch/mips/dts/gardena-smart-gateway-mt7688.dts
@@ -0,0 +1,54 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2018 Stefan Roese <sr@denx.de>
+ */
+
+/dts-v1/;
+
+#include "mt7628a.dtsi"
+
+/ {
+ compatible = "gardena,smart-gateway-mt7688", "ralink,mt7628a-soc";
+ model = "Gardena smart-Gateway-MT7688";
+
+ aliases {
+ serial0 = &uart0;
+ spi0 = &spi0;
+ };
+
+ memory at 0 {
+ device_type = "memory";
+ reg = <0x0 0x08000000>;
+ };
+
+ chosen {
+ bootargs = "console=ttyS0,57600";
+ stdout-path = &uart0;
+ };
+};
+
+&uart0 {
+ status = "okay";
+ clock-frequency = <40000000>;
+};
+
+&spi0 {
+ status = "okay";
+ num-cs = <2>;
+
+ spi-flash at 0 {
+ #address-cells = <1>;
+ #size-cells = <1>;
+ compatible = "spi-flash", "jedec,spi-nor";
+ spi-max-frequency = <25000000>;
+ reg = <0>;
+ };
+
+ spi-nand at 1 {
+ #address-cells = <1>;
+ #size-cells = <1>;
+ compatible = "spi-nand";
+ spi-max-frequency = <25000000>;
+ reg = <1>;
+ };
+};
diff --git a/arch/mips/mach-mt7620/Kconfig b/arch/mips/mach-mt7620/Kconfig
index ef1211d172..13a7bd2cc0 100644
--- a/arch/mips/mach-mt7620/Kconfig
+++ b/arch/mips/mach-mt7620/Kconfig
@@ -21,6 +21,14 @@ endchoice
choice
prompt "Board select"
+config BOARD_GARDENA_SMART_GATEWAY_MT7688
+ bool "Gardena Smart Gateway"
+ depends on SOC_MT7620
+ select SUPPORTS_BOOT_RAM
+ help
+ Gardena Smart Gateway boards have a MT7688 SoC with 128 MiB of RAM
+ and 8 MiB of flash (SPI NOR) and additional SPI NAND storage.
+
config BOARD_LINKIT_SMART_7688
bool "LinkIt Smart 7688"
depends on SOC_MT7620
@@ -121,6 +129,7 @@ endchoice
config SUPPORTS_BOOT_RAM
bool
+source "board/gardena/smart-gateway-mt7688/Kconfig"
source "board/seeed/linkit-smart-7688/Kconfig"
endmenu
diff --git a/board/gardena/smart-gateway-mt7688/Kconfig b/board/gardena/smart-gateway-mt7688/Kconfig
new file mode 100644
index 0000000000..3653f8aadb
--- /dev/null
+++ b/board/gardena/smart-gateway-mt7688/Kconfig
@@ -0,0 +1,12 @@
+if BOARD_GARDENA_SMART_GATEWAY_MT7688
+
+config SYS_BOARD
+ default "smart-gateway-mt7688"
+
+config SYS_VENDOR
+ default "gardena"
+
+config SYS_CONFIG_NAME
+ default "gardena-smart-gateway-mt7688"
+
+endif
diff --git a/board/gardena/smart-gateway-mt7688/MAINTAINERS b/board/gardena/smart-gateway-mt7688/MAINTAINERS
new file mode 100644
index 0000000000..bbb491c1ce
--- /dev/null
+++ b/board/gardena/smart-gateway-mt7688/MAINTAINERS
@@ -0,0 +1,8 @@
+GARDENA_SMART_GATEWAY_MT7688 BOARD
+M: Stefan Roese <sr@denx.de>
+S: Maintained
+F: board/gardena/smart-gateway-mt7688
+F: include/configs/gardena-smart-gateway-mt7688.h
+F: configs/gardena-smart-gateway-mt7688_defconfig
+F: configs/gardena-smart-gateway-mt7688-ram_defconfig
+F: arch/mips/dts/gardena-smart-gateway-mt7688.dts
diff --git a/board/gardena/smart-gateway-mt7688/Makefile b/board/gardena/smart-gateway-mt7688/Makefile
new file mode 100644
index 0000000000..70cd7a8e56
--- /dev/null
+++ b/board/gardena/smart-gateway-mt7688/Makefile
@@ -0,0 +1,3 @@
+# SPDX-License-Identifier: GPL-2.0+
+
+obj-y += board.o
diff --git a/board/gardena/smart-gateway-mt7688/board.c b/board/gardena/smart-gateway-mt7688/board.c
new file mode 100644
index 0000000000..a62dc654f2
--- /dev/null
+++ b/board/gardena/smart-gateway-mt7688/board.c
@@ -0,0 +1,18 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2018 Stefan Roese <sr@denx.de>
+ */
+
+#include <common.h>
+#include <asm/io.h>
+
+void board_debug_uart_init(void)
+{
+ /* Nothing to be done here for this board (no UART setup etc) */
+}
+
+int board_early_init_f(void)
+{
+ /* Nothing to be done here for this board (no UART setup etc) */
+ return 0;
+}
diff --git a/configs/gardena-smart-gateway-mt7688-ram_defconfig b/configs/gardena-smart-gateway-mt7688-ram_defconfig
new file mode 100644
index 0000000000..3220db6677
--- /dev/null
+++ b/configs/gardena-smart-gateway-mt7688-ram_defconfig
@@ -0,0 +1,68 @@
+CONFIG_MIPS=y
+CONFIG_SYS_TEXT_BASE=0x80010000
+CONFIG_DEBUG_UART_BOARD_INIT=y
+CONFIG_DEBUG_UART_BASE=0x10000c00
+CONFIG_DEBUG_UART_CLOCK=40000000
+CONFIG_ARCH_MT7620=y
+# CONFIG_MIPS_BOOT_CMDLINE_LEGACY is not set
+# CONFIG_MIPS_BOOT_ENV_LEGACY is not set
+CONFIG_MIPS_BOOT_FDT=y
+CONFIG_DEFAULT_DEVICE_TREE="gardena-smart-gateway-mt7688"
+CONFIG_DEBUG_UART=y
+# CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
+CONFIG_OF_STDOUT_VIA_ALIAS=y
+CONFIG_SYS_CONSOLE_INFO_QUIET=y
+CONFIG_BOARD_EARLY_INIT_F=y
+CONFIG_HUSH_PARSER=y
+CONFIG_CMD_CPU=y
+CONFIG_CMD_LICENSE=y
+# CONFIG_CMD_BOOTD is not set
+# CONFIG_CMD_ELF is not set
+# CONFIG_CMD_XIMG is not set
+CONFIG_CMD_MEMINFO=y
+# CONFIG_CMD_FLASH is not set
+# CONFIG_CMD_LOADS is not set
+CONFIG_CMD_MTD=y
+CONFIG_CMD_SF=y
+CONFIG_CMD_SPI=y
+CONFIG_CMD_MII=y
+CONFIG_CMD_PING=y
+CONFIG_CMD_TIME=y
+CONFIG_MTDIDS_DEFAULT="spi-nand0=spi-nand0"
+CONFIG_MTDPARTS_DEFAULT="mtdparts=spi-nand0:-(ubi)"
+CONFIG_CMD_UBI=y
+CONFIG_OF_EMBED=y
+CONFIG_ENV_IS_IN_SPI_FLASH=y
+# CONFIG_DM_DEVICE_REMOVE is not set
+CONFIG_HAVE_BLOCK_DEVICE=y
+CONFIG_CLK=y
+CONFIG_CPU=y
+CONFIG_DM_GPIO=y
+CONFIG_LED=y
+CONFIG_LED_BLINK=y
+CONFIG_LED_GPIO=y
+CONFIG_MTD=y
+CONFIG_MTD_SPI_NAND=y
+CONFIG_SPI_FLASH=y
+CONFIG_SPI_FLASH_GIGADEVICE=y
+CONFIG_SPI_FLASH_MACRONIX=y
+CONFIG_SPI_FLASH_SPANSION=y
+CONFIG_SPI_FLASH_STMICRO=y
+CONFIG_SPI_FLASH_WINBOND=y
+CONFIG_SPI_FLASH_XMC=y
+CONFIG_SPI_FLASH_MTD=y
+CONFIG_PHYLIB=y
+CONFIG_PHY_FIXED=y
+CONFIG_MT76XX_ETH=y
+CONFIG_PHY=y
+CONFIG_POWER_DOMAIN=y
+CONFIG_RAM=y
+CONFIG_DM_RESET=y
+CONFIG_BAUDRATE=57600
+# CONFIG_SPL_SERIAL_PRESENT is not set
+CONFIG_DEBUG_UART_SHIFT=2
+CONFIG_DEBUG_UART_ANNOUNCE=y
+CONFIG_SYS_NS16550=y
+CONFIG_SPI=y
+CONFIG_MT76XX_SPI=y
+CONFIG_SYSRESET_SYSCON=y
diff --git a/configs/gardena-smart-gateway-mt7688_defconfig b/configs/gardena-smart-gateway-mt7688_defconfig
new file mode 100644
index 0000000000..8e9e6e895e
--- /dev/null
+++ b/configs/gardena-smart-gateway-mt7688_defconfig
@@ -0,0 +1,67 @@
+CONFIG_MIPS=y
+CONFIG_SYS_TEXT_BASE=0xbc000000
+CONFIG_DEBUG_UART_BOARD_INIT=y
+CONFIG_DEBUG_UART_BASE=0x10000c00
+CONFIG_DEBUG_UART_CLOCK=40000000
+CONFIG_ARCH_MT7620=y
+CONFIG_BOOT_ROM=y
+CONFIG_ONBOARD_DDR2_SIZE_1024MBIT=y
+CONFIG_ONBOARD_DDR2_CHIP_WIDTH_16BIT=y
+# CONFIG_MIPS_BOOT_CMDLINE_LEGACY is not set
+# CONFIG_MIPS_BOOT_ENV_LEGACY is not set
+CONFIG_MIPS_BOOT_FDT=y
+CONFIG_DEFAULT_DEVICE_TREE="gardena-smart-gateway-mt7688"
+CONFIG_DEBUG_UART=y
+# CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
+CONFIG_OF_STDOUT_VIA_ALIAS=y
+CONFIG_SYS_CONSOLE_INFO_QUIET=y
+CONFIG_BOARD_EARLY_INIT_F=y
+CONFIG_HUSH_PARSER=y
+CONFIG_CMD_CPU=y
+CONFIG_CMD_LICENSE=y
+# CONFIG_CMD_BOOTD is not set
+# CONFIG_CMD_ELF is not set
+# CONFIG_CMD_XIMG is not set
+CONFIG_CMD_MEMINFO=y
+# CONFIG_CMD_FLASH is not set
+# CONFIG_CMD_LOADS is not set
+CONFIG_CMD_MTD=y
+CONFIG_CMD_SF=y
+CONFIG_CMD_SPI=y
+# CONFIG_CMD_NET is not set
+CONFIG_CMD_TIME=y
+CONFIG_MTDIDS_DEFAULT="spi-nand0=spi-nand0"
+CONFIG_MTDPARTS_DEFAULT="mtdparts=spi-nand0:-(ubi)"
+CONFIG_CMD_UBI=y
+CONFIG_OF_EMBED=y
+CONFIG_ENV_IS_IN_SPI_FLASH=y
+# CONFIG_DM_DEVICE_REMOVE is not set
+CONFIG_HAVE_BLOCK_DEVICE=y
+CONFIG_CLK=y
+CONFIG_CPU=y
+CONFIG_DM_GPIO=y
+CONFIG_LED=y
+CONFIG_LED_BLINK=y
+CONFIG_LED_GPIO=y
+CONFIG_MTD=y
+CONFIG_MTD_SPI_NAND=y
+CONFIG_SPI_FLASH=y
+CONFIG_SPI_FLASH_GIGADEVICE=y
+CONFIG_SPI_FLASH_MACRONIX=y
+CONFIG_SPI_FLASH_SPANSION=y
+CONFIG_SPI_FLASH_STMICRO=y
+CONFIG_SPI_FLASH_WINBOND=y
+CONFIG_SPI_FLASH_XMC=y
+CONFIG_SPI_FLASH_MTD=y
+CONFIG_PHY=y
+CONFIG_POWER_DOMAIN=y
+CONFIG_RAM=y
+CONFIG_DM_RESET=y
+CONFIG_BAUDRATE=57600
+# CONFIG_SPL_SERIAL_PRESENT is not set
+CONFIG_DEBUG_UART_SHIFT=2
+CONFIG_DEBUG_UART_ANNOUNCE=y
+CONFIG_SYS_NS16550=y
+CONFIG_SPI=y
+CONFIG_MT76XX_SPI=y
+CONFIG_SYSRESET_SYSCON=y
diff --git a/include/configs/gardena-smart-gateway-mt7688.h b/include/configs/gardena-smart-gateway-mt7688.h
new file mode 100644
index 0000000000..5ec9c6a041
--- /dev/null
+++ b/include/configs/gardena-smart-gateway-mt7688.h
@@ -0,0 +1,56 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright (C) 2018 Stefan Roese <sr@denx.de>
+ */
+
+#ifndef __CONFIG_GARDENA_SMART_GATEWAY_H
+#define __CONFIG_GARDENA_SMART_GATEWAY_H
+
+/* CPU */
+#define CONFIG_SYS_MIPS_TIMER_FREQ 200000000
+
+/* RAM */
+#define CONFIG_NR_DRAM_BANKS 1
+#define CONFIG_SYS_SDRAM_BASE 0x80000000
+
+#define CONFIG_SYS_LOAD_ADDR CONFIG_SYS_SDRAM_BASE + 0x100000
+
+#define CONFIG_SYS_INIT_SP_OFFSET 0x400000
+
+#ifdef CONFIG_BOOT_RAM
+#define CONFIG_SKIP_LOWLEVEL_INIT
+#endif
+
+/* UART */
+#define CONFIG_SYS_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200, \
+ 230400, 500000, 1500000 }
+
+/* RAM */
+#define CONFIG_SYS_MEMTEST_START 0x80100000
+#define CONFIG_SYS_MEMTEST_END 0x80400000
+
+/* Memory usage */
+#define CONFIG_SYS_MAXARGS 64
+#define CONFIG_SYS_MALLOC_LEN (1024 * 1024)
+#define CONFIG_SYS_BOOTPARAMS_LEN (128 * 1024)
+#define CONFIG_SYS_CBSIZE 512
+
+/* U-Boot */
+#define CONFIG_SYS_MONITOR_BASE CONFIG_SYS_TEXT_BASE
+
+/* Environment settings */
+#define CONFIG_ENV_OFFSET 0x80000
+#define CONFIG_ENV_SIZE (64 << 10)
+#define CONFIG_ENV_SECT_SIZE (64 << 10)
+#define CONFIG_SYS_REDUNDAND_ENVIRONMENT
+#define CONFIG_ENV_OFFSET_REDUND (CONFIG_ENV_OFFSET + \
+ CONFIG_ENV_SECT_SIZE)
+#define CONFIG_ENV_SIZE_REDUND CONFIG_ENV_SIZE
+
+/*
+ * Environment is right behind U-Boot in flash. Make sure U-Boot
+ * doesn't grow into the environment area.
+ */
+#define CONFIG_BOARD_SIZE_LIMIT CONFIG_ENV_OFFSET
+
+#endif /* __CONFIG_GARDENA_SMART_GATEWAY_H */
--
2.18.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [U-Boot] [PATCH 5/5 v2] mips: mt76xx: Add sysreset support
2018-08-10 7:48 [U-Boot] [PATCH 1/5 v2] mips: Add basic MediaTek MT7620/88 support Stefan Roese
` (2 preceding siblings ...)
2018-08-10 7:48 ` [U-Boot] [PATCH 4/5 v2] mips: Add Gardena Smart-Gateway board support Stefan Roese
@ 2018-08-10 7:48 ` Stefan Roese
2018-08-15 23:09 ` [U-Boot] [PATCH 1/5 v2] mips: Add basic MediaTek MT7620/88 support Daniel Schwierzeck
4 siblings, 0 replies; 11+ messages in thread
From: Stefan Roese @ 2018-08-10 7:48 UTC (permalink / raw)
To: u-boot
This patch adds the necessary sysreset DT node and enables the required
drivers via Kconfig.
Signed-off-by: Stefan Roese <sr@denx.de>
Cc: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
---
v2:
- New patch
arch/mips/Kconfig | 1 +
arch/mips/dts/mt7628a.dtsi | 7 +++++++
2 files changed, 8 insertions(+)
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
index b7c5fa3114..4234b924c4 100644
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -100,6 +100,7 @@ config ARCH_MT7620
select SUPPORTS_CPU_MIPS32_R1
select SUPPORTS_CPU_MIPS32_R2
select SUPPORTS_LITTLE_ENDIAN
+ select SYSRESET
config MACH_PIC32
bool "Support Microchip PIC32"
diff --git a/arch/mips/dts/mt7628a.dtsi b/arch/mips/dts/mt7628a.dtsi
index d00f528e1f..d525f019fe 100644
--- a/arch/mips/dts/mt7628a.dtsi
+++ b/arch/mips/dts/mt7628a.dtsi
@@ -41,6 +41,13 @@
reg = <0x0 0x100>;
};
+ syscon-reboot {
+ compatible = "syscon-reboot";
+ regmap = <&sysc>;
+ offset = <0x34>;
+ mask = <0x1>;
+ };
+
intc: interrupt-controller at 200 {
compatible = "ralink,rt2880-intc";
reg = <0x200 0x100>;
--
2.18.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [U-Boot] [PATCH 3/5 v2] mips: Add LinkIt Smart 7688 support
2018-08-10 7:48 ` [U-Boot] [PATCH 3/5 v2] mips: Add LinkIt Smart 7688 support Stefan Roese
@ 2018-08-15 14:30 ` Daniel Schwierzeck
2018-08-15 14:35 ` Stefan Roese
2018-08-15 22:34 ` Daniel Schwierzeck
1 sibling, 1 reply; 11+ messages in thread
From: Daniel Schwierzeck @ 2018-08-15 14:30 UTC (permalink / raw)
To: u-boot
On 10.08.2018 09:48, Stefan Roese wrote:
> The LinkIt Smart 7688 modules have a MT7688 SoC with 128 MiB of RAM
> and 32 MiB of flash (SPI NOR).
>
> The mt7628a.dtsi file is imported from Linux v4.17.
>
> This patch also includes 2 targets. One is the target that can be
> programmed into the SPI NOR flash and a 2nd target "xxx-ram" is
> added to support loading and booting via an already running U-Boot
> version. This allows easy development and testing without the
> need to flash the image each time.
>
> Signed-off-by: Stefan Roese <sr@denx.de>
> Cc: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
> ---
> v2:
> - Kconfig entries added with this patch now
>
> arch/mips/dts/linkit-smart-7688.dts | 46 ++++++++
> arch/mips/dts/mt7628a.dtsi | 135 ++++++++++++++++++++++
> arch/mips/mach-mt7620/Kconfig | 13 +++
> board/seeed/linkit-smart-7688/Kconfig | 12 ++
> board/seeed/linkit-smart-7688/MAINTAINERS | 8 ++
> board/seeed/linkit-smart-7688/Makefile | 3 +
> board/seeed/linkit-smart-7688/board.c | 22 ++++
> configs/linkit-smart-7688-ram_defconfig | 58 ++++++++++
> configs/linkit-smart-7688_defconfig | 62 ++++++++++
> include/configs/linkit-smart-7688.h | 52 +++++++++
> 10 files changed, 411 insertions(+)
> create mode 100644 arch/mips/dts/linkit-smart-7688.dts
> create mode 100644 arch/mips/dts/mt7628a.dtsi
> create mode 100644 board/seeed/linkit-smart-7688/Kconfig
> create mode 100644 board/seeed/linkit-smart-7688/MAINTAINERS
> create mode 100644 board/seeed/linkit-smart-7688/Makefile
> create mode 100644 board/seeed/linkit-smart-7688/board.c
> create mode 100644 configs/linkit-smart-7688-ram_defconfig
> create mode 100644 configs/linkit-smart-7688_defconfig
> create mode 100644 include/configs/linkit-smart-7688.h
>
> diff --git a/arch/mips/dts/linkit-smart-7688.dts b/arch/mips/dts/linkit-smart-7688.dts
> new file mode 100644
> index 0000000000..df4bf907c6
> --- /dev/null
> +++ b/arch/mips/dts/linkit-smart-7688.dts
> @@ -0,0 +1,46 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Copyright (C) 2018 Stefan Roese <sr@denx.de>
> + */
> +
> +/dts-v1/;
> +
> +#include "mt7628a.dtsi"
> +
> +/ {
> + compatible = "seeed,linkit-smart-7688", "ralink,mt7628a-soc";
> + model = "LinkIt-Smart-7688";
> +
> + aliases {
> + serial0 = &uart2;
> + spi0 = &spi0;
> + };
> +
> + memory at 0 {
> + device_type = "memory";
> + reg = <0x0 0x08000000>;
> + };
> +
> + chosen {
> + bootargs = "console=ttyS0,57600";
> + stdout-path = &uart2;
> + };
> +};
> +
> +&uart2 {
> + status = "okay";
> + clock-frequency = <40000000>;
> +};
> +
> +&spi0 {
> + status = "okay";
> + num-cs = <2>;
> +
> + spi-flash at 0 {
> + #address-cells = <1>;
> + #size-cells = <1>;
> + compatible = "spi-flash", "jedec,spi-nor";
> + spi-max-frequency = <25000000>;
> + reg = <0>;
> + };
> +};
> diff --git a/arch/mips/dts/mt7628a.dtsi b/arch/mips/dts/mt7628a.dtsi
> new file mode 100644
> index 0000000000..d00f528e1f
> --- /dev/null
> +++ b/arch/mips/dts/mt7628a.dtsi
> @@ -0,0 +1,135 @@
> +// SPDX-License-Identifier: GPL-2.0
> +
> +/ {
> + #address-cells = <1>;
> + #size-cells = <1>;
> + compatible = "ralink,mt7628a-soc";
> +
> + cpus {
> + #address-cells = <1>;
> + #size-cells = <0>;
> +
> + cpu at 0 {
> + compatible = "mti,mips24KEc";
> + device_type = "cpu";
> + reg = <0>;
> + };
> + };
> +
> + resetc: reset-controller {
> + compatible = "ralink,rt2880-reset";
> + #reset-cells = <1>;
> + };
> +
> + cpuintc: interrupt-controller {
> + #address-cells = <0>;
> + #interrupt-cells = <1>;
> + interrupt-controller;
> + compatible = "mti,cpu-interrupt-controller";
> + };
> +
> + palmbus at 10000000 {
> + compatible = "palmbus", "simple-bus";
> + reg = <0x10000000 0x200000>;
> + ranges = <0x0 0x10000000 0x1FFFFF>;
> +
> + #address-cells = <1>;
> + #size-cells = <1>;
> +
> + sysc: system-controller at 0 {
> + compatible = "ralink,mt7620a-sysc", "syscon";
> + reg = <0x0 0x100>;
> + };
> +
> + intc: interrupt-controller at 200 {
> + compatible = "ralink,rt2880-intc";
> + reg = <0x200 0x100>;
> +
> + interrupt-controller;
> + #interrupt-cells = <1>;
> +
> + resets = <&resetc 9>;
> + reset-names = "intc";
> +
> + interrupt-parent = <&cpuintc>;
> + interrupts = <2>;
> +
> + ralink,intc-registers = <0x9c 0xa0
> + 0x6c 0xa4
> + 0x80 0x78>;
> + };
> +
> + memory-controller at 300 {
> + compatible = "ralink,mt7620a-memc";
> + reg = <0x300 0x100>;
> + };
> +
> + spi0: spi at b00 {
> + compatible = "ralink,mt7621-spi";
> + reg = <0xb00 0x40>;
> + #address-cells = <1>;
> + #size-cells = <0>;
> + };
> +
> + uart0: uartlite at c00 {
> + compatible = "ns16550a";
> + reg = <0xc00 0x100>;
> +
> + resets = <&resetc 12>;
> + reset-names = "uart0";
> +
> + interrupt-parent = <&intc>;
> + interrupts = <20>;
> +
> + reg-shift = <2>;
> + };
> +
> + uart1: uart1 at d00 {
> + compatible = "ns16550a";
> + reg = <0xd00 0x100>;
> +
> + resets = <&resetc 19>;
> + reset-names = "uart1";
> +
> + interrupt-parent = <&intc>;
> + interrupts = <21>;
> +
> + reg-shift = <2>;
> + };
> +
> + uart2: uart2 at e00 {
> + compatible = "ns16550a";
> + reg = <0xe00 0x100>;
> +
> + resets = <&resetc 20>;
> + reset-names = "uart2";
> +
> + interrupt-parent = <&intc>;
> + interrupts = <22>;
> +
> + reg-shift = <2>;
> + };
> + };
> +
> + usb_phy: usb-phy at 10120000 {
> + compatible = "mediatek,mt7628-usbphy";
> + reg = <0x10120000 0x1000>;
> +
> + #phy-cells = <0>;
> +
> + ralink,sysctl = <&sysc>;
> + resets = <&resetc 22 &resetc 25>;
> + reset-names = "host", "device";
> + };
> +
> + ehci at 101c0000 {
> + compatible = "generic-ehci";
> + reg = <0x101c0000 0x1000>;
> +
> + phys = <&usb_phy>;
> + phy-names = "usb";
> +
> + interrupt-parent = <&intc>;
> + interrupts = <18>;
> + };
> +};
> diff --git a/arch/mips/mach-mt7620/Kconfig b/arch/mips/mach-mt7620/Kconfig
> index 396fbd0141..ef1211d172 100644
> --- a/arch/mips/mach-mt7620/Kconfig
> +++ b/arch/mips/mach-mt7620/Kconfig
> @@ -21,6 +21,17 @@ endchoice
> choice
> prompt "Board select"
>
> +config BOARD_LINKIT_SMART_7688
> + bool "LinkIt Smart 7688"
> + depends on SOC_MT7620
> + select SUPPORTS_BOOT_RAM
> + help
> + Seeed LinkIt Smart 7688 boards have a MT7688 SoC with 128 MiB of RAM
> + and 32 MiB of flash (SPI).
> + Between its different peripherals there's an integrated switch with 4
> + ethernet ports, 1 USB port, 1 UART, GPIO buttons and LEDs, and
> + a MT7688 (PCIe).
> +
> endchoice
>
> choice
> @@ -110,4 +121,6 @@ endchoice
> config SUPPORTS_BOOT_RAM
> bool
>
> +source "board/seeed/linkit-smart-7688/Kconfig"
> +
> endmenu
> diff --git a/board/seeed/linkit-smart-7688/Kconfig b/board/seeed/linkit-smart-7688/Kconfig
> new file mode 100644
> index 0000000000..a9d63285c3
> --- /dev/null
> +++ b/board/seeed/linkit-smart-7688/Kconfig
> @@ -0,0 +1,12 @@
> +if BOARD_LINKIT_SMART_7688
> +
> +config SYS_BOARD
> + default "linkit-smart-7688"
> +
> +config SYS_VENDOR
> + default "seeed"
> +
> +config SYS_CONFIG_NAME
> + default "linkit-smart-7688"
> +
> +endif
> diff --git a/board/seeed/linkit-smart-7688/MAINTAINERS b/board/seeed/linkit-smart-7688/MAINTAINERS
> new file mode 100644
> index 0000000000..c3bbad4231
> --- /dev/null
> +++ b/board/seeed/linkit-smart-7688/MAINTAINERS
> @@ -0,0 +1,8 @@
> +LINKIT_SMART_7688 BOARD
> +M: Stefan Roese <sr@denx.de>
> +S: Maintained
> +F: board/seeed/linkit-smart-7688
> +F: include/configs/linkit-smart-7688.h
> +F: configs/linkit-smart-7688_defconfig
> +F: configs/linkit-smart-7688_ram_defconfig
> +F: arch/mips/dts/linkit-smart-7688.dts
> diff --git a/board/seeed/linkit-smart-7688/Makefile b/board/seeed/linkit-smart-7688/Makefile
> new file mode 100644
> index 0000000000..70cd7a8e56
> --- /dev/null
> +++ b/board/seeed/linkit-smart-7688/Makefile
> @@ -0,0 +1,3 @@
> +# SPDX-License-Identifier: GPL-2.0+
> +
> +obj-y += board.o
> diff --git a/board/seeed/linkit-smart-7688/board.c b/board/seeed/linkit-smart-7688/board.c
> new file mode 100644
> index 0000000000..fbe94cc292
> --- /dev/null
> +++ b/board/seeed/linkit-smart-7688/board.c
> @@ -0,0 +1,22 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Copyright (C) 2018 Stefan Roese <sr@denx.de>
> + */
> +
> +#include <common.h>
> +#include <asm/io.h>
> +
> +#define MT76XX_GPIO1_MODE 0xb0000060
should be a physical address
> +
> +void board_debug_uart_init(void)
> +{
> + /* Select UART2 mode instead of GPIO mode (default) */
> + clrbits_le32((void __iomem *)MT76XX_GPIO1_MODE, GENMASK(27, 26));
with the comment above, this is preferred:
void __iomem *gpio_mode = ioremap_nocache(MT76XX_GPIO1_MODE);
clrbits_le32(gpio_mode), GENMASK(27, 26));
> +}
> +
> +int board_early_init_f(void)
> +{
> + board_debug_uart_init();
this will be called automatically if you enable CONFIG_DEBUG_UART_BOARD_INIT
> +
> + return 0;
> +}
> diff --git a/configs/linkit-smart-7688-ram_defconfig b/configs/linkit-smart-7688-ram_defconfig
> new file mode 100644
> index 0000000000..4b269f459b
> --- /dev/null
> +++ b/configs/linkit-smart-7688-ram_defconfig
> @@ -0,0 +1,58 @@
> +CONFIG_MIPS=y
> +CONFIG_SYS_TEXT_BASE=0x80010000
> +CONFIG_DEBUG_UART_BOARD_INIT=y
> +CONFIG_DEBUG_UART_BASE=0x10000e00
> +CONFIG_DEBUG_UART_CLOCK=40000000
> +CONFIG_ARCH_MT7620=y
> +# CONFIG_MIPS_BOOT_CMDLINE_LEGACY is not set
> +# CONFIG_MIPS_BOOT_ENV_LEGACY is not set
> +CONFIG_MIPS_BOOT_FDT=y
> +CONFIG_DEFAULT_DEVICE_TREE="linkit-smart-7688"
> +CONFIG_DEBUG_UART=y
> +# CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
> +CONFIG_OF_STDOUT_VIA_ALIAS=y
> +CONFIG_SYS_CONSOLE_INFO_QUIET=y
> +CONFIG_BOARD_EARLY_INIT_F=y
> +CONFIG_HUSH_PARSER=y
> +CONFIG_CMD_CPU=y
> +CONFIG_CMD_LICENSE=y
> +# CONFIG_CMD_BOOTD is not set
> +# CONFIG_CMD_ELF is not set
> +# CONFIG_CMD_XIMG is not set
> +CONFIG_CMD_MEMINFO=y
> +# CONFIG_CMD_FLASH is not set
> +# CONFIG_CMD_LOADS is not set
> +CONFIG_CMD_SF=y
> +CONFIG_CMD_SPI=y
> +# CONFIG_CMD_NET is not set
> +CONFIG_CMD_TIME=y
> +CONFIG_OF_EMBED=y
> +CONFIG_ENV_IS_IN_SPI_FLASH=y
> +# CONFIG_DM_DEVICE_REMOVE is not set
> +CONFIG_HAVE_BLOCK_DEVICE=y
> +CONFIG_CLK=y
> +CONFIG_CPU=y
> +CONFIG_DM_GPIO=y
> +CONFIG_LED=y
> +CONFIG_LED_BLINK=y
> +CONFIG_LED_GPIO=y
> +CONFIG_SPI_FLASH=y
> +CONFIG_SPI_FLASH_4BYTE_MODE_ONLY=y
> +CONFIG_SPI_FLASH_GIGADEVICE=y
> +CONFIG_SPI_FLASH_MACRONIX=y
> +CONFIG_SPI_FLASH_SPANSION=y
> +CONFIG_SPI_FLASH_STMICRO=y
> +CONFIG_SPI_FLASH_WINBOND=y
> +CONFIG_SPI_FLASH_MTD=y
> +CONFIG_PHY=y
> +CONFIG_POWER_DOMAIN=y
> +CONFIG_RAM=y
> +CONFIG_DM_RESET=y
> +CONFIG_BAUDRATE=57600
> +# CONFIG_SPL_SERIAL_PRESENT is not set
> +CONFIG_DEBUG_UART_SHIFT=2
> +CONFIG_DEBUG_UART_ANNOUNCE=y
> +CONFIG_SYS_NS16550=y
> +CONFIG_SPI=y
> +CONFIG_MT76XX_SPI=y
> +CONFIG_SYSRESET_SYSCON=y
> diff --git a/configs/linkit-smart-7688_defconfig b/configs/linkit-smart-7688_defconfig
> new file mode 100644
> index 0000000000..cdb8c06517
> --- /dev/null
> +++ b/configs/linkit-smart-7688_defconfig
> @@ -0,0 +1,62 @@
> +CONFIG_MIPS=y
> +CONFIG_SYS_TEXT_BASE=0xbc000000
> +CONFIG_DEBUG_UART_BOARD_INIT=y
> +CONFIG_DEBUG_UART_BASE=0x10000e00
> +CONFIG_DEBUG_UART_CLOCK=40000000
> +CONFIG_ARCH_MT7620=y
> +CONFIG_BOOT_ROM=y
> +CONFIG_ONBOARD_DDR2_SIZE_1024MBIT=y
> +CONFIG_ONBOARD_DDR2_CHIP_WIDTH_16BIT=y
> +# CONFIG_MIPS_BOOT_CMDLINE_LEGACY is not set
> +# CONFIG_MIPS_BOOT_ENV_LEGACY is not set
> +CONFIG_MIPS_BOOT_FDT=y
> +CONFIG_DEFAULT_DEVICE_TREE="linkit-smart-7688"
> +CONFIG_DEBUG_UART=y
> +# CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
> +CONFIG_OF_STDOUT_VIA_ALIAS=y
> +CONFIG_SYS_CONSOLE_INFO_QUIET=y
> +CONFIG_BOARD_EARLY_INIT_F=y
> +CONFIG_HUSH_PARSER=y
> +CONFIG_CMD_CPU=y
> +CONFIG_CMD_LICENSE=y
> +# CONFIG_CMD_BOOTD is not set
> +# CONFIG_CMD_ELF is not set
> +# CONFIG_CMD_XIMG is not set
> +# CONFIG_CMD_CRC32 is not set
> +CONFIG_CMD_MEMINFO=y
> +# CONFIG_CMD_FLASH is not set
> +# CONFIG_CMD_LOADS is not set
> +CONFIG_CMD_SF=y
> +CONFIG_CMD_SPI=y
> +# CONFIG_CMD_NET is not set
> +CONFIG_CMD_TIME=y
> +CONFIG_OF_EMBED=y
> +CONFIG_ENV_IS_IN_SPI_FLASH=y
> +# CONFIG_DM_DEVICE_REMOVE is not set
> +CONFIG_HAVE_BLOCK_DEVICE=y
> +CONFIG_CLK=y
> +CONFIG_CPU=y
> +CONFIG_DM_GPIO=y
> +CONFIG_LED=y
> +CONFIG_LED_BLINK=y
> +CONFIG_LED_GPIO=y
> +CONFIG_SPI_FLASH=y
> +CONFIG_SPI_FLASH_4BYTE_MODE_ONLY=y
> +CONFIG_SPI_FLASH_GIGADEVICE=y
> +CONFIG_SPI_FLASH_MACRONIX=y
> +CONFIG_SPI_FLASH_SPANSION=y
> +CONFIG_SPI_FLASH_STMICRO=y
> +CONFIG_SPI_FLASH_WINBOND=y
> +CONFIG_SPI_FLASH_MTD=y
> +CONFIG_PHY=y
> +CONFIG_POWER_DOMAIN=y
> +CONFIG_RAM=y
> +CONFIG_DM_RESET=y
> +CONFIG_BAUDRATE=57600
> +# CONFIG_SPL_SERIAL_PRESENT is not set
> +CONFIG_DEBUG_UART_SHIFT=2
> +CONFIG_DEBUG_UART_ANNOUNCE=y
> +CONFIG_SYS_NS16550=y
> +CONFIG_SPI=y
> +CONFIG_MT76XX_SPI=y
> +CONFIG_SYSRESET_SYSCON=y
> diff --git a/include/configs/linkit-smart-7688.h b/include/configs/linkit-smart-7688.h
> new file mode 100644
> index 0000000000..be6cffee35
> --- /dev/null
> +++ b/include/configs/linkit-smart-7688.h
> @@ -0,0 +1,52 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +/*
> + * Copyright (C) 2018 Stefan Roese <sr@denx.de>
> + */
> +
> +#ifndef __CONFIG_LINKIT_SMART_7688_H
> +#define __CONFIG_LINKIT_SMART_7688_H
> +
> +/* CPU */
> +#define CONFIG_SYS_MIPS_TIMER_FREQ 200000000
> +
> +/* RAM */
> +#define CONFIG_NR_DRAM_BANKS 1
> +#define CONFIG_SYS_SDRAM_BASE 0x80000000
> +
> +#define CONFIG_SYS_LOAD_ADDR CONFIG_SYS_SDRAM_BASE + 0x100000
> +
> +#define CONFIG_SYS_INIT_SP_OFFSET 0x400000
> +
> +#ifdef CONFIG_BOOT_RAM
> +#define CONFIG_SKIP_LOWLEVEL_INIT
> +#endif
> +
> +/* UART */
> +#define CONFIG_SYS_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200, \
> + 230400, 500000, 1500000 }
> +
> +/* RAM */
> +#define CONFIG_SYS_MEMTEST_START 0x80100000
> +#define CONFIG_SYS_MEMTEST_END 0x80400000
> +
> +/* Memory usage */
> +#define CONFIG_SYS_MAXARGS 64
> +#define CONFIG_SYS_MALLOC_LEN (1024 * 1024)
> +#define CONFIG_SYS_BOOTPARAMS_LEN (128 * 1024)
> +#define CONFIG_SYS_CBSIZE 512
> +
> +/* U-Boot */
> +#define CONFIG_SYS_MONITOR_BASE CONFIG_SYS_TEXT_BASE
> +
> +/* Environment settings */
> +#define CONFIG_ENV_OFFSET 0x40000
> +#define CONFIG_ENV_SIZE (16 << 10)
> +#define CONFIG_ENV_SECT_SIZE (64 << 10)
> +
> +/*
> + * Environment is right behind U-Boot in flash. Make sure U-Boot
> + * doesn't grow into the environment area.
> + */
> +#define CONFIG_BOARD_SIZE_LIMIT CONFIG_ENV_OFFSET
> +
> +#endif /* __CONFIG_LINKIT_SMART_7688_H */
>
--
- Daniel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20180815/19dc0309/attachment.sig>
^ permalink raw reply [flat|nested] 11+ messages in thread
* [U-Boot] [PATCH 3/5 v2] mips: Add LinkIt Smart 7688 support
2018-08-15 14:30 ` Daniel Schwierzeck
@ 2018-08-15 14:35 ` Stefan Roese
0 siblings, 0 replies; 11+ messages in thread
From: Stefan Roese @ 2018-08-15 14:35 UTC (permalink / raw)
To: u-boot
On 15.08.2018 16:30, Daniel Schwierzeck wrote:
>
>
> On 10.08.2018 09:48, Stefan Roese wrote:
>> The LinkIt Smart 7688 modules have a MT7688 SoC with 128 MiB of RAM
>> and 32 MiB of flash (SPI NOR).
>>
>> The mt7628a.dtsi file is imported from Linux v4.17.
>>
>> This patch also includes 2 targets. One is the target that can be
>> programmed into the SPI NOR flash and a 2nd target "xxx-ram" is
>> added to support loading and booting via an already running U-Boot
>> version. This allows easy development and testing without the
>> need to flash the image each time.
>>
>> Signed-off-by: Stefan Roese <sr@denx.de>
>> Cc: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
>> ---
>> v2:
>> - Kconfig entries added with this patch now
>>
>> arch/mips/dts/linkit-smart-7688.dts | 46 ++++++++
>> arch/mips/dts/mt7628a.dtsi | 135 ++++++++++++++++++++++
>> arch/mips/mach-mt7620/Kconfig | 13 +++
>> board/seeed/linkit-smart-7688/Kconfig | 12 ++
>> board/seeed/linkit-smart-7688/MAINTAINERS | 8 ++
>> board/seeed/linkit-smart-7688/Makefile | 3 +
>> board/seeed/linkit-smart-7688/board.c | 22 ++++
>> configs/linkit-smart-7688-ram_defconfig | 58 ++++++++++
>> configs/linkit-smart-7688_defconfig | 62 ++++++++++
>> include/configs/linkit-smart-7688.h | 52 +++++++++
>> 10 files changed, 411 insertions(+)
>> create mode 100644 arch/mips/dts/linkit-smart-7688.dts
>> create mode 100644 arch/mips/dts/mt7628a.dtsi
>> create mode 100644 board/seeed/linkit-smart-7688/Kconfig
>> create mode 100644 board/seeed/linkit-smart-7688/MAINTAINERS
>> create mode 100644 board/seeed/linkit-smart-7688/Makefile
>> create mode 100644 board/seeed/linkit-smart-7688/board.c
>> create mode 100644 configs/linkit-smart-7688-ram_defconfig
>> create mode 100644 configs/linkit-smart-7688_defconfig
>> create mode 100644 include/configs/linkit-smart-7688.h
>>
>> diff --git a/arch/mips/dts/linkit-smart-7688.dts b/arch/mips/dts/linkit-smart-7688.dts
>> new file mode 100644
>> index 0000000000..df4bf907c6
>> --- /dev/null
>> +++ b/arch/mips/dts/linkit-smart-7688.dts
>> @@ -0,0 +1,46 @@
>> +// SPDX-License-Identifier: GPL-2.0
>> +/*
>> + * Copyright (C) 2018 Stefan Roese <sr@denx.de>
>> + */
>> +
>> +/dts-v1/;
>> +
>> +#include "mt7628a.dtsi"
>> +
>> +/ {
>> + compatible = "seeed,linkit-smart-7688", "ralink,mt7628a-soc";
>> + model = "LinkIt-Smart-7688";
>> +
>> + aliases {
>> + serial0 = &uart2;
>> + spi0 = &spi0;
>> + };
>> +
>> + memory at 0 {
>> + device_type = "memory";
>> + reg = <0x0 0x08000000>;
>> + };
>> +
>> + chosen {
>> + bootargs = "console=ttyS0,57600";
>> + stdout-path = &uart2;
>> + };
>> +};
>> +
>> +&uart2 {
>> + status = "okay";
>> + clock-frequency = <40000000>;
>> +};
>> +
>> +&spi0 {
>> + status = "okay";
>> + num-cs = <2>;
>> +
>> + spi-flash at 0 {
>> + #address-cells = <1>;
>> + #size-cells = <1>;
>> + compatible = "spi-flash", "jedec,spi-nor";
>> + spi-max-frequency = <25000000>;
>> + reg = <0>;
>> + };
>> +};
>> diff --git a/arch/mips/dts/mt7628a.dtsi b/arch/mips/dts/mt7628a.dtsi
>> new file mode 100644
>> index 0000000000..d00f528e1f
>> --- /dev/null
>> +++ b/arch/mips/dts/mt7628a.dtsi
>> @@ -0,0 +1,135 @@
>> +// SPDX-License-Identifier: GPL-2.0
>> +
>> +/ {
>> + #address-cells = <1>;
>> + #size-cells = <1>;
>> + compatible = "ralink,mt7628a-soc";
>> +
>> + cpus {
>> + #address-cells = <1>;
>> + #size-cells = <0>;
>> +
>> + cpu at 0 {
>> + compatible = "mti,mips24KEc";
>> + device_type = "cpu";
>> + reg = <0>;
>> + };
>> + };
>> +
>> + resetc: reset-controller {
>> + compatible = "ralink,rt2880-reset";
>> + #reset-cells = <1>;
>> + };
>> +
>> + cpuintc: interrupt-controller {
>> + #address-cells = <0>;
>> + #interrupt-cells = <1>;
>> + interrupt-controller;
>> + compatible = "mti,cpu-interrupt-controller";
>> + };
>> +
>> + palmbus at 10000000 {
>> + compatible = "palmbus", "simple-bus";
>> + reg = <0x10000000 0x200000>;
>> + ranges = <0x0 0x10000000 0x1FFFFF>;
>> +
>> + #address-cells = <1>;
>> + #size-cells = <1>;
>> +
>> + sysc: system-controller at 0 {
>> + compatible = "ralink,mt7620a-sysc", "syscon";
>> + reg = <0x0 0x100>;
>> + };
>> +
>> + intc: interrupt-controller at 200 {
>> + compatible = "ralink,rt2880-intc";
>> + reg = <0x200 0x100>;
>> +
>> + interrupt-controller;
>> + #interrupt-cells = <1>;
>> +
>> + resets = <&resetc 9>;
>> + reset-names = "intc";
>> +
>> + interrupt-parent = <&cpuintc>;
>> + interrupts = <2>;
>> +
>> + ralink,intc-registers = <0x9c 0xa0
>> + 0x6c 0xa4
>> + 0x80 0x78>;
>> + };
>> +
>> + memory-controller at 300 {
>> + compatible = "ralink,mt7620a-memc";
>> + reg = <0x300 0x100>;
>> + };
>> +
>> + spi0: spi at b00 {
>> + compatible = "ralink,mt7621-spi";
>> + reg = <0xb00 0x40>;
>> + #address-cells = <1>;
>> + #size-cells = <0>;
>> + };
>> +
>> + uart0: uartlite at c00 {
>> + compatible = "ns16550a";
>> + reg = <0xc00 0x100>;
>> +
>> + resets = <&resetc 12>;
>> + reset-names = "uart0";
>> +
>> + interrupt-parent = <&intc>;
>> + interrupts = <20>;
>> +
>> + reg-shift = <2>;
>> + };
>> +
>> + uart1: uart1 at d00 {
>> + compatible = "ns16550a";
>> + reg = <0xd00 0x100>;
>> +
>> + resets = <&resetc 19>;
>> + reset-names = "uart1";
>> +
>> + interrupt-parent = <&intc>;
>> + interrupts = <21>;
>> +
>> + reg-shift = <2>;
>> + };
>> +
>> + uart2: uart2 at e00 {
>> + compatible = "ns16550a";
>> + reg = <0xe00 0x100>;
>> +
>> + resets = <&resetc 20>;
>> + reset-names = "uart2";
>> +
>> + interrupt-parent = <&intc>;
>> + interrupts = <22>;
>> +
>> + reg-shift = <2>;
>> + };
>> + };
>> +
>> + usb_phy: usb-phy at 10120000 {
>> + compatible = "mediatek,mt7628-usbphy";
>> + reg = <0x10120000 0x1000>;
>> +
>> + #phy-cells = <0>;
>> +
>> + ralink,sysctl = <&sysc>;
>> + resets = <&resetc 22 &resetc 25>;
>> + reset-names = "host", "device";
>> + };
>> +
>> + ehci at 101c0000 {
>> + compatible = "generic-ehci";
>> + reg = <0x101c0000 0x1000>;
>> +
>> + phys = <&usb_phy>;
>> + phy-names = "usb";
>> +
>> + interrupt-parent = <&intc>;
>> + interrupts = <18>;
>> + };
>> +};
>> diff --git a/arch/mips/mach-mt7620/Kconfig b/arch/mips/mach-mt7620/Kconfig
>> index 396fbd0141..ef1211d172 100644
>> --- a/arch/mips/mach-mt7620/Kconfig
>> +++ b/arch/mips/mach-mt7620/Kconfig
>> @@ -21,6 +21,17 @@ endchoice
>> choice
>> prompt "Board select"
>>
>> +config BOARD_LINKIT_SMART_7688
>> + bool "LinkIt Smart 7688"
>> + depends on SOC_MT7620
>> + select SUPPORTS_BOOT_RAM
>> + help
>> + Seeed LinkIt Smart 7688 boards have a MT7688 SoC with 128 MiB of RAM
>> + and 32 MiB of flash (SPI).
>> + Between its different peripherals there's an integrated switch with 4
>> + ethernet ports, 1 USB port, 1 UART, GPIO buttons and LEDs, and
>> + a MT7688 (PCIe).
>> +
>> endchoice
>>
>> choice
>> @@ -110,4 +121,6 @@ endchoice
>> config SUPPORTS_BOOT_RAM
>> bool
>>
>> +source "board/seeed/linkit-smart-7688/Kconfig"
>> +
>> endmenu
>> diff --git a/board/seeed/linkit-smart-7688/Kconfig b/board/seeed/linkit-smart-7688/Kconfig
>> new file mode 100644
>> index 0000000000..a9d63285c3
>> --- /dev/null
>> +++ b/board/seeed/linkit-smart-7688/Kconfig
>> @@ -0,0 +1,12 @@
>> +if BOARD_LINKIT_SMART_7688
>> +
>> +config SYS_BOARD
>> + default "linkit-smart-7688"
>> +
>> +config SYS_VENDOR
>> + default "seeed"
>> +
>> +config SYS_CONFIG_NAME
>> + default "linkit-smart-7688"
>> +
>> +endif
>> diff --git a/board/seeed/linkit-smart-7688/MAINTAINERS b/board/seeed/linkit-smart-7688/MAINTAINERS
>> new file mode 100644
>> index 0000000000..c3bbad4231
>> --- /dev/null
>> +++ b/board/seeed/linkit-smart-7688/MAINTAINERS
>> @@ -0,0 +1,8 @@
>> +LINKIT_SMART_7688 BOARD
>> +M: Stefan Roese <sr@denx.de>
>> +S: Maintained
>> +F: board/seeed/linkit-smart-7688
>> +F: include/configs/linkit-smart-7688.h
>> +F: configs/linkit-smart-7688_defconfig
>> +F: configs/linkit-smart-7688_ram_defconfig
>> +F: arch/mips/dts/linkit-smart-7688.dts
>> diff --git a/board/seeed/linkit-smart-7688/Makefile b/board/seeed/linkit-smart-7688/Makefile
>> new file mode 100644
>> index 0000000000..70cd7a8e56
>> --- /dev/null
>> +++ b/board/seeed/linkit-smart-7688/Makefile
>> @@ -0,0 +1,3 @@
>> +# SPDX-License-Identifier: GPL-2.0+
>> +
>> +obj-y += board.o
>> diff --git a/board/seeed/linkit-smart-7688/board.c b/board/seeed/linkit-smart-7688/board.c
>> new file mode 100644
>> index 0000000000..fbe94cc292
>> --- /dev/null
>> +++ b/board/seeed/linkit-smart-7688/board.c
>> @@ -0,0 +1,22 @@
>> +// SPDX-License-Identifier: GPL-2.0+
>> +/*
>> + * Copyright (C) 2018 Stefan Roese <sr@denx.de>
>> + */
>> +
>> +#include <common.h>
>> +#include <asm/io.h>
>> +
>> +#define MT76XX_GPIO1_MODE 0xb0000060
>
> should be a physical address
>
>> +
>> +void board_debug_uart_init(void)
>> +{
>> + /* Select UART2 mode instead of GPIO mode (default) */
>> + clrbits_le32((void __iomem *)MT76XX_GPIO1_MODE, GENMASK(27, 26));
>
> with the comment above, this is preferred:
>
> void __iomem *gpio_mode = ioremap_nocache(MT76XX_GPIO1_MODE);
> clrbits_le32(gpio_mode), GENMASK(27, 26));
Okay, will change.
>> +}
>> +
>> +int board_early_init_f(void)
>> +{
>> + board_debug_uart_init();
>
> this will be called automatically if you enable CONFIG_DEBUG_UART_BOARD_INIT
Yes. But I plan to de-select DEBUG_UART support at some time (after
the port has stabilized at bit more). And then this pin muxing is
needed here as well. I could add a comment here to make this clear.
Thanks,
Stefan
^ permalink raw reply [flat|nested] 11+ messages in thread
* [U-Boot] [PATCH 4/5 v2] mips: Add Gardena Smart-Gateway board support
2018-08-10 7:48 ` [U-Boot] [PATCH 4/5 v2] mips: Add Gardena Smart-Gateway board support Stefan Roese
@ 2018-08-15 14:36 ` Daniel Schwierzeck
2018-08-15 14:39 ` Stefan Roese
0 siblings, 1 reply; 11+ messages in thread
From: Daniel Schwierzeck @ 2018-08-15 14:36 UTC (permalink / raw)
To: u-boot
On 10.08.2018 09:48, Stefan Roese wrote:
> The Gardena Smart-Gateway boards have a MT7688 SoC with 128 MiB of RAM
> and 8 MiB of flash (SPI NOR) and additional 128MiB SPI NAND storage.
>
> This patch also includes 2 targets. One is the target that can be
> programmed into the SPI NOR flash and a 2nd target "xxx-ram" is
> added to support loading and booting via an already running U-Boot
> version. This allows easy development and testing without the
> need to flash the image each time.
>
> Signed-off-by: Stefan Roese <sr@denx.de>
> Cc: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
> ---
> v2:
> - No change
>
> .../mips/dts/gardena-smart-gateway-mt7688.dts | 54 +++++++++++++++
> arch/mips/mach-mt7620/Kconfig | 9 +++
> board/gardena/smart-gateway-mt7688/Kconfig | 12 ++++
> .../gardena/smart-gateway-mt7688/MAINTAINERS | 8 +++
> board/gardena/smart-gateway-mt7688/Makefile | 3 +
> board/gardena/smart-gateway-mt7688/board.c | 18 +++++
> ...gardena-smart-gateway-mt7688-ram_defconfig | 68 +++++++++++++++++++
> .../gardena-smart-gateway-mt7688_defconfig | 67 ++++++++++++++++++
> .../configs/gardena-smart-gateway-mt7688.h | 56 +++++++++++++++
> 9 files changed, 295 insertions(+)
> create mode 100644 arch/mips/dts/gardena-smart-gateway-mt7688.dts
> create mode 100644 board/gardena/smart-gateway-mt7688/Kconfig
> create mode 100644 board/gardena/smart-gateway-mt7688/MAINTAINERS
> create mode 100644 board/gardena/smart-gateway-mt7688/Makefile
> create mode 100644 board/gardena/smart-gateway-mt7688/board.c
> create mode 100644 configs/gardena-smart-gateway-mt7688-ram_defconfig
> create mode 100644 configs/gardena-smart-gateway-mt7688_defconfig
> create mode 100644 include/configs/gardena-smart-gateway-mt7688.h
>
> diff --git a/arch/mips/dts/gardena-smart-gateway-mt7688.dts b/arch/mips/dts/gardena-smart-gateway-mt7688.dts
> new file mode 100644
> index 0000000000..6b2600a446
> --- /dev/null
> +++ b/arch/mips/dts/gardena-smart-gateway-mt7688.dts
> @@ -0,0 +1,54 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Copyright (C) 2018 Stefan Roese <sr@denx.de>
> + */
> +
> +/dts-v1/;
> +
> +#include "mt7628a.dtsi"
> +
> +/ {
> + compatible = "gardena,smart-gateway-mt7688", "ralink,mt7628a-soc";
> + model = "Gardena smart-Gateway-MT7688";
> +
> + aliases {
> + serial0 = &uart0;
> + spi0 = &spi0;
> + };
> +
> + memory at 0 {
> + device_type = "memory";
> + reg = <0x0 0x08000000>;
> + };
> +
> + chosen {
> + bootargs = "console=ttyS0,57600";
> + stdout-path = &uart0;
> + };
> +};
> +
> +&uart0 {
> + status = "okay";
> + clock-frequency = <40000000>;
> +};
> +
> +&spi0 {
> + status = "okay";
> + num-cs = <2>;
> +
> + spi-flash at 0 {
> + #address-cells = <1>;
> + #size-cells = <1>;
> + compatible = "spi-flash", "jedec,spi-nor";
> + spi-max-frequency = <25000000>;
> + reg = <0>;
> + };
> +
> + spi-nand at 1 {
> + #address-cells = <1>;
> + #size-cells = <1>;
> + compatible = "spi-nand";
> + spi-max-frequency = <25000000>;
> + reg = <1>;
> + };
> +};
> diff --git a/arch/mips/mach-mt7620/Kconfig b/arch/mips/mach-mt7620/Kconfig
> index ef1211d172..13a7bd2cc0 100644
> --- a/arch/mips/mach-mt7620/Kconfig
> +++ b/arch/mips/mach-mt7620/Kconfig
> @@ -21,6 +21,14 @@ endchoice
> choice
> prompt "Board select"
>
> +config BOARD_GARDENA_SMART_GATEWAY_MT7688
> + bool "Gardena Smart Gateway"
> + depends on SOC_MT7620
> + select SUPPORTS_BOOT_RAM
> + help
> + Gardena Smart Gateway boards have a MT7688 SoC with 128 MiB of RAM
> + and 8 MiB of flash (SPI NOR) and additional SPI NAND storage.
> +
> config BOARD_LINKIT_SMART_7688
> bool "LinkIt Smart 7688"
> depends on SOC_MT7620
> @@ -121,6 +129,7 @@ endchoice
> config SUPPORTS_BOOT_RAM
> bool
>
> +source "board/gardena/smart-gateway-mt7688/Kconfig"
> source "board/seeed/linkit-smart-7688/Kconfig"
>
> endmenu
> diff --git a/board/gardena/smart-gateway-mt7688/Kconfig b/board/gardena/smart-gateway-mt7688/Kconfig
> new file mode 100644
> index 0000000000..3653f8aadb
> --- /dev/null
> +++ b/board/gardena/smart-gateway-mt7688/Kconfig
> @@ -0,0 +1,12 @@
> +if BOARD_GARDENA_SMART_GATEWAY_MT7688
> +
> +config SYS_BOARD
> + default "smart-gateway-mt7688"
> +
> +config SYS_VENDOR
> + default "gardena"
> +
> +config SYS_CONFIG_NAME
> + default "gardena-smart-gateway-mt7688"
> +
> +endif
> diff --git a/board/gardena/smart-gateway-mt7688/MAINTAINERS b/board/gardena/smart-gateway-mt7688/MAINTAINERS
> new file mode 100644
> index 0000000000..bbb491c1ce
> --- /dev/null
> +++ b/board/gardena/smart-gateway-mt7688/MAINTAINERS
> @@ -0,0 +1,8 @@
> +GARDENA_SMART_GATEWAY_MT7688 BOARD
> +M: Stefan Roese <sr@denx.de>
> +S: Maintained
> +F: board/gardena/smart-gateway-mt7688
> +F: include/configs/gardena-smart-gateway-mt7688.h
> +F: configs/gardena-smart-gateway-mt7688_defconfig
> +F: configs/gardena-smart-gateway-mt7688-ram_defconfig
> +F: arch/mips/dts/gardena-smart-gateway-mt7688.dts
> diff --git a/board/gardena/smart-gateway-mt7688/Makefile b/board/gardena/smart-gateway-mt7688/Makefile
> new file mode 100644
> index 0000000000..70cd7a8e56
> --- /dev/null
> +++ b/board/gardena/smart-gateway-mt7688/Makefile
> @@ -0,0 +1,3 @@
> +# SPDX-License-Identifier: GPL-2.0+
> +
> +obj-y += board.o
> diff --git a/board/gardena/smart-gateway-mt7688/board.c b/board/gardena/smart-gateway-mt7688/board.c
> new file mode 100644
> index 0000000000..a62dc654f2
> --- /dev/null
> +++ b/board/gardena/smart-gateway-mt7688/board.c
> @@ -0,0 +1,18 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Copyright (C) 2018 Stefan Roese <sr@denx.de>
> + */
> +
> +#include <common.h>
> +#include <asm/io.h>
> +
> +void board_debug_uart_init(void)
> +{
> + /* Nothing to be done here for this board (no UART setup etc) */
> +}
> +
> +int board_early_init_f(void)
> +{
> + /* Nothing to be done here for this board (no UART setup etc) */
> + return 0;
> +}
do you plan to implement something? Otherwise you could drop those
functions and if you don't enable CONFIG_BOARD_EARLY_INIT_F and
CONFIG_DEBUG_UART_BOARD_INIT.
> diff --git a/configs/gardena-smart-gateway-mt7688-ram_defconfig b/configs/gardena-smart-gateway-mt7688-ram_defconfig
> new file mode 100644
> index 0000000000..3220db6677
> --- /dev/null
> +++ b/configs/gardena-smart-gateway-mt7688-ram_defconfig
> @@ -0,0 +1,68 @@
> +CONFIG_MIPS=y
> +CONFIG_SYS_TEXT_BASE=0x80010000
> +CONFIG_DEBUG_UART_BOARD_INIT=y
> +CONFIG_DEBUG_UART_BASE=0x10000c00
> +CONFIG_DEBUG_UART_CLOCK=40000000
> +CONFIG_ARCH_MT7620=y
> +# CONFIG_MIPS_BOOT_CMDLINE_LEGACY is not set
> +# CONFIG_MIPS_BOOT_ENV_LEGACY is not set
> +CONFIG_MIPS_BOOT_FDT=y
> +CONFIG_DEFAULT_DEVICE_TREE="gardena-smart-gateway-mt7688"
> +CONFIG_DEBUG_UART=y
> +# CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
> +CONFIG_OF_STDOUT_VIA_ALIAS=y
> +CONFIG_SYS_CONSOLE_INFO_QUIET=y
> +CONFIG_BOARD_EARLY_INIT_F=y
> +CONFIG_HUSH_PARSER=y
> +CONFIG_CMD_CPU=y
> +CONFIG_CMD_LICENSE=y
> +# CONFIG_CMD_BOOTD is not set
> +# CONFIG_CMD_ELF is not set
> +# CONFIG_CMD_XIMG is not set
> +CONFIG_CMD_MEMINFO=y
> +# CONFIG_CMD_FLASH is not set
> +# CONFIG_CMD_LOADS is not set
> +CONFIG_CMD_MTD=y
> +CONFIG_CMD_SF=y
> +CONFIG_CMD_SPI=y
> +CONFIG_CMD_MII=y
> +CONFIG_CMD_PING=y
> +CONFIG_CMD_TIME=y
> +CONFIG_MTDIDS_DEFAULT="spi-nand0=spi-nand0"
> +CONFIG_MTDPARTS_DEFAULT="mtdparts=spi-nand0:-(ubi)"
> +CONFIG_CMD_UBI=y
> +CONFIG_OF_EMBED=y
> +CONFIG_ENV_IS_IN_SPI_FLASH=y
> +# CONFIG_DM_DEVICE_REMOVE is not set
> +CONFIG_HAVE_BLOCK_DEVICE=y
> +CONFIG_CLK=y
> +CONFIG_CPU=y
> +CONFIG_DM_GPIO=y
> +CONFIG_LED=y
> +CONFIG_LED_BLINK=y
> +CONFIG_LED_GPIO=y
> +CONFIG_MTD=y
> +CONFIG_MTD_SPI_NAND=y
> +CONFIG_SPI_FLASH=y
> +CONFIG_SPI_FLASH_GIGADEVICE=y
> +CONFIG_SPI_FLASH_MACRONIX=y
> +CONFIG_SPI_FLASH_SPANSION=y
> +CONFIG_SPI_FLASH_STMICRO=y
> +CONFIG_SPI_FLASH_WINBOND=y
> +CONFIG_SPI_FLASH_XMC=y
> +CONFIG_SPI_FLASH_MTD=y
> +CONFIG_PHYLIB=y
> +CONFIG_PHY_FIXED=y
> +CONFIG_MT76XX_ETH=y
> +CONFIG_PHY=y
> +CONFIG_POWER_DOMAIN=y
> +CONFIG_RAM=y
> +CONFIG_DM_RESET=y
> +CONFIG_BAUDRATE=57600
> +# CONFIG_SPL_SERIAL_PRESENT is not set
> +CONFIG_DEBUG_UART_SHIFT=2
> +CONFIG_DEBUG_UART_ANNOUNCE=y
> +CONFIG_SYS_NS16550=y
> +CONFIG_SPI=y
> +CONFIG_MT76XX_SPI=y
> +CONFIG_SYSRESET_SYSCON=y
> diff --git a/configs/gardena-smart-gateway-mt7688_defconfig b/configs/gardena-smart-gateway-mt7688_defconfig
> new file mode 100644
> index 0000000000..8e9e6e895e
> --- /dev/null
> +++ b/configs/gardena-smart-gateway-mt7688_defconfig
> @@ -0,0 +1,67 @@
> +CONFIG_MIPS=y
> +CONFIG_SYS_TEXT_BASE=0xbc000000
> +CONFIG_DEBUG_UART_BOARD_INIT=y
> +CONFIG_DEBUG_UART_BASE=0x10000c00
> +CONFIG_DEBUG_UART_CLOCK=40000000
> +CONFIG_ARCH_MT7620=y
> +CONFIG_BOOT_ROM=y
> +CONFIG_ONBOARD_DDR2_SIZE_1024MBIT=y
> +CONFIG_ONBOARD_DDR2_CHIP_WIDTH_16BIT=y
> +# CONFIG_MIPS_BOOT_CMDLINE_LEGACY is not set
> +# CONFIG_MIPS_BOOT_ENV_LEGACY is not set
> +CONFIG_MIPS_BOOT_FDT=y
> +CONFIG_DEFAULT_DEVICE_TREE="gardena-smart-gateway-mt7688"
> +CONFIG_DEBUG_UART=y
> +# CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
> +CONFIG_OF_STDOUT_VIA_ALIAS=y
> +CONFIG_SYS_CONSOLE_INFO_QUIET=y
> +CONFIG_BOARD_EARLY_INIT_F=y
> +CONFIG_HUSH_PARSER=y
> +CONFIG_CMD_CPU=y
> +CONFIG_CMD_LICENSE=y
> +# CONFIG_CMD_BOOTD is not set
> +# CONFIG_CMD_ELF is not set
> +# CONFIG_CMD_XIMG is not set
> +CONFIG_CMD_MEMINFO=y
> +# CONFIG_CMD_FLASH is not set
> +# CONFIG_CMD_LOADS is not set
> +CONFIG_CMD_MTD=y
> +CONFIG_CMD_SF=y
> +CONFIG_CMD_SPI=y
> +# CONFIG_CMD_NET is not set
> +CONFIG_CMD_TIME=y
> +CONFIG_MTDIDS_DEFAULT="spi-nand0=spi-nand0"
> +CONFIG_MTDPARTS_DEFAULT="mtdparts=spi-nand0:-(ubi)"
> +CONFIG_CMD_UBI=y
> +CONFIG_OF_EMBED=y
> +CONFIG_ENV_IS_IN_SPI_FLASH=y
> +# CONFIG_DM_DEVICE_REMOVE is not set
> +CONFIG_HAVE_BLOCK_DEVICE=y
> +CONFIG_CLK=y
> +CONFIG_CPU=y
> +CONFIG_DM_GPIO=y
> +CONFIG_LED=y
> +CONFIG_LED_BLINK=y
> +CONFIG_LED_GPIO=y
> +CONFIG_MTD=y
> +CONFIG_MTD_SPI_NAND=y
> +CONFIG_SPI_FLASH=y
> +CONFIG_SPI_FLASH_GIGADEVICE=y
> +CONFIG_SPI_FLASH_MACRONIX=y
> +CONFIG_SPI_FLASH_SPANSION=y
> +CONFIG_SPI_FLASH_STMICRO=y
> +CONFIG_SPI_FLASH_WINBOND=y
> +CONFIG_SPI_FLASH_XMC=y
> +CONFIG_SPI_FLASH_MTD=y
> +CONFIG_PHY=y
> +CONFIG_POWER_DOMAIN=y
> +CONFIG_RAM=y
> +CONFIG_DM_RESET=y
> +CONFIG_BAUDRATE=57600
> +# CONFIG_SPL_SERIAL_PRESENT is not set
> +CONFIG_DEBUG_UART_SHIFT=2
> +CONFIG_DEBUG_UART_ANNOUNCE=y
> +CONFIG_SYS_NS16550=y
> +CONFIG_SPI=y
> +CONFIG_MT76XX_SPI=y
> +CONFIG_SYSRESET_SYSCON=y
> diff --git a/include/configs/gardena-smart-gateway-mt7688.h b/include/configs/gardena-smart-gateway-mt7688.h
> new file mode 100644
> index 0000000000..5ec9c6a041
> --- /dev/null
> +++ b/include/configs/gardena-smart-gateway-mt7688.h
> @@ -0,0 +1,56 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +/*
> + * Copyright (C) 2018 Stefan Roese <sr@denx.de>
> + */
> +
> +#ifndef __CONFIG_GARDENA_SMART_GATEWAY_H
> +#define __CONFIG_GARDENA_SMART_GATEWAY_H
> +
> +/* CPU */
> +#define CONFIG_SYS_MIPS_TIMER_FREQ 200000000
> +
> +/* RAM */
> +#define CONFIG_NR_DRAM_BANKS 1
> +#define CONFIG_SYS_SDRAM_BASE 0x80000000
> +
> +#define CONFIG_SYS_LOAD_ADDR CONFIG_SYS_SDRAM_BASE + 0x100000
> +
> +#define CONFIG_SYS_INIT_SP_OFFSET 0x400000
> +
> +#ifdef CONFIG_BOOT_RAM
> +#define CONFIG_SKIP_LOWLEVEL_INIT
> +#endif
> +
> +/* UART */
> +#define CONFIG_SYS_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200, \
> + 230400, 500000, 1500000 }
> +
> +/* RAM */
> +#define CONFIG_SYS_MEMTEST_START 0x80100000
> +#define CONFIG_SYS_MEMTEST_END 0x80400000
> +
> +/* Memory usage */
> +#define CONFIG_SYS_MAXARGS 64
> +#define CONFIG_SYS_MALLOC_LEN (1024 * 1024)
> +#define CONFIG_SYS_BOOTPARAMS_LEN (128 * 1024)
> +#define CONFIG_SYS_CBSIZE 512
> +
> +/* U-Boot */
> +#define CONFIG_SYS_MONITOR_BASE CONFIG_SYS_TEXT_BASE
> +
> +/* Environment settings */
> +#define CONFIG_ENV_OFFSET 0x80000
> +#define CONFIG_ENV_SIZE (64 << 10)
> +#define CONFIG_ENV_SECT_SIZE (64 << 10)
> +#define CONFIG_SYS_REDUNDAND_ENVIRONMENT
> +#define CONFIG_ENV_OFFSET_REDUND (CONFIG_ENV_OFFSET + \
> + CONFIG_ENV_SECT_SIZE)
> +#define CONFIG_ENV_SIZE_REDUND CONFIG_ENV_SIZE
> +
> +/*
> + * Environment is right behind U-Boot in flash. Make sure U-Boot
> + * doesn't grow into the environment area.
> + */
> +#define CONFIG_BOARD_SIZE_LIMIT CONFIG_ENV_OFFSET
> +
> +#endif /* __CONFIG_GARDENA_SMART_GATEWAY_H */
>
--
- Daniel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20180815/4369aafd/attachment.sig>
^ permalink raw reply [flat|nested] 11+ messages in thread
* [U-Boot] [PATCH 4/5 v2] mips: Add Gardena Smart-Gateway board support
2018-08-15 14:36 ` Daniel Schwierzeck
@ 2018-08-15 14:39 ` Stefan Roese
0 siblings, 0 replies; 11+ messages in thread
From: Stefan Roese @ 2018-08-15 14:39 UTC (permalink / raw)
To: u-boot
On 15.08.2018 16:36, Daniel Schwierzeck wrote:
>
>
> On 10.08.2018 09:48, Stefan Roese wrote:
>> The Gardena Smart-Gateway boards have a MT7688 SoC with 128 MiB of RAM
>> and 8 MiB of flash (SPI NOR) and additional 128MiB SPI NAND storage.
>>
>> This patch also includes 2 targets. One is the target that can be
>> programmed into the SPI NOR flash and a 2nd target "xxx-ram" is
>> added to support loading and booting via an already running U-Boot
>> version. This allows easy development and testing without the
>> need to flash the image each time.
>>
>> Signed-off-by: Stefan Roese <sr@denx.de>
>> Cc: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
>> ---
>> v2:
>> - No change
>>
>> .../mips/dts/gardena-smart-gateway-mt7688.dts | 54 +++++++++++++++
>> arch/mips/mach-mt7620/Kconfig | 9 +++
>> board/gardena/smart-gateway-mt7688/Kconfig | 12 ++++
>> .../gardena/smart-gateway-mt7688/MAINTAINERS | 8 +++
>> board/gardena/smart-gateway-mt7688/Makefile | 3 +
>> board/gardena/smart-gateway-mt7688/board.c | 18 +++++
>> ...gardena-smart-gateway-mt7688-ram_defconfig | 68 +++++++++++++++++++
>> .../gardena-smart-gateway-mt7688_defconfig | 67 ++++++++++++++++++
>> .../configs/gardena-smart-gateway-mt7688.h | 56 +++++++++++++++
>> 9 files changed, 295 insertions(+)
>> create mode 100644 arch/mips/dts/gardena-smart-gateway-mt7688.dts
>> create mode 100644 board/gardena/smart-gateway-mt7688/Kconfig
>> create mode 100644 board/gardena/smart-gateway-mt7688/MAINTAINERS
>> create mode 100644 board/gardena/smart-gateway-mt7688/Makefile
>> create mode 100644 board/gardena/smart-gateway-mt7688/board.c
>> create mode 100644 configs/gardena-smart-gateway-mt7688-ram_defconfig
>> create mode 100644 configs/gardena-smart-gateway-mt7688_defconfig
>> create mode 100644 include/configs/gardena-smart-gateway-mt7688.h
>>
>> diff --git a/arch/mips/dts/gardena-smart-gateway-mt7688.dts b/arch/mips/dts/gardena-smart-gateway-mt7688.dts
>> new file mode 100644
>> index 0000000000..6b2600a446
>> --- /dev/null
>> +++ b/arch/mips/dts/gardena-smart-gateway-mt7688.dts
>> @@ -0,0 +1,54 @@
>> +// SPDX-License-Identifier: GPL-2.0
>> +/*
>> + * Copyright (C) 2018 Stefan Roese <sr@denx.de>
>> + */
>> +
>> +/dts-v1/;
>> +
>> +#include "mt7628a.dtsi"
>> +
>> +/ {
>> + compatible = "gardena,smart-gateway-mt7688", "ralink,mt7628a-soc";
>> + model = "Gardena smart-Gateway-MT7688";
>> +
>> + aliases {
>> + serial0 = &uart0;
>> + spi0 = &spi0;
>> + };
>> +
>> + memory at 0 {
>> + device_type = "memory";
>> + reg = <0x0 0x08000000>;
>> + };
>> +
>> + chosen {
>> + bootargs = "console=ttyS0,57600";
>> + stdout-path = &uart0;
>> + };
>> +};
>> +
>> +&uart0 {
>> + status = "okay";
>> + clock-frequency = <40000000>;
>> +};
>> +
>> +&spi0 {
>> + status = "okay";
>> + num-cs = <2>;
>> +
>> + spi-flash at 0 {
>> + #address-cells = <1>;
>> + #size-cells = <1>;
>> + compatible = "spi-flash", "jedec,spi-nor";
>> + spi-max-frequency = <25000000>;
>> + reg = <0>;
>> + };
>> +
>> + spi-nand at 1 {
>> + #address-cells = <1>;
>> + #size-cells = <1>;
>> + compatible = "spi-nand";
>> + spi-max-frequency = <25000000>;
>> + reg = <1>;
>> + };
>> +};
>> diff --git a/arch/mips/mach-mt7620/Kconfig b/arch/mips/mach-mt7620/Kconfig
>> index ef1211d172..13a7bd2cc0 100644
>> --- a/arch/mips/mach-mt7620/Kconfig
>> +++ b/arch/mips/mach-mt7620/Kconfig
>> @@ -21,6 +21,14 @@ endchoice
>> choice
>> prompt "Board select"
>>
>> +config BOARD_GARDENA_SMART_GATEWAY_MT7688
>> + bool "Gardena Smart Gateway"
>> + depends on SOC_MT7620
>> + select SUPPORTS_BOOT_RAM
>> + help
>> + Gardena Smart Gateway boards have a MT7688 SoC with 128 MiB of RAM
>> + and 8 MiB of flash (SPI NOR) and additional SPI NAND storage.
>> +
>> config BOARD_LINKIT_SMART_7688
>> bool "LinkIt Smart 7688"
>> depends on SOC_MT7620
>> @@ -121,6 +129,7 @@ endchoice
>> config SUPPORTS_BOOT_RAM
>> bool
>>
>> +source "board/gardena/smart-gateway-mt7688/Kconfig"
>> source "board/seeed/linkit-smart-7688/Kconfig"
>>
>> endmenu
>> diff --git a/board/gardena/smart-gateway-mt7688/Kconfig b/board/gardena/smart-gateway-mt7688/Kconfig
>> new file mode 100644
>> index 0000000000..3653f8aadb
>> --- /dev/null
>> +++ b/board/gardena/smart-gateway-mt7688/Kconfig
>> @@ -0,0 +1,12 @@
>> +if BOARD_GARDENA_SMART_GATEWAY_MT7688
>> +
>> +config SYS_BOARD
>> + default "smart-gateway-mt7688"
>> +
>> +config SYS_VENDOR
>> + default "gardena"
>> +
>> +config SYS_CONFIG_NAME
>> + default "gardena-smart-gateway-mt7688"
>> +
>> +endif
>> diff --git a/board/gardena/smart-gateway-mt7688/MAINTAINERS b/board/gardena/smart-gateway-mt7688/MAINTAINERS
>> new file mode 100644
>> index 0000000000..bbb491c1ce
>> --- /dev/null
>> +++ b/board/gardena/smart-gateway-mt7688/MAINTAINERS
>> @@ -0,0 +1,8 @@
>> +GARDENA_SMART_GATEWAY_MT7688 BOARD
>> +M: Stefan Roese <sr@denx.de>
>> +S: Maintained
>> +F: board/gardena/smart-gateway-mt7688
>> +F: include/configs/gardena-smart-gateway-mt7688.h
>> +F: configs/gardena-smart-gateway-mt7688_defconfig
>> +F: configs/gardena-smart-gateway-mt7688-ram_defconfig
>> +F: arch/mips/dts/gardena-smart-gateway-mt7688.dts
>> diff --git a/board/gardena/smart-gateway-mt7688/Makefile b/board/gardena/smart-gateway-mt7688/Makefile
>> new file mode 100644
>> index 0000000000..70cd7a8e56
>> --- /dev/null
>> +++ b/board/gardena/smart-gateway-mt7688/Makefile
>> @@ -0,0 +1,3 @@
>> +# SPDX-License-Identifier: GPL-2.0+
>> +
>> +obj-y += board.o
>> diff --git a/board/gardena/smart-gateway-mt7688/board.c b/board/gardena/smart-gateway-mt7688/board.c
>> new file mode 100644
>> index 0000000000..a62dc654f2
>> --- /dev/null
>> +++ b/board/gardena/smart-gateway-mt7688/board.c
>> @@ -0,0 +1,18 @@
>> +// SPDX-License-Identifier: GPL-2.0+
>> +/*
>> + * Copyright (C) 2018 Stefan Roese <sr@denx.de>
>> + */
>> +
>> +#include <common.h>
>> +#include <asm/io.h>
>> +
>> +void board_debug_uart_init(void)
>> +{
>> + /* Nothing to be done here for this board (no UART setup etc) */
>> +}
>> +
>> +int board_early_init_f(void)
>> +{
>> + /* Nothing to be done here for this board (no UART setup etc) */
>> + return 0;
>> +}
>
> do you plan to implement something? Otherwise you could drop those
> functions and if you don't enable CONFIG_BOARD_EARLY_INIT_F and
> CONFIG_DEBUG_UART_BOARD_INIT.
I'm currently working on some other MUX setup (etc) here for this
board. So its very likely that something will be added. But you
are right, DEBUG_UART_BOARD_INIT can very likely be dropped.
Thanks,
Stefan
^ permalink raw reply [flat|nested] 11+ messages in thread
* [U-Boot] [PATCH 3/5 v2] mips: Add LinkIt Smart 7688 support
2018-08-10 7:48 ` [U-Boot] [PATCH 3/5 v2] mips: Add LinkIt Smart 7688 support Stefan Roese
2018-08-15 14:30 ` Daniel Schwierzeck
@ 2018-08-15 22:34 ` Daniel Schwierzeck
1 sibling, 0 replies; 11+ messages in thread
From: Daniel Schwierzeck @ 2018-08-15 22:34 UTC (permalink / raw)
To: u-boot
On 10.08.2018 09:48, Stefan Roese wrote:
> The LinkIt Smart 7688 modules have a MT7688 SoC with 128 MiB of RAM
> and 32 MiB of flash (SPI NOR).
>
> The mt7628a.dtsi file is imported from Linux v4.17.
>
> This patch also includes 2 targets. One is the target that can be
> programmed into the SPI NOR flash and a 2nd target "xxx-ram" is
> added to support loading and booting via an already running U-Boot
> version. This allows easy development and testing without the
> need to flash the image each time.
>
> Signed-off-by: Stefan Roese <sr@denx.de>
> Cc: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
> ---
> v2:
> - Kconfig entries added with this patch now
>
> arch/mips/dts/linkit-smart-7688.dts | 46 ++++++++
> arch/mips/dts/mt7628a.dtsi | 135 ++++++++++++++++++++++
this file should be added with patch 1/5
> arch/mips/mach-mt7620/Kconfig | 13 +++
> board/seeed/linkit-smart-7688/Kconfig | 12 ++
> board/seeed/linkit-smart-7688/MAINTAINERS | 8 ++
> board/seeed/linkit-smart-7688/Makefile | 3 +
> board/seeed/linkit-smart-7688/board.c | 22 ++++
> configs/linkit-smart-7688-ram_defconfig | 58 ++++++++++
> configs/linkit-smart-7688_defconfig | 62 ++++++++++
> include/configs/linkit-smart-7688.h | 52 +++++++++
> 10 files changed, 411 insertions(+)
> create mode 100644 arch/mips/dts/linkit-smart-7688.dts
> create mode 100644 arch/mips/dts/mt7628a.dtsi
> create mode 100644 board/seeed/linkit-smart-7688/Kconfig
> create mode 100644 board/seeed/linkit-smart-7688/MAINTAINERS
> create mode 100644 board/seeed/linkit-smart-7688/Makefile
> create mode 100644 board/seeed/linkit-smart-7688/board.c
> create mode 100644 configs/linkit-smart-7688-ram_defconfig
> create mode 100644 configs/linkit-smart-7688_defconfig
> create mode 100644 include/configs/linkit-smart-7688.h
--
- Daniel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20180816/df592946/attachment.sig>
^ permalink raw reply [flat|nested] 11+ messages in thread
* [U-Boot] [PATCH 1/5 v2] mips: Add basic MediaTek MT7620/88 support
2018-08-10 7:48 [U-Boot] [PATCH 1/5 v2] mips: Add basic MediaTek MT7620/88 support Stefan Roese
` (3 preceding siblings ...)
2018-08-10 7:48 ` [U-Boot] [PATCH 5/5 v2] mips: mt76xx: Add sysreset support Stefan Roese
@ 2018-08-15 23:09 ` Daniel Schwierzeck
4 siblings, 0 replies; 11+ messages in thread
From: Daniel Schwierzeck @ 2018-08-15 23:09 UTC (permalink / raw)
To: u-boot
On 10.08.2018 09:48, Stefan Roese wrote:
> This patch adds basic support for the MediaTek MT7620/88 SoCs. Parts of
> the code is copied from the MediaTek GitHub repository:
>
> https://github.com/MediaTek-Labs/linkit-smart-uboot.git
>
> Support for the LinkIt Smart 7688 module and the Gardena Smart Gateway
> both based on the MT7688 will be added in further patches.
>
> Signed-off-by: Stefan Roese <sr@denx.de>
> Cc: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
> ---
> v2:
> - Sort Kconfig symbols alphabetically
> - Use MIPS_TUNE_24KC
> - Use imply for SPI support
> - Dont' add LinkIt module support yet (is added with the board support)
> - Move SKIP_LOWLEVEL_INIT from Kconfig to config header
> - Use DT to get the base address of the system controller (for
> display_cpuinfo)
> - Remove _machine_restart - a separate driver is provided in a new patch
> - Remove cachop_op() and cal_invalidate_dcache_range and use the
> generic invalidate_dcache_range function instead
>
> Daniel I tried to change to CPU_HAS PREFETCH, but this did not work
> smoothly. It seems this option is very old and outdated. Perhaps I
> can revisit this again, once this patchset has settled a bit.
>
> arch/mips/Kconfig | 15 ++
> arch/mips/Makefile | 1 +
> arch/mips/mach-mt7620/Kconfig | 113 +++++++++
> arch/mips/mach-mt7620/Makefile | 8 +
> arch/mips/mach-mt7620/cpu.c | 72 ++++++
> arch/mips/mach-mt7620/ddr_calibrate.c | 307 +++++++++++++++++++++++
> arch/mips/mach-mt7620/lowlevel_init.S | 337 ++++++++++++++++++++++++++
> arch/mips/mach-mt7620/mt76xx.h | 38 +++
> 8 files changed, 891 insertions(+)
> create mode 100644 arch/mips/mach-mt7620/Kconfig
> create mode 100644 arch/mips/mach-mt7620/Makefile
> create mode 100644 arch/mips/mach-mt7620/cpu.c
> create mode 100644 arch/mips/mach-mt7620/ddr_calibrate.c
> create mode 100644 arch/mips/mach-mt7620/lowlevel_init.S
> create mode 100644 arch/mips/mach-mt7620/mt76xx.h
>
> diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
> index 31b622ff51..b7c5fa3114 100644
> --- a/arch/mips/Kconfig
> +++ b/arch/mips/Kconfig
> @@ -87,6 +87,20 @@ config ARCH_BMIPS
> select SYSRESET
> imply CMD_DM
>
> +config ARCH_MT7620
> + bool "Support MT7620/7688 SoCs"
> + select DISPLAY_CPUINFO
> + select DM
> + select DM_SERIAL
> + imply DM_SPI
> + imply DM_SPI_FLASH
> + select MIPS_TUNE_24KC
> + select OF_CONTROL
> + select ROM_EXCEPTION_VECTORS
> + select SUPPORTS_CPU_MIPS32_R1
> + select SUPPORTS_CPU_MIPS32_R2
> + select SUPPORTS_LITTLE_ENDIAN
> +
> config MACH_PIC32
> bool "Support Microchip PIC32"
> select DM
> @@ -141,6 +155,7 @@ source "board/qemu-mips/Kconfig"
> source "arch/mips/mach-ath79/Kconfig"
> source "arch/mips/mach-bmips/Kconfig"
> source "arch/mips/mach-pic32/Kconfig"
> +source "arch/mips/mach-mt7620/Kconfig"
>
> if MIPS
>
> diff --git a/arch/mips/Makefile b/arch/mips/Makefile
> index 5deec9a202..cc8ea5d7d4 100644
> --- a/arch/mips/Makefile
> +++ b/arch/mips/Makefile
> @@ -15,6 +15,7 @@ machine-$(CONFIG_SOC_AU1X00) += au1x00
> machine-$(CONFIG_ARCH_ATH79) += ath79
> machine-$(CONFIG_ARCH_BMIPS) += bmips
> machine-$(CONFIG_MACH_PIC32) += pic32
> +machine-$(CONFIG_ARCH_MT7620) += mt7620
>
> machdirs := $(patsubst %,arch/mips/mach-%/,$(machine-y))
> libs-y += $(machdirs)
> diff --git a/arch/mips/mach-mt7620/Kconfig b/arch/mips/mach-mt7620/Kconfig
> new file mode 100644
> index 0000000000..396fbd0141
> --- /dev/null
> +++ b/arch/mips/mach-mt7620/Kconfig
> @@ -0,0 +1,113 @@
> +menu "MediaTek MIPS platforms"
> + depends on ARCH_MT7620
> +
> +config SYS_MALLOC_F_LEN
> + default 0x1000
> +
> +config SYS_SOC
> + default "mt7620" if SOC_MT7620
> +
> +choice
> + prompt "MediaTek MIPS SoC select"
> +
> +config SOC_MT7620
> + bool "MT7620/8"
> + select MIPS_L1_CACHE_SHIFT_5
> + help
> + This supports MediaTek MIPS MT7620 family.
> +
> +endchoice
> +
> +choice
> + prompt "Board select"
> +
> +endchoice
> +
> +choice
> + prompt "Boot mode"
> +
> +config BOOT_RAM
> + bool "RAM boot"
> + depends on SUPPORTS_BOOT_RAM
> + help
> + This builds an image that is linked to a RAM address. It can be used
> + for booting from CFE via TFTP using an ELF image, but it can also be
> + booted from RAM by other bootloaders using a BIN image.
> +
> +config BOOT_ROM
> + bool "ROM boot"
> + depends on SUPPORTS_BOOT_RAM
> + help
> + This builds an image that is linked to a ROM address. It can be
> + used as main bootloader image which is programmed onto the onboard
> + flash storage (SPI NOR).
> +
> +endchoice
> +
> +choice
> + prompt "DDR2 size"
> +
> +config ONBOARD_DDR2_SIZE_256MBIT
> + bool "256MBit (32MByte) total size"
> + depends on BOOT_ROM
> + help
> + Use 256MBit (32MByte) of DDR total size
> +
> +config ONBOARD_DDR2_SIZE_512MBIT
> + bool "512MBit (64MByte) total size"
> + depends on BOOT_ROM
> + help
> + Use 512MBit (64MByte) of DDR total size
> +
> +config ONBOARD_DDR2_SIZE_1024MBIT
> + bool "1024MBit (128MByte) total size"
> + depends on BOOT_ROM
> + help
> + Use 1024MBit (128MByte) of DDR total size
> +
> +config ONBOARD_DDR2_SIZE_2048MBIT
> + bool "2048MBit (256MByte) total size"
> + depends on BOOT_ROM
> + help
> + Use 2048MBit (256MByte) of DDR total size
> +
> +endchoice
> +
> +choice
> + prompt "DDR2 chip width"
> +
> +config ONBOARD_DDR2_CHIP_WIDTH_8BIT
> + bool "8bit DDR chip width"
> + depends on BOOT_ROM
> + help
> + Use DDR chips with 8bit width
> +
> +config ONBOARD_DDR2_CHIP_WIDTH_16BIT
> + bool "16bit DDR chip width"
> + depends on BOOT_ROM
> + help
> + Use DDR chips with 16bit width
> +
> +endchoice
> +
> +choice
> + prompt "DDR2 bus width"
> +
> +config ONBOARD_DDR2_BUS_WIDTH_16BIT
> + bool "16bit DDR bus width"
> + depends on BOOT_ROM
> + help
> + Use 16bit DDR bus width
> +
> +config ONBOARD_DDR2_BUS_WIDTH_32BIT
> + bool "32bit DDR bus width"
> + depends on BOOT_ROM
> + help
> + Use 32bit DDR bus width
> +
> +endchoice
> +
> +config SUPPORTS_BOOT_RAM
> + bool
> +
> +endmenu
> diff --git a/arch/mips/mach-mt7620/Makefile b/arch/mips/mach-mt7620/Makefile
> new file mode 100644
> index 0000000000..1f3e65e8a5
> --- /dev/null
> +++ b/arch/mips/mach-mt7620/Makefile
> @@ -0,0 +1,8 @@
> +# SPDX-License-Identifier: GPL-2.0+
> +
> +obj-y += cpu.o
> +
> +ifndef CONFIG_SKIP_LOWLEVEL_INIT
> +obj-y += ddr_calibrate.o
> +obj-y += lowlevel_init.o
> +endif
> diff --git a/arch/mips/mach-mt7620/cpu.c b/arch/mips/mach-mt7620/cpu.c
> new file mode 100644
> index 0000000000..f21209522b
> --- /dev/null
> +++ b/arch/mips/mach-mt7620/cpu.c
> @@ -0,0 +1,72 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Copyright (C) 2018 Stefan Roese <sr@denx.de>
> + */
> +
> +#include <common.h>
> +#include <dm.h>
> +#include <ram.h>
> +#include <asm/io.h>
> +#include <linux/io.h>
> +#include <linux/sizes.h>
> +#include "mt76xx.h"
> +
> +#define STR_LEN 6
> +
> +#ifdef CONFIG_BOOT_ROM
> +int mach_cpu_init(void)
> +{
> + void (*ptr)(void);
> +
> + /*
> + * DDR calibration routine needs to be called very early. This
> + * function also configures the clock to run at full speed.
> + */
> + ptr = (void *)CKSEG0ADDR(ddr_calibrate);
> + (*ptr)();
> +
> + return 0;
> +}
> +#endif
I pushed an updated patch series to branch mips_optimize_cache_init if
you want to give it a test. I plan to push my patch series together with
yours in the next merge window. Thus you should remove this KSEG0 jump
in the next iteration. Thanks.
> +
> +int dram_init(void)
> +{
> + gd->ram_size = get_ram_size((void *)CONFIG_SYS_SDRAM_BASE, SZ_256M);
> +
> + return 0;
> +}
> +
> +int print_cpuinfo(void)
> +{
> + static const char * const boot_str[] = { "PLL (3-Byte SPI Addr)",
> + "PLL (4-Byte SPI Addr)",
> + "XTAL (3-Byte SPI Addr)",
> + "XTAL (4-Byte SPI Addr)" };
> + const void *blob = gd->fdt_blob;
> + char buf[STR_LEN + 1];
> + fdt_addr_t base;
> + char *str;
> + int node;
> + u32 val;
> +
> + /* Get system controller base address */
> + node = fdt_node_offset_by_compatible(blob, -1, "ralink,mt7620a-sysc");
> + if (node < 0)
> + return -FDT_ERR_NOTFOUND;
> +
> + base = fdtdec_get_addr_size_auto_noparent(blob, node, "reg",
> + 0, NULL, true);
> + if (base == FDT_ADDR_T_NONE)
> + return -EINVAL;
the address from DT should be a physical one and needs to be remapped:
void __iomem *sysc_base = ioremap_nocache(base);
> +
> + str = (char *)base + MT76XX_CHIPID_OFFS;
> + snprintf(buf, STR_LEN + 1, "%s", str);
> + val = readl((void *)base + MT76XX_CHIP_REV_ID_OFFS);
readl(sysc_base + MT76XX_CHIP_REV_ID_OFFS)
> + printf("CPU: %-*s Rev %ld.%ld - ", STR_LEN, buf,
> + (val & GENMASK(11, 8)) >> 8, val & GENMASK(3, 0));
> +
> + val = (readl((void *)base + MT76XX_SYSCFG0_OFFS) & GENMASK(3, 1)) >> 1;
same here
> + printf("Boot from %s\n", boot_str[val]);
> +
> + return 0;
> +}
> diff --git a/arch/mips/mach-mt7620/ddr_calibrate.c b/arch/mips/mach-mt7620/ddr_calibrate.c
> new file mode 100644
> index 0000000000..623816019b
> --- /dev/null
> +++ b/arch/mips/mach-mt7620/ddr_calibrate.c
> @@ -0,0 +1,307 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Copyright (C) 2018 Stefan Roese <sr@denx.de>
> + *
> + * This code is mostly based on the code extracted from this MediaTek
> + * github repository:
> + *
> + * https://github.com/MediaTek-Labs/linkit-smart-uboot.git
> + *
> + * I was not able to find a specific license or other developers
> + * copyrights here, so I can't add them here.
> + *
> + * Most functions in this file are copied from the MediaTek U-Boot
> + * repository. Without any documentation, it was impossible to really
> + * implement this differently. So its mostly a cleaned-up version of
> + * the original code, with only support for the MT7628 / MT7688 SoC.
> + */
> +
> +#include <common.h>
> +#include <linux/io.h>
> +#include <asm/cacheops.h>
> +#include <asm/io.h>
> +#include "mt76xx.h"
> +
> +#define NUM_OF_CACHELINE 64
> +#define MIN_START 6
> +#define MIN_FINE_START 0xf
> +#define MAX_START 7
> +#define MAX_FINE_START 0x0
> +
> +#define CPU_FRAC_DIV 1
> +
> +#if defined(CONFIG_ONBOARD_DDR2_SIZE_256MBIT)
> +#define DRAM_BUTTOM 0x02000000
> +#endif
> +#if defined(CONFIG_ONBOARD_DDR2_SIZE_512MBIT)
> +#define DRAM_BUTTOM 0x04000000
> +#endif
> +#if defined(CONFIG_ONBOARD_DDR2_SIZE_1024MBIT)
> +#define DRAM_BUTTOM 0x08000000
> +#endif
> +#if defined(CONFIG_ONBOARD_DDR2_SIZE_2048MBIT)
> +#define DRAM_BUTTOM 0x10000000
> +#endif
> +
> +static inline void cal_memcpy(void *src, void *dst, u32 size)
> +{
> + u8 *psrc = (u8 *)src;
> + u8 *pdst = (u8 *)dst;
> + int i;
> +
> + for (i = 0; i < size; i++, psrc++, pdst++)
> + *pdst = *psrc;
> +}
> +
> +static inline void cal_memset(void *src, u8 pat, u32 size)
> +{
> + u8 *psrc = (u8 *)src;
> + int i;
> +
> + for (i = 0; i < size; i++, psrc++)
> + *psrc = pat;
> +}
> +
> +#define pref_op(hint, addr) \
> + __asm__ __volatile__( \
> + ".set push\n" \
> + ".set noreorder\n" \
> + "pref %0, %1\n" \
> + ".set pop\n" \
> + : \
> + : "i" (hint), "R" (*(u8 *)(addr)))
> +
> +static inline void cal_patgen(u32 start_addr, u32 size, u32 bias)
> +{
> + u32 *addr = (u32 *)start_addr;
> + int i;
> +
> + for (i = 0; i < size; i++)
> + addr[i] = start_addr + i + bias;
> +}
> +
> +static inline int test_loop(int k, int dqs, u32 test_dqs, u32 *coarse_dqs,
> + u32 offs, u32 pat, u32 val)
> +{
> + u32 nc_addr;
> + u32 *c_addr;
> + int i;
> +
> + for (nc_addr = 0xa0000000;
> + nc_addr < (0xa0000000 + DRAM_BUTTOM - NUM_OF_CACHELINE * 32);
> + nc_addr += (DRAM_BUTTOM >> 6) + offs) {
> + writel(0x00007474, MT76XX_MEMCTRL_BASE + 0x64);
> + wmb(); /* Make sure store if finished */
> +
> + c_addr = (u32 *)(nc_addr & 0xdfffffff);
> + cal_memset(((u8 *)c_addr), 0x1F, NUM_OF_CACHELINE * 32);
> + cal_patgen(nc_addr, NUM_OF_CACHELINE * 8, pat);
> +
> + if (dqs > 0)
> + writel(0x00000074 |
> + (((k == 1) ? coarse_dqs[dqs] : test_dqs) << 12) |
> + (((k == 0) ? val : test_dqs) << 8),
> + MT76XX_MEMCTRL_BASE + 0x64);
> + else
> + writel(0x00007400 |
> + (((k == 1) ? coarse_dqs[dqs] : test_dqs) << 4) |
> + (((k == 0) ? val : test_dqs) << 0),
> + MT76XX_MEMCTRL_BASE + 0x64);
> + wmb(); /* Make sure store if finished */
> +
> + invalidate_dcache_range((u32)c_addr,
> + (u32)c_addr +
> + NUM_OF_CACHELINE * 32);
> + wmb(); /* Make sure store if finished */
> +
> + for (i = 0; i < NUM_OF_CACHELINE * 8; i++) {
> + if (i % 8 == 0)
> + pref_op(0, &c_addr[i]);
> + }
> +
> + for (i = 0; i < NUM_OF_CACHELINE * 8; i++) {
> + if (c_addr[i] != nc_addr + i + pat)
> + return -1;
> + }
> + }
> +
> + return 0;
> +}
> +
> +void ddr_calibrate(void)
> +{
> + u32 min_coarse_dqs[2];
> + u32 max_coarse_dqs[2];
> + u32 min_fine_dqs[2];
> + u32 max_fine_dqs[2];
> + u32 coarse_dqs[2];
> + u32 fine_dqs[2];
> + int reg = 0, ddr_cfg2_reg;
> + int flag;
> + int i, k;
> + int dqs = 0;
> + u32 min_coarse_dqs_bnd, min_fine_dqs_bnd, coarse_dqs_dll, fine_dqs_dll;
> + u32 val;
> + u32 fdiv = 0, frac = 0;
> +
> + /* Setup clock to run at full speed */
> + val = readl(MT76XX_DYN_CFG0_REG);
> + fdiv = (u32)((val >> 8) & 0x0F);
> + if (CPU_FRAC_DIV < 1 || CPU_FRAC_DIV > 10)
> + frac = val & 0x0f;
> + else
> + frac = CPU_FRAC_DIV;
> +
> + while (frac < fdiv) {
> + val = readl(MT76XX_DYN_CFG0_REG);
> + fdiv = (val >> 8) & 0x0f;
> + fdiv--;
> + val &= ~(0x0f << 8);
> + val |= (fdiv << 8);
> + writel(val, MT76XX_DYN_CFG0_REG);
> + udelay(500);
> + val = readl(MT76XX_DYN_CFG0_REG);
> + fdiv = (val >> 8) & 0x0f;
> + }
> +
> + clrbits_le32(MT76XX_MEMCTRL_BASE + 0x10, BIT(4));
> + ddr_cfg2_reg = readl(MT76XX_MEMCTRL_BASE + 0x48);
> + clrbits_le32(MT76XX_MEMCTRL_BASE + 0x48, (0x3 << 28) | (0x3 << 26));
> +
> + min_coarse_dqs[0] = MIN_START;
> + min_coarse_dqs[1] = MIN_START;
> + min_fine_dqs[0] = MIN_FINE_START;
> + min_fine_dqs[1] = MIN_FINE_START;
> + max_coarse_dqs[0] = MAX_START;
> + max_coarse_dqs[1] = MAX_START;
> + max_fine_dqs[0] = MAX_FINE_START;
> + max_fine_dqs[1] = MAX_FINE_START;
> + dqs = 0;
> +
> + /* Add by KP, DQS MIN boundary */
> + reg = readl(MT76XX_MEMCTRL_BASE + 0x20);
> + coarse_dqs_dll = (reg & 0xf00) >> 8;
> + fine_dqs_dll = (reg & 0xf0) >> 4;
> + if (coarse_dqs_dll <= 8)
> + min_coarse_dqs_bnd = 8 - coarse_dqs_dll;
> + else
> + min_coarse_dqs_bnd = 0;
> +
> + if (fine_dqs_dll <= 8)
> + min_fine_dqs_bnd = 8 - fine_dqs_dll;
> + else
> + min_fine_dqs_bnd = 0;
> + /* DQS MIN boundary */
> +
> +DQS_CAL:
> +
> + for (k = 0; k < 2; k++) {
> + u32 test_dqs;
> +
> + if (k == 0)
> + test_dqs = MAX_START;
> + else
> + test_dqs = MAX_FINE_START;
> +
> + do {
> + flag = test_loop(k, dqs, test_dqs, max_coarse_dqs,
> + 0x400, 0x3, 0xf);
> + if (flag == -1)
> + break;
> +
> + test_dqs++;
> + } while (test_dqs <= 0xf);
> +
> + if (k == 0) {
> + max_coarse_dqs[dqs] = test_dqs;
> + } else {
> + test_dqs--;
> +
> + if (test_dqs == MAX_FINE_START - 1) {
> + max_coarse_dqs[dqs]--;
> + max_fine_dqs[dqs] = 0xf;
> + } else {
> + max_fine_dqs[dqs] = test_dqs;
> + }
> + }
> + }
> +
> + for (k = 0; k < 2; k++) {
> + u32 test_dqs;
> +
> + if (k == 0)
> + test_dqs = MIN_START;
> + else
> + test_dqs = MIN_FINE_START;
> +
> + do {
> + flag = test_loop(k, dqs, test_dqs, min_coarse_dqs,
> + 0x480, 0x1, 0x0);
> + if (k == 0) {
> + if (flag == -1 ||
> + test_dqs == min_coarse_dqs_bnd)
> + break;
> +
> + test_dqs--;
> +
> + if (test_dqs < min_coarse_dqs_bnd)
> + break;
> + } else {
> + if (flag == -1) {
> + test_dqs++;
> + break;
> + } else if (test_dqs == min_fine_dqs_bnd) {
> + break;
> + }
> +
> + test_dqs--;
> +
> + if (test_dqs < min_fine_dqs_bnd)
> + break;
> + }
> + } while (test_dqs >= 0);
> +
> + if (k == 0) {
> + min_coarse_dqs[dqs] = test_dqs;
> + } else {
> + if (test_dqs == MIN_FINE_START + 1) {
> + min_coarse_dqs[dqs]++;
> + min_fine_dqs[dqs] = 0x0;
> + } else {
> + min_fine_dqs[dqs] = test_dqs;
> + }
> + }
> + }
> +
> + if (dqs == 0) {
> + dqs = 1;
> + goto DQS_CAL;
> + }
> +
> + for (i = 0; i < 2; i++) {
> + u32 temp;
> +
> + coarse_dqs[i] = (max_coarse_dqs[i] + min_coarse_dqs[i]) >> 1;
> + temp =
> + (((max_coarse_dqs[i] + min_coarse_dqs[i]) % 2) * 4) +
> + ((max_fine_dqs[i] + min_fine_dqs[i]) >> 1);
> + if (temp >= 0x10) {
> + coarse_dqs[i]++;
> + fine_dqs[i] = (temp - 0x10) + 0x8;
> + } else {
> + fine_dqs[i] = temp;
> + }
> + }
> + reg = (coarse_dqs[1] << 12) | (fine_dqs[1] << 8) |
> + (coarse_dqs[0] << 4) | fine_dqs[0];
> +
> + clrbits_le32(MT76XX_MEMCTRL_BASE + 0x10, BIT(4));
> + writel(reg, MT76XX_MEMCTRL_BASE + 0x64);
> + writel(ddr_cfg2_reg, MT76XX_MEMCTRL_BASE + 0x48);
> + setbits_le32(MT76XX_MEMCTRL_BASE + 0x10, BIT(4));
> +
> + for (i = 0; i < 2; i++)
> + debug("[%02X%02X%02X%02X]", min_coarse_dqs[i],
> + min_fine_dqs[i], max_coarse_dqs[i], max_fine_dqs[i]);
> + debug("\nDDR Calibration DQS reg = %08X\n", reg);
> +}
> diff --git a/arch/mips/mach-mt7620/lowlevel_init.S b/arch/mips/mach-mt7620/lowlevel_init.S
> new file mode 100644
> index 0000000000..92b2fcd2bb
> --- /dev/null
> +++ b/arch/mips/mach-mt7620/lowlevel_init.S
> @@ -0,0 +1,337 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +/*
> + * (c) 2018 Stefan Roese <sr@denx.de>
> + *
> + * This code is mostly based on the code extracted from this MediaTek
> + * github repository:
> + *
> + * https://github.com/MediaTek-Labs/linkit-smart-uboot.git
> + *
> + * I was not able to find a specific license or other developers
> + * copyrights here, so I can't add them here.
> + */
> +
> +#include <config.h>
> +#include <asm/regdef.h>
> +#include <asm/mipsregs.h>
> +#include <asm/asm.h>
> +#include "mt76xx.h"
> +
> +#ifndef BIT
> +#define BIT(nr) (1 << (nr))
> +#endif
> +
> +#define DELAY_USEC(us) ((us) / 100)
> +
> +#define DDR_CFG1_CHIP_WIDTH_MASK (0x3 << 16)
> +#define DDR_CFG1_BUS_WIDTH_MASK (0x3 << 12)
> +
> +#if defined(CONFIG_ONBOARD_DDR2_SIZE_256MBIT)
> +#define DDR_CFG1_SIZE_VAL 0x222e2323
> +#define DDR_CFG4_SIZE_VAL 7
> +#endif
> +#if defined(CONFIG_ONBOARD_DDR2_SIZE_512MBIT)
> +#define DDR_CFG1_SIZE_VAL 0x22322323
> +#define DDR_CFG4_SIZE_VAL 9
> +#endif
> +#if defined(CONFIG_ONBOARD_DDR2_SIZE_1024MBIT)
> +#define DDR_CFG1_SIZE_VAL 0x22362323
> +#define DDR_CFG4_SIZE_VAL 9
> +#endif
> +#if defined(CONFIG_ONBOARD_DDR2_SIZE_2048MBIT)
> +#define DDR_CFG1_SIZE_VAL 0x223a2323
> +#define DDR_CFG4_SIZE_VAL 9
> +#endif
> +
> +#if defined(CONFIG_ONBOARD_DDR2_CHIP_WIDTH_8BIT)
> +#define DDR_CFG1_CHIP_WIDTH_VAL (0x1 << 16)
> +#endif
> +#if defined(CONFIG_ONBOARD_DDR2_CHIP_WIDTH_16BIT)
> +#define DDR_CFG1_CHIP_WIDTH_VAL (0x2 << 16)
> +#endif
> +
> +#if defined(CONFIG_ONBOARD_DDR2_BUS_WIDTH_16BIT)
> +#define DDR_CFG1_BUS_WIDTH_VAL (0x2 << 12)
> +#endif
> +#if defined(CONFIG_ONBOARD_DDR2_BUS_WIDTH_32BIT)
> +#define DDR_CFG1_BUS_WIDTH_VAL (0x3 << 12)
> +#endif
> +
the code looks like it was written for ".set noreorder" so maybe this
needs to set
> +LEAF(lowlevel_init)
> + /* polling CPLL is ready */
> + li t1, DELAY_USEC(1000000)
> + la t5, MT76XX_ROM_STATUS_REG
> +1:
> + lw t2, 0(t5)
> + andi t2, t2, 0x1
> + bnez t2, CPLL_READY
> + subu t1, t1, 1
> + bgtz t1, 1b
> + nop
> + la t0, MT76XX_CLKCFG0_REG
> + lw t3, 0(t0)
> + ori t3, t3, 0x1
> + sw t3, 0(t0)
> + j CPLL_DONE
to jump to labels, the branch instruction "b" should be used
> + nop
> +CPLL_READY:
> + la t0, MT76XX_CLKCFG0_REG
> + lw t1, 0(t0)
> + li t2, ~0x0c
> + and t1, t1, t2
> + ori t1, t1, 0xc
> + sw t1, 0(t0)
> + la t0, MT76XX_DYN_CFG0_REG
> + lw t3, 0(t0)
> + li t5, ~((0x0f << 8) | (0x0f << 0))
> + and t3, t3, t5
> + li t5, (10 << 8) | (1 << 0)
> + or t3, t3, t5
> + sw t3, 0(t0)
> + la t0, MT76XX_CLKCFG0_REG
> + lw t3, 0(t0)
> + li t4, ~0x0F
> + and t3, t3, t4
> + ori t3, t3, 0xc
> + sw t3, 0(t0)
> + lw t3, 0(t0)
> + ori t3, t3, 0x08
> + sw t3, 0(t0)
> +
> +CPLL_DONE:
> + /*
> + * SDR and DDR initialization: delay 200us
> + */
> + li t0, DELAY_USEC(200 + 40)
> + li t1, 0x1
> +1:
> + sub t0, t0, t1
> + bnez t0, 1b
> + nop
> +
> + /* set DRAM IO PAD for MT7628IC */
> + /* DDR LDO Enable */
> + li t1, MT76XX_RGCTRL_BASE+0x100
> + lw t4, 0(t1)
> + li t2, BIT(31)
> + or t4, t4, t2
> + sw t4, 0(t1)
> + li t1, MT76XX_RGCTRL_BASE+0x10c
> + lw t4, 0(t1)
> + j LDO_1P8V
> + nop
> +LDO_1P8V:
> + li t2, ~BIT(6)
> + and t4, t4, t2
> + li t1, MT76XX_RGCTRL_BASE+0x10c
> + sw t4, 0(t1)
> + j DDRLDO_SOFT_START
> +LDO_2P5V:
> + /* suppose external DDR1 LDO 2.5V */
> + li t2, BIT(6)
> + or t4, t4, t2
> + li t1, MT76XX_RGCTRL_BASE+0x10c
> + sw t4, 0(t1)
> +
> +DDRLDO_SOFT_START:
> + li t1, MT76XX_RGCTRL_BASE+0x10c
> + lw t2, 0(t1)
> + li t3, BIT(16)
> + or t2, t2, t3
> + sw t2, 0(t1)
> + li t3, DELAY_USEC(250*50)
> +LDO_DELAY:
> + subu t3, t3, 1
> + bnez t3, LDO_DELAY
> + nop
> +
> + li t1, MT76XX_RGCTRL_BASE+0x10c
> + lw t2, 0(t1)
> + li t3, BIT(18)
> + or t2, t2, t3
> + sw t2, 0(t1)
> +
> +SET_RG_BUCK_FPWM:
> + li t1, MT76XX_RGCTRL_BASE+0x104
> + lw t2, 0(t1)
> + ori t2, t2, BIT(10)
> + sw t2, 0(t1)
> +
> +DDR_PAD_CFG:
> + /* clean CLK PAD */
> + li t1, MT76XX_RGCTRL_BASE+0x704
> + lw t2, 0(t1)
> + li t8, 0xfffff0f0
> + and t2, t2, t8
> + /* clean CMD PAD */
> + li t1, MT76XX_RGCTRL_BASE+0x70c
> + lw t3, 0(t1)
> + li t8, 0xfffff0f0
> + and t3, t3, t8
> + /* clean DQ IPAD */
> + li t1, MT76XX_RGCTRL_BASE+0x710
> + lw t4, 0(t1)
> + li t8, 0xfffff8ff
> + and t4, t4, t8
> + /* clean DQ OPAD */
> + li t1, MT76XX_RGCTRL_BASE+0x714
> + lw t5, 0(t1)
> + li t8, 0xfffff0f0
> + and t5, t5, t8
> + /* clean DQS IPAD */
> + li t1, MT76XX_RGCTRL_BASE+0x718
> + lw t6, 0(t1)
> + li t8, 0xfffff8ff
> + and t6, t6, t8
> + /* clean DQS OPAD */
> + li t1, MT76XX_RGCTRL_BASE+0x71c
> + lw t7, 0(t1)
> + li t8, 0xfffff0f0
> + and t7, t7, t8
> +
> + li t1, MT76XX_SYSCTL_BASE+0xC
> + lw t9, 0(t1)
> + srl t9, t9, 16
> + andi t9, t9, 0x1
> + bnez t9, MT7628_AN_DDR1_PAD
> +MT7628_KN_PAD:
> + li t8, 0x00000303
> + or t2, t2, t8
> + or t3, t3, t8
> + or t5, t5, t8
> + or t7, t7, t8
> + li t8, 0x00000000
> + or t4, t4, t8
> + or t6, t6, t8
> + j SET_PAD_CFG
> +MT7628_AN_DDR1_PAD:
> + li t1, MT76XX_SYSCTL_BASE+0x10
> + lw t1, 0(t1)
> + andi t1, t1, 0x1
> + beqz t1, MT7628_AN_DDR2_PAD
> + li t8, 0x00000c0c
> + or t2, t2, t8
> + li t8, 0x00000202
> + or t3, t3, t8
> + li t8, 0x00000707
> + or t5, t5, t8
> + li t8, 0x00000c0c
> + or t7, t7, t8
> + li t8, 0x00000000
> + or t4, t4, t8
> + or t6, t6, t8
> + j SET_PAD_CFG
> +MT7628_AN_DDR2_PAD:
> + li t8, 0x00000c0c
> + or t2, t2, t8
> + li t8, 0x00000202
> + or t3, t3, t8
> + li t8, 0x00000404
> + or t5, t5, t8
> + li t8, 0x00000c0c
> + or t7, t7, t8
> + li t8, 0x00000000 /* ODT off */
> + or t4, t4, t8
> + or t6, t6, t8
> +
> +SET_PAD_CFG:
> + li t1, MT76XX_RGCTRL_BASE+0x704
> + sw t2, 0(t1)
> + li t1, MT76XX_RGCTRL_BASE+0x70c
> + sw t3, 0(t1)
> + li t1, MT76XX_RGCTRL_BASE+0x710
> + sw t4, 0(t1)
> + li t1, MT76XX_RGCTRL_BASE+0x714
> + sw t5, 0(t1)
> + li t1, MT76XX_RGCTRL_BASE+0x718
> + sw t6, 0(t1)
> + li t1, MT76XX_RGCTRL_BASE+0x71c
> + sw t7, 0(t1)
this pattern with always loading the register address and
loading/storing with offset 0 is bad style and inefficient and repeated
all over the function. This snippet could be rewritten as:
li t1, MT76XX_RGCTRL_BASE
sw t2, 0x704(t1)
sw t3, 0x70c(t1)
sw t4, 0x710(t1)
sw t5, 0x714(t1)
sw t6, 0x718(t1)
sw t7, 0x71c(t1)
I suggest that you define all base addresses as physical address and do
this once at the beginning of the function (physical address remapped to
uncached register space in KSEG1):
li s0, CKSEG1ADDR(MT76XX_SYSCTL_BASE)
li s1, CKSEG1ADDR(MT76XX_MEMCTRL_BASE)
li s2, CKSEG1ADDR(MT76XX_RGCTRL_BASE)
and then do all loads and stores like this (from the snippet above):
sw t2, 0x704(s2)
sw t3, 0x70c(s2)
sw t4, 0x710(s2)
sw t5, 0x714(s2)
sw t6, 0x718(s2)
sw t7, 0x71c(s2)
> +
> + /*
> + * DDR initialization: reset pin to 0
> + */
> + li t1, MT76XX_SYSCTL_BASE + 0x34
> + lw t2, 0(t1)
> + and t2, ~BIT(10)
> + sw t2, 0(t1)
> + nop
> +
> + /*
> + * DDR initialization: wait til reg DDR_CFG1 bit 21 equal to 1 (ready)
> + */
> +DDR_READY:
> + li t1, DDR_CFG1_REG
> + lw t0, 0(t1)
> + nop
> + and t2, t0, BIT(21)
> + beqz t2, DDR_READY
> + nop
> +
> + /*
> + * DDR initialization
> + *
> + * Only DDR2 supported right now. DDR2 support can be added, once
> + * boards using it will get added to mainline U-Boot.
> + */
> + li t1, DDR_CFG2_REG
> + lw t0, 0(t1)
> + nop
> + and t0, ~BIT(30)
> + and t0, ~(7 << 4)
> + or t0, (4 << 4)
> + or t0, BIT(30)
> + or t0, BIT(11)
> + sw t0, 0(t1)
> + nop
> +
> + li t1, DDR_CFG3_REG
> + lw t2, 0(t1)
> + /* Disable ODT; reference board ok, ev board fail */
> + and t2, ~BIT(6)
> + or t2, BIT(2)
> + li t0, DDR_CFG4_REG
> + lw t1, 0(t0)
> + li t2, ~(0x01f | 0x0f0)
> + and t1, t1, t2
> + ori t1, t1, DDR_CFG4_SIZE_VAL
> + sw t1, 0(t0)
> + nop
> +
> + /*
> + * DDR initialization: config size and width on reg DDR_CFG1
> + */
> + li t6, DDR_CFG1_SIZE_VAL
> +
> + and t6, ~DDR_CFG1_CHIP_WIDTH_MASK
> + or t6, DDR_CFG1_CHIP_WIDTH_VAL
> +
> + /* CONFIG DDR_CFG1[13:12] about TOTAL WIDTH */
> + and t6, ~DDR_CFG1_BUS_WIDTH_MASK
> + or t6, DDR_CFG1_BUS_WIDTH_VAL
> +
> + li t5, DDR_CFG1_REG
> + sw t6, 0(t5)
> + nop
> +
> + /*
> + * DDR: enable self auto refresh for power saving
> + * enable it by default for both RAM and ROM version (for CoC)
> + */
> + li t0, MT76XX_MEMCTRL_BASE + 0x14
> + lw t1, 0(t0)
> + nop
> + and t1, 0xff000000
> + or t1, 0x01
> + sw t1, 0(t0)
> + nop
> + li t0, MT76XX_MEMCTRL_BASE + 0x10
> + lw t1, 0(t0)
> + nop
> + or t1, 0x10
> + sw t1, 0(t0)
> + nop
> +
> + jr ra
> + nop
> + END(lowlevel_init)
> diff --git a/arch/mips/mach-mt7620/mt76xx.h b/arch/mips/mach-mt7620/mt76xx.h
> new file mode 100644
> index 0000000000..fb3d4582bf
> --- /dev/null
> +++ b/arch/mips/mach-mt7620/mt76xx.h
> @@ -0,0 +1,38 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +/*
> + * Copyright (C) 2018 Stefan Roese <sr@denx.de>
> + */
> +
> +#ifndef __MT76XX_H
> +#define __MT76XX_H
> +
> +#ifdef __ASSEMBLY__
> +#define VOID_PTR
> +#else
> +#define VOID_PTR (void *)
> +#endif
> +
> +#define MT76XX_SYSCTL_BASE 0xb0000000
> +
> +#define MT76XX_CHIPID_OFFS 0x00
> +#define MT76XX_CHIP_REV_ID_OFFS 0x0c
> +#define MT76XX_SYSCFG0_OFFS 0x10
> +
> +#define MT76XX_MEMCTRL_BASE (VOID_PTR(MT76XX_SYSCTL_BASE + 0x0300))
> +#define MT76XX_RGCTRL_BASE (VOID_PTR(MT76XX_SYSCTL_BASE + 0x1000))
with the comment above this should be reduced to:
#define MT76XX_SYSCTL_BASE 0x10000000
#define MT76XX_MEMCTRL_BASE (MT76XX_SYSCTL_BASE + 0x0300)
#define MT76XX_RGCTRL_BASE (MT76XX_SYSCTL_BASE + 0x1000)
> +
> +#define MT76XX_ROM_STATUS_REG (VOID_PTR(MT76XX_SYSCTL_BASE + 0x0028))
> +#define MT76XX_CLKCFG0_REG (VOID_PTR(MT76XX_SYSCTL_BASE + 0x002c))
> +#define MT76XX_DYN_CFG0_REG (VOID_PTR(MT76XX_SYSCTL_BASE + 0x0440))
> +
> +#define DDR_CFG1_REG (MT76XX_MEMCTRL_BASE + 0x44)
> +#define DDR_CFG2_REG (MT76XX_MEMCTRL_BASE + 0x48)
> +#define DDR_CFG3_REG (MT76XX_MEMCTRL_BASE + 0x4c)
> +#define DDR_CFG4_REG (MT76XX_MEMCTRL_BASE + 0x50)
> +
> +#ifndef __ASSEMBLY__
> +/* Prototypes */
> +void ddr_calibrate(void);
> +#endif
> +
> +#endif
>
--
- Daniel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20180816/f3dd5261/attachment.sig>
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2018-08-15 23:09 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-08-10 7:48 [U-Boot] [PATCH 1/5 v2] mips: Add basic MediaTek MT7620/88 support Stefan Roese
2018-08-10 7:48 ` [U-Boot] [PATCH 2/5 v2] mips: Add arch/mips/include/asm/atomic.h Stefan Roese
2018-08-10 7:48 ` [U-Boot] [PATCH 3/5 v2] mips: Add LinkIt Smart 7688 support Stefan Roese
2018-08-15 14:30 ` Daniel Schwierzeck
2018-08-15 14:35 ` Stefan Roese
2018-08-15 22:34 ` Daniel Schwierzeck
2018-08-10 7:48 ` [U-Boot] [PATCH 4/5 v2] mips: Add Gardena Smart-Gateway board support Stefan Roese
2018-08-15 14:36 ` Daniel Schwierzeck
2018-08-15 14:39 ` Stefan Roese
2018-08-10 7:48 ` [U-Boot] [PATCH 5/5 v2] mips: mt76xx: Add sysreset support Stefan Roese
2018-08-15 23:09 ` [U-Boot] [PATCH 1/5 v2] mips: Add basic MediaTek MT7620/88 support Daniel Schwierzeck
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.