All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH v2 00/20] Add Intel Arria 10 SoC support
@ 2017-03-09  0:26 Ley Foon Tan
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 01/20] arm: socfpga: Restructure clock manager driver Ley Foon Tan
                   ` (21 more replies)
  0 siblings, 22 replies; 60+ messages in thread
From: Ley Foon Tan @ 2017-03-09  0:26 UTC (permalink / raw)
  To: u-boot

This is the 2nd version of patchset to adds support for Intel Arria 10 SoC.
This version mainly resolved comments from Marek in [v1].

This is initial patchset enables the basic support for Arria 10 and other
features will come after this.

This series is working on top of “arm: socfpga: Move to using distro boot”
series [1] from Dalon Westergreen.

[1]: https://www.mail-archive.com/u-boot at lists.denx.de/msg239560.html

v1 -> v2 changes:
-----------------
- Changed to use wait_for_bit() for status polling
- Sorted #ifdef in GEN5 then ARRIA10 order.
- Removed the keyword "register" and "volatile"
- Changed to use errno.h error code
- Dropped "drivers: Makefile: include fpga build in SPL" patch
- A10 reset driver
	- Combined reset_assert_uart() & reset_deassert_uart()
	- Moved reset_uart to later patch
- A10 clock driver
	- Moved clock driver GEN5 update to new patch
	- Changed global clock variables to static
	- Moved cm_print_clock_quick_summary() to Gen5 and Arria 10
- Resolved warnings and errors from checkpatch.pl.

Patchset history
----------------
[v1]: https://www.mail-archive.com/u-boot at lists.denx.de/msg240052.html

Ley Foon Tan (20):
  arm: socfpga: Restructure clock manager driver
  arm: socfpga: Update clock for Gen5
  arm: socfpga: Restructure reset manager driver
  arm: socfpga: Restructure misc driver
  arm: socfpga: Restructure system manager
  arm: socfpga: Add A10 defines
  arm: socfpga: Add reset driver support for Arria 10
  arm: socfpga: Add clock driver for Arria 10
  arm: socfpga: Add system manager for Arria 10
  arm: socfpga: Add sdram header file for Arria 10
  arm: socfpga: Add misc support for Arria 10
  arm: socfpga: Add pinmux for Arria 10
  fdt: Add compatible strings for Arria 10
  arm: dts: Add dts and dtsi for Arria 10
  arm: socfpga: Add SPL support for Arria 10
  drivers: fpga: Add compile switch for Gen5 only registers
  arm: socfpga: Convert Altera ddr driver to use Kconfig
  arm: socfpga: Add config and defconfig for Arria 10
  arm: socfpga: Add board files for the Arria10
  arm: socfpga: Enable build for Arria 10

 arch/arm/dts/Makefile                              |    1 +
 arch/arm/dts/socfpga_arria10.dtsi                  |  859 +++++++++++++++
 arch/arm/dts/socfpga_arria10_socdk_sdmmc.dts       |   30 +
 .../dts/socfpga_arria10_socdk_sdmmc_handoff.dtsi   |  479 +++++++++
 arch/arm/mach-socfpga/Kconfig                      |   10 +
 arch/arm/mach-socfpga/Makefile                     |   41 +-
 arch/arm/mach-socfpga/clock_manager.c              |  526 +---------
 arch/arm/mach-socfpga/clock_manager_arria10.c      | 1104 ++++++++++++++++++++
 arch/arm/mach-socfpga/clock_manager_gen5.c         |  536 ++++++++++
 arch/arm/mach-socfpga/include/mach/base_addr_a10.h |    8 +-
 arch/arm/mach-socfpga/include/mach/clock_manager.h |  314 +-----
 .../include/mach/clock_manager_arria10.h           |  222 ++++
 .../mach-socfpga/include/mach/clock_manager_gen5.h |  322 ++++++
 arch/arm/mach-socfpga/include/mach/misc.h          |   32 +
 arch/arm/mach-socfpga/include/mach/pinmux.h        |   15 +
 arch/arm/mach-socfpga/include/mach/reset_manager.h |   44 +-
 .../include/mach/reset_manager_arria10.h           |  144 +++
 .../mach-socfpga/include/mach/reset_manager_gen5.h |   47 +
 arch/arm/mach-socfpga/include/mach/sdram_arria10.h |  380 +++++++
 .../arm/mach-socfpga/include/mach/system_manager.h |  177 ++--
 .../include/mach/system_manager_arria10.h          |   81 ++
 .../include/mach/system_manager_gen5.h             |  122 +++
 arch/arm/mach-socfpga/misc.c                       |  361 +------
 arch/arm/mach-socfpga/misc_arria10.c               |  254 +++++
 arch/arm/mach-socfpga/misc_gen5.c                  |  356 +++++++
 arch/arm/mach-socfpga/pinmux_arria10.c             |   96 ++
 arch/arm/mach-socfpga/reset_manager.c              |   93 +-
 arch/arm/mach-socfpga/reset_manager_arria10.c      |  380 +++++++
 arch/arm/mach-socfpga/reset_manager_gen5.c         |  113 ++
 arch/arm/mach-socfpga/spl.c                        |   55 +-
 arch/arm/mach-socfpga/system_manager.c             |   85 --
 arch/arm/mach-socfpga/system_manager_gen5.c        |   85 ++
 board/altera/arria10-socdk/Kconfig                 |   18 +
 board/altera/arria10-socdk/Makefile                |    7 +
 board/altera/arria10-socdk/socfpga.c               |    7 +
 configs/socfpga_arria10_defconfig                  |   30 +
 drivers/Kconfig                                    |    2 +
 drivers/ddr/Kconfig                                |    1 +
 drivers/ddr/altera/Kconfig                         |    6 +
 drivers/fpga/socfpga.c                             |    6 +
 include/configs/socfpga_arria10_socdk.h            |   67 ++
 include/configs/socfpga_common.h                   |   33 +-
 include/dt-bindings/reset/altr,rst-mgr-a10.h       |  103 ++
 include/fdtdec.h                                   |    8 +
 lib/fdtdec.c                                       |    8 +
 45 files changed, 6163 insertions(+), 1505 deletions(-)
 create mode 100644 arch/arm/dts/socfpga_arria10.dtsi
 create mode 100644 arch/arm/dts/socfpga_arria10_socdk_sdmmc.dts
 create mode 100644 arch/arm/dts/socfpga_arria10_socdk_sdmmc_handoff.dtsi
 create mode 100644 arch/arm/mach-socfpga/clock_manager_arria10.c
 create mode 100644 arch/arm/mach-socfpga/clock_manager_gen5.c
 create mode 100644 arch/arm/mach-socfpga/include/mach/clock_manager_arria10.h
 create mode 100644 arch/arm/mach-socfpga/include/mach/clock_manager_gen5.h
 create mode 100644 arch/arm/mach-socfpga/include/mach/misc.h
 create mode 100644 arch/arm/mach-socfpga/include/mach/pinmux.h
 create mode 100644 arch/arm/mach-socfpga/include/mach/reset_manager_arria10.h
 create mode 100644 arch/arm/mach-socfpga/include/mach/reset_manager_gen5.h
 create mode 100644 arch/arm/mach-socfpga/include/mach/sdram_arria10.h
 create mode 100644 arch/arm/mach-socfpga/include/mach/system_manager_arria10.h
 create mode 100644 arch/arm/mach-socfpga/include/mach/system_manager_gen5.h
 create mode 100644 arch/arm/mach-socfpga/misc_arria10.c
 create mode 100644 arch/arm/mach-socfpga/misc_gen5.c
 create mode 100644 arch/arm/mach-socfpga/pinmux_arria10.c
 create mode 100644 arch/arm/mach-socfpga/reset_manager_arria10.c
 create mode 100644 arch/arm/mach-socfpga/reset_manager_gen5.c
 delete mode 100644 arch/arm/mach-socfpga/system_manager.c
 create mode 100644 arch/arm/mach-socfpga/system_manager_gen5.c
 create mode 100644 board/altera/arria10-socdk/Kconfig
 create mode 100644 board/altera/arria10-socdk/Makefile
 create mode 100644 board/altera/arria10-socdk/socfpga.c
 create mode 100644 configs/socfpga_arria10_defconfig
 create mode 100644 drivers/ddr/Kconfig
 create mode 100644 drivers/ddr/altera/Kconfig
 create mode 100644 include/configs/socfpga_arria10_socdk.h
 create mode 100644 include/dt-bindings/reset/altr,rst-mgr-a10.h

-- 
1.8.2.3

^ permalink raw reply	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 01/20] arm: socfpga: Restructure clock manager driver
  2017-03-09  0:26 [U-Boot] [PATCH v2 00/20] Add Intel Arria 10 SoC support Ley Foon Tan
@ 2017-03-09  0:26 ` Ley Foon Tan
  2017-03-09 16:29   ` Dinh Nguyen
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 02/20] arm: socfpga: Update clock for Gen5 Ley Foon Tan
                   ` (20 subsequent siblings)
  21 siblings, 1 reply; 60+ messages in thread
From: Ley Foon Tan @ 2017-03-09  0:26 UTC (permalink / raw)
  To: u-boot

Restructure clock manager driver in the preparation to support A10.
Move the Gen5 specific code to _gen5 files. No functional change.

Change all uint32_t to u32 and change to use macro BIT(n) for bit shift.

Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
---
 arch/arm/mach-socfpga/Makefile                     |   3 +-
 arch/arm/mach-socfpga/clock_manager.c              | 510 +--------------------
 arch/arm/mach-socfpga/clock_manager_gen5.c         | 510 +++++++++++++++++++++
 arch/arm/mach-socfpga/include/mach/clock_manager.h | 312 +------------
 .../mach-socfpga/include/mach/clock_manager_gen5.h | 322 +++++++++++++
 5 files changed, 846 insertions(+), 811 deletions(-)
 create mode 100644 arch/arm/mach-socfpga/clock_manager_gen5.c
 create mode 100644 arch/arm/mach-socfpga/include/mach/clock_manager_gen5.h

diff --git a/arch/arm/mach-socfpga/Makefile b/arch/arm/mach-socfpga/Makefile
index 809cd47..b76de4c 100644
--- a/arch/arm/mach-socfpga/Makefile
+++ b/arch/arm/mach-socfpga/Makefile
@@ -13,7 +13,8 @@ obj-y	+= misc.o timer.o reset_manager.o system_manager.o clock_manager.o \
 obj-$(CONFIG_SPL_BUILD) += spl.o freeze_controller.o
 
 # QTS-generated config file wrappers
-obj-$(CONFIG_TARGET_SOCFPGA_GEN5)	+= scan_manager.o wrap_pll_config.o
+obj-$(CONFIG_TARGET_SOCFPGA_GEN5)	+= scan_manager.o wrap_pll_config.o \
+					   clock_manager_gen5.o
 obj-$(CONFIG_SPL_BUILD) += wrap_iocsr_config.o wrap_pinmux_config.o	\
 			   wrap_sdram_config.o
 CFLAGS_wrap_iocsr_config.o	+= -I$(srctree)/board/$(BOARDDIR)
diff --git a/arch/arm/mach-socfpga/clock_manager.c b/arch/arm/mach-socfpga/clock_manager.c
index 29e18f8..c2af6f3 100644
--- a/arch/arm/mach-socfpga/clock_manager.c
+++ b/arch/arm/mach-socfpga/clock_manager.c
@@ -1,5 +1,5 @@
 /*
- *  Copyright (C) 2013 Altera Corporation <www.altera.com>
+ *  Copyright (C) 2013-2017 Altera Corporation <www.altera.com>
  *
  * SPDX-License-Identifier:	GPL-2.0+
  */
@@ -13,10 +13,10 @@ DECLARE_GLOBAL_DATA_PTR;
 static const struct socfpga_clock_manager *clock_manager_base =
 	(struct socfpga_clock_manager *)SOCFPGA_CLKMGR_ADDRESS;
 
-static void cm_wait_for_lock(uint32_t mask)
+void cm_wait_for_lock(u32 mask)
 {
-	register uint32_t inter_val;
-	uint32_t retry = 0;
+	u32 inter_val;
+	u32 retry = 0;
 	do {
 		inter_val = readl(&clock_manager_base->inter) & mask;
 		if (inter_val == mask)
@@ -29,512 +29,12 @@ static void cm_wait_for_lock(uint32_t mask)
 }
 
 /* function to poll in the fsm busy bit */
-static void cm_wait_for_fsm(void)
+void cm_wait_for_fsm(void)
 {
 	while (readl(&clock_manager_base->stat) & CLKMGR_STAT_BUSY)
 		;
 }
 
-/*
- * function to write the bypass register which requires a poll of the
- * busy bit
- */
-static void cm_write_bypass(uint32_t val)
-{
-	writel(val, &clock_manager_base->bypass);
-	cm_wait_for_fsm();
-}
-
-/* function to write the ctrl register which requires a poll of the busy bit */
-static void cm_write_ctrl(uint32_t val)
-{
-	writel(val, &clock_manager_base->ctrl);
-	cm_wait_for_fsm();
-}
-
-/* function to write a clock register that has phase information */
-static void cm_write_with_phase(uint32_t value,
-				uint32_t reg_address, uint32_t mask)
-{
-	/* poll until phase is zero */
-	while (readl(reg_address) & mask)
-		;
-
-	writel(value, reg_address);
-
-	while (readl(reg_address) & mask)
-		;
-}
-
-/*
- * Setup clocks while making no assumptions about previous state of the clocks.
- *
- * Start by being paranoid and gate all sw managed clocks
- * Put all plls in bypass
- * Put all plls VCO registers back to reset value (bandgap power down).
- * Put peripheral and main pll src to reset value to avoid glitch.
- * Delay 5 us.
- * Deassert bandgap power down and set numerator and denominator
- * Start 7 us timer.
- * set internal dividers
- * Wait for 7 us timer.
- * Enable plls
- * Set external dividers while plls are locking
- * Wait for pll lock
- * Assert/deassert outreset all.
- * Take all pll's out of bypass
- * Clear safe mode
- * set source main and peripheral clocks
- * Ungate clocks
- */
-
-void cm_basic_init(const struct cm_config * const cfg)
-{
-	unsigned long end;
-
-	/* Start by being paranoid and gate all sw managed clocks */
-
-	/*
-	 * We need to disable nandclk
-	 * and then do another apb access before disabling
-	 * gatting off the rest of the periperal clocks.
-	 */
-	writel(~CLKMGR_PERPLLGRP_EN_NANDCLK_MASK &
-		readl(&clock_manager_base->per_pll.en),
-		&clock_manager_base->per_pll.en);
-
-	/* DO NOT GATE OFF DEBUG CLOCKS & BRIDGE CLOCKS */
-	writel(CLKMGR_MAINPLLGRP_EN_DBGTIMERCLK_MASK |
-		CLKMGR_MAINPLLGRP_EN_DBGTRACECLK_MASK |
-		CLKMGR_MAINPLLGRP_EN_DBGCLK_MASK |
-		CLKMGR_MAINPLLGRP_EN_DBGATCLK_MASK |
-		CLKMGR_MAINPLLGRP_EN_S2FUSER0CLK_MASK |
-		CLKMGR_MAINPLLGRP_EN_L4MPCLK_MASK,
-		&clock_manager_base->main_pll.en);
-
-	writel(0, &clock_manager_base->sdr_pll.en);
-
-	/* now we can gate off the rest of the peripheral clocks */
-	writel(0, &clock_manager_base->per_pll.en);
-
-	/* Put all plls in bypass */
-	cm_write_bypass(CLKMGR_BYPASS_PERPLL | CLKMGR_BYPASS_SDRPLL |
-			CLKMGR_BYPASS_MAINPLL);
-
-	/* Put all plls VCO registers back to reset value. */
-	writel(CLKMGR_MAINPLLGRP_VCO_RESET_VALUE &
-	       ~CLKMGR_MAINPLLGRP_VCO_REGEXTSEL_MASK,
-	       &clock_manager_base->main_pll.vco);
-	writel(CLKMGR_PERPLLGRP_VCO_RESET_VALUE &
-	       ~CLKMGR_PERPLLGRP_VCO_REGEXTSEL_MASK,
-	       &clock_manager_base->per_pll.vco);
-	writel(CLKMGR_SDRPLLGRP_VCO_RESET_VALUE &
-	       ~CLKMGR_SDRPLLGRP_VCO_REGEXTSEL_MASK,
-	       &clock_manager_base->sdr_pll.vco);
-
-	/*
-	 * The clocks to the flash devices and the L4_MAIN clocks can
-	 * glitch when coming out of safe mode if their source values
-	 * are different from their reset value.  So the trick it to
-	 * put them back to their reset state, and change input
-	 * after exiting safe mode but before ungating the clocks.
-	 */
-	writel(CLKMGR_PERPLLGRP_SRC_RESET_VALUE,
-	       &clock_manager_base->per_pll.src);
-	writel(CLKMGR_MAINPLLGRP_L4SRC_RESET_VALUE,
-	       &clock_manager_base->main_pll.l4src);
-
-	/* read back for the required 5 us delay. */
-	readl(&clock_manager_base->main_pll.vco);
-	readl(&clock_manager_base->per_pll.vco);
-	readl(&clock_manager_base->sdr_pll.vco);
-
-
-	/*
-	 * We made sure bgpwr down was assert for 5 us. Now deassert BG PWR DN
-	 * with numerator and denominator.
-	 */
-	writel(cfg->main_vco_base, &clock_manager_base->main_pll.vco);
-	writel(cfg->peri_vco_base, &clock_manager_base->per_pll.vco);
-	writel(cfg->sdram_vco_base, &clock_manager_base->sdr_pll.vco);
-
-	/*
-	 * Time starts here. Must wait 7 us from
-	 * BGPWRDN_SET(0) to VCO_ENABLE_SET(1).
-	 */
-	end = timer_get_us() + 7;
-
-	/* main mpu */
-	writel(cfg->mpuclk, &clock_manager_base->main_pll.mpuclk);
-
-	/* altera group mpuclk */
-	writel(cfg->altera_grp_mpuclk, &clock_manager_base->altera.mpuclk);
-
-	/* main main clock */
-	writel(cfg->mainclk, &clock_manager_base->main_pll.mainclk);
-
-	/* main for dbg */
-	writel(cfg->dbgatclk, &clock_manager_base->main_pll.dbgatclk);
-
-	/* main for cfgs2fuser0clk */
-	writel(cfg->cfg2fuser0clk,
-	       &clock_manager_base->main_pll.cfgs2fuser0clk);
-
-	/* Peri emac0 50 MHz default to RMII */
-	writel(cfg->emac0clk, &clock_manager_base->per_pll.emac0clk);
-
-	/* Peri emac1 50 MHz default to RMII */
-	writel(cfg->emac1clk, &clock_manager_base->per_pll.emac1clk);
-
-	/* Peri QSPI */
-	writel(cfg->mainqspiclk, &clock_manager_base->main_pll.mainqspiclk);
-
-	writel(cfg->perqspiclk, &clock_manager_base->per_pll.perqspiclk);
-
-	/* Peri pernandsdmmcclk */
-	writel(cfg->mainnandsdmmcclk,
-	       &clock_manager_base->main_pll.mainnandsdmmcclk);
-
-	writel(cfg->pernandsdmmcclk,
-	       &clock_manager_base->per_pll.pernandsdmmcclk);
-
-	/* Peri perbaseclk */
-	writel(cfg->perbaseclk, &clock_manager_base->per_pll.perbaseclk);
-
-	/* Peri s2fuser1clk */
-	writel(cfg->s2fuser1clk, &clock_manager_base->per_pll.s2fuser1clk);
-
-	/* 7 us must have elapsed before we can enable the VCO */
-	while (timer_get_us() < end)
-		;
-
-	/* Enable vco */
-	/* main pll vco */
-	writel(cfg->main_vco_base | CLKMGR_MAINPLLGRP_VCO_EN,
-	       &clock_manager_base->main_pll.vco);
-
-	/* periferal pll */
-	writel(cfg->peri_vco_base | CLKMGR_MAINPLLGRP_VCO_EN,
-	       &clock_manager_base->per_pll.vco);
-
-	/* sdram pll vco */
-	writel(cfg->sdram_vco_base | CLKMGR_MAINPLLGRP_VCO_EN,
-	       &clock_manager_base->sdr_pll.vco);
-
-	/* L3 MP and L3 SP */
-	writel(cfg->maindiv, &clock_manager_base->main_pll.maindiv);
-
-	writel(cfg->dbgdiv, &clock_manager_base->main_pll.dbgdiv);
-
-	writel(cfg->tracediv, &clock_manager_base->main_pll.tracediv);
-
-	/* L4 MP, L4 SP, can0, and can1 */
-	writel(cfg->perdiv, &clock_manager_base->per_pll.div);
-
-	writel(cfg->gpiodiv, &clock_manager_base->per_pll.gpiodiv);
-
-#define LOCKED_MASK \
-	(CLKMGR_INTER_SDRPLLLOCKED_MASK  | \
-	CLKMGR_INTER_PERPLLLOCKED_MASK  | \
-	CLKMGR_INTER_MAINPLLLOCKED_MASK)
-
-	cm_wait_for_lock(LOCKED_MASK);
-
-	/* write the sdram clock counters before toggling outreset all */
-	writel(cfg->ddrdqsclk & CLKMGR_SDRPLLGRP_DDRDQSCLK_CNT_MASK,
-	       &clock_manager_base->sdr_pll.ddrdqsclk);
-
-	writel(cfg->ddr2xdqsclk & CLKMGR_SDRPLLGRP_DDR2XDQSCLK_CNT_MASK,
-	       &clock_manager_base->sdr_pll.ddr2xdqsclk);
-
-	writel(cfg->ddrdqclk & CLKMGR_SDRPLLGRP_DDRDQCLK_CNT_MASK,
-	       &clock_manager_base->sdr_pll.ddrdqclk);
-
-	writel(cfg->s2fuser2clk & CLKMGR_SDRPLLGRP_S2FUSER2CLK_CNT_MASK,
-	       &clock_manager_base->sdr_pll.s2fuser2clk);
-
-	/*
-	 * after locking, but before taking out of bypass
-	 * assert/deassert outresetall
-	 */
-	uint32_t mainvco = readl(&clock_manager_base->main_pll.vco);
-
-	/* assert main outresetall */
-	writel(mainvco | CLKMGR_MAINPLLGRP_VCO_OUTRESETALL_MASK,
-	       &clock_manager_base->main_pll.vco);
-
-	uint32_t periphvco = readl(&clock_manager_base->per_pll.vco);
-
-	/* assert pheriph outresetall */
-	writel(periphvco | CLKMGR_PERPLLGRP_VCO_OUTRESETALL_MASK,
-	       &clock_manager_base->per_pll.vco);
-
-	/* assert sdram outresetall */
-	writel(cfg->sdram_vco_base | CLKMGR_MAINPLLGRP_VCO_EN|
-		CLKMGR_SDRPLLGRP_VCO_OUTRESETALL,
-		&clock_manager_base->sdr_pll.vco);
-
-	/* deassert main outresetall */
-	writel(mainvco & ~CLKMGR_MAINPLLGRP_VCO_OUTRESETALL_MASK,
-	       &clock_manager_base->main_pll.vco);
-
-	/* deassert pheriph outresetall */
-	writel(periphvco & ~CLKMGR_PERPLLGRP_VCO_OUTRESETALL_MASK,
-	       &clock_manager_base->per_pll.vco);
-
-	/* deassert sdram outresetall */
-	writel(cfg->sdram_vco_base | CLKMGR_MAINPLLGRP_VCO_EN,
-	       &clock_manager_base->sdr_pll.vco);
-
-	/*
-	 * now that we've toggled outreset all, all the clocks
-	 * are aligned nicely; so we can change any phase.
-	 */
-	cm_write_with_phase(cfg->ddrdqsclk,
-			    (uint32_t)&clock_manager_base->sdr_pll.ddrdqsclk,
-			    CLKMGR_SDRPLLGRP_DDRDQSCLK_PHASE_MASK);
-
-	/* SDRAM DDR2XDQSCLK */
-	cm_write_with_phase(cfg->ddr2xdqsclk,
-			    (uint32_t)&clock_manager_base->sdr_pll.ddr2xdqsclk,
-			    CLKMGR_SDRPLLGRP_DDR2XDQSCLK_PHASE_MASK);
-
-	cm_write_with_phase(cfg->ddrdqclk,
-			    (uint32_t)&clock_manager_base->sdr_pll.ddrdqclk,
-			    CLKMGR_SDRPLLGRP_DDRDQCLK_PHASE_MASK);
-
-	cm_write_with_phase(cfg->s2fuser2clk,
-			    (uint32_t)&clock_manager_base->sdr_pll.s2fuser2clk,
-			    CLKMGR_SDRPLLGRP_S2FUSER2CLK_PHASE_MASK);
-
-	/* Take all three PLLs out of bypass when safe mode is cleared. */
-	cm_write_bypass(0);
-
-	/* clear safe mode */
-	cm_write_ctrl(readl(&clock_manager_base->ctrl) | CLKMGR_CTRL_SAFEMODE);
-
-	/*
-	 * now that safe mode is clear with clocks gated
-	 * it safe to change the source mux for the flashes the the L4_MAIN
-	 */
-	writel(cfg->persrc, &clock_manager_base->per_pll.src);
-	writel(cfg->l4src, &clock_manager_base->main_pll.l4src);
-
-	/* Now ungate non-hw-managed clocks */
-	writel(~0, &clock_manager_base->main_pll.en);
-	writel(~0, &clock_manager_base->per_pll.en);
-	writel(~0, &clock_manager_base->sdr_pll.en);
-
-	/* Clear the loss of lock bits (write 1 to clear) */
-	writel(CLKMGR_INTER_SDRPLLLOST_MASK | CLKMGR_INTER_PERPLLLOST_MASK |
-	       CLKMGR_INTER_MAINPLLLOST_MASK,
-	       &clock_manager_base->inter);
-}
-
-static unsigned int cm_get_main_vco_clk_hz(void)
-{
-	uint32_t reg, clock;
-
-	/* get the main VCO clock */
-	reg = readl(&clock_manager_base->main_pll.vco);
-	clock = cm_get_osc_clk_hz(1);
-	clock /= ((reg & CLKMGR_MAINPLLGRP_VCO_DENOM_MASK) >>
-		  CLKMGR_MAINPLLGRP_VCO_DENOM_OFFSET) + 1;
-	clock *= ((reg & CLKMGR_MAINPLLGRP_VCO_NUMER_MASK) >>
-		  CLKMGR_MAINPLLGRP_VCO_NUMER_OFFSET) + 1;
-
-	return clock;
-}
-
-static unsigned int cm_get_per_vco_clk_hz(void)
-{
-	uint32_t reg, clock = 0;
-
-	/* identify PER PLL clock source */
-	reg = readl(&clock_manager_base->per_pll.vco);
-	reg = (reg & CLKMGR_PERPLLGRP_VCO_SSRC_MASK) >>
-	      CLKMGR_PERPLLGRP_VCO_SSRC_OFFSET;
-	if (reg == CLKMGR_VCO_SSRC_EOSC1)
-		clock = cm_get_osc_clk_hz(1);
-	else if (reg == CLKMGR_VCO_SSRC_EOSC2)
-		clock = cm_get_osc_clk_hz(2);
-	else if (reg == CLKMGR_VCO_SSRC_F2S)
-		clock = cm_get_f2s_per_ref_clk_hz();
-
-	/* get the PER VCO clock */
-	reg = readl(&clock_manager_base->per_pll.vco);
-	clock /= ((reg & CLKMGR_PERPLLGRP_VCO_DENOM_MASK) >>
-		  CLKMGR_PERPLLGRP_VCO_DENOM_OFFSET) + 1;
-	clock *= ((reg & CLKMGR_PERPLLGRP_VCO_NUMER_MASK) >>
-		  CLKMGR_PERPLLGRP_VCO_NUMER_OFFSET) + 1;
-
-	return clock;
-}
-
-unsigned long cm_get_mpu_clk_hz(void)
-{
-	uint32_t reg, clock;
-
-	clock = cm_get_main_vco_clk_hz();
-
-	/* get the MPU clock */
-	reg = readl(&clock_manager_base->altera.mpuclk);
-	clock /= (reg + 1);
-	reg = readl(&clock_manager_base->main_pll.mpuclk);
-	clock /= (reg + 1);
-	return clock;
-}
-
-unsigned long cm_get_sdram_clk_hz(void)
-{
-	uint32_t reg, clock = 0;
-
-	/* identify SDRAM PLL clock source */
-	reg = readl(&clock_manager_base->sdr_pll.vco);
-	reg = (reg & CLKMGR_SDRPLLGRP_VCO_SSRC_MASK) >>
-	      CLKMGR_SDRPLLGRP_VCO_SSRC_OFFSET;
-	if (reg == CLKMGR_VCO_SSRC_EOSC1)
-		clock = cm_get_osc_clk_hz(1);
-	else if (reg == CLKMGR_VCO_SSRC_EOSC2)
-		clock = cm_get_osc_clk_hz(2);
-	else if (reg == CLKMGR_VCO_SSRC_F2S)
-		clock = cm_get_f2s_sdr_ref_clk_hz();
-
-	/* get the SDRAM VCO clock */
-	reg = readl(&clock_manager_base->sdr_pll.vco);
-	clock /= ((reg & CLKMGR_SDRPLLGRP_VCO_DENOM_MASK) >>
-		  CLKMGR_SDRPLLGRP_VCO_DENOM_OFFSET) + 1;
-	clock *= ((reg & CLKMGR_SDRPLLGRP_VCO_NUMER_MASK) >>
-		  CLKMGR_SDRPLLGRP_VCO_NUMER_OFFSET) + 1;
-
-	/* get the SDRAM (DDR_DQS) clock */
-	reg = readl(&clock_manager_base->sdr_pll.ddrdqsclk);
-	reg = (reg & CLKMGR_SDRPLLGRP_DDRDQSCLK_CNT_MASK) >>
-	      CLKMGR_SDRPLLGRP_DDRDQSCLK_CNT_OFFSET;
-	clock /= (reg + 1);
-
-	return clock;
-}
-
-unsigned int cm_get_l4_sp_clk_hz(void)
-{
-	uint32_t reg, clock = 0;
-
-	/* identify the source of L4 SP clock */
-	reg = readl(&clock_manager_base->main_pll.l4src);
-	reg = (reg & CLKMGR_MAINPLLGRP_L4SRC_L4SP) >>
-	      CLKMGR_MAINPLLGRP_L4SRC_L4SP_OFFSET;
-
-	if (reg == CLKMGR_L4_SP_CLK_SRC_MAINPLL) {
-		clock = cm_get_main_vco_clk_hz();
-
-		/* get the clock prior L4 SP divider (main clk) */
-		reg = readl(&clock_manager_base->altera.mainclk);
-		clock /= (reg + 1);
-		reg = readl(&clock_manager_base->main_pll.mainclk);
-		clock /= (reg + 1);
-	} else if (reg == CLKMGR_L4_SP_CLK_SRC_PERPLL) {
-		clock = cm_get_per_vco_clk_hz();
-
-		/* get the clock prior L4 SP divider (periph_base_clk) */
-		reg = readl(&clock_manager_base->per_pll.perbaseclk);
-		clock /= (reg + 1);
-	}
-
-	/* get the L4 SP clock which supplied to UART */
-	reg = readl(&clock_manager_base->main_pll.maindiv);
-	reg = (reg & CLKMGR_MAINPLLGRP_MAINDIV_L4SPCLK_MASK) >>
-	      CLKMGR_MAINPLLGRP_MAINDIV_L4SPCLK_OFFSET;
-	clock = clock / (1 << reg);
-
-	return clock;
-}
-
-unsigned int cm_get_mmc_controller_clk_hz(void)
-{
-	uint32_t reg, clock = 0;
-
-	/* identify the source of MMC clock */
-	reg = readl(&clock_manager_base->per_pll.src);
-	reg = (reg & CLKMGR_PERPLLGRP_SRC_SDMMC_MASK) >>
-	      CLKMGR_PERPLLGRP_SRC_SDMMC_OFFSET;
-
-	if (reg == CLKMGR_SDMMC_CLK_SRC_F2S) {
-		clock = cm_get_f2s_per_ref_clk_hz();
-	} else if (reg == CLKMGR_SDMMC_CLK_SRC_MAIN) {
-		clock = cm_get_main_vco_clk_hz();
-
-		/* get the SDMMC clock */
-		reg = readl(&clock_manager_base->main_pll.mainnandsdmmcclk);
-		clock /= (reg + 1);
-	} else if (reg == CLKMGR_SDMMC_CLK_SRC_PER) {
-		clock = cm_get_per_vco_clk_hz();
-
-		/* get the SDMMC clock */
-		reg = readl(&clock_manager_base->per_pll.pernandsdmmcclk);
-		clock /= (reg + 1);
-	}
-
-	/* further divide by 4 as we have fixed divider at wrapper */
-	clock /= 4;
-	return clock;
-}
-
-unsigned int cm_get_qspi_controller_clk_hz(void)
-{
-	uint32_t reg, clock = 0;
-
-	/* identify the source of QSPI clock */
-	reg = readl(&clock_manager_base->per_pll.src);
-	reg = (reg & CLKMGR_PERPLLGRP_SRC_QSPI_MASK) >>
-	      CLKMGR_PERPLLGRP_SRC_QSPI_OFFSET;
-
-	if (reg == CLKMGR_QSPI_CLK_SRC_F2S) {
-		clock = cm_get_f2s_per_ref_clk_hz();
-	} else if (reg == CLKMGR_QSPI_CLK_SRC_MAIN) {
-		clock = cm_get_main_vco_clk_hz();
-
-		/* get the qspi clock */
-		reg = readl(&clock_manager_base->main_pll.mainqspiclk);
-		clock /= (reg + 1);
-	} else if (reg == CLKMGR_QSPI_CLK_SRC_PER) {
-		clock = cm_get_per_vco_clk_hz();
-
-		/* get the qspi clock */
-		reg = readl(&clock_manager_base->per_pll.perqspiclk);
-		clock /= (reg + 1);
-	}
-
-	return clock;
-}
-
-unsigned int cm_get_spi_controller_clk_hz(void)
-{
-	uint32_t reg, clock = 0;
-
-	clock = cm_get_per_vco_clk_hz();
-
-	/* get the clock prior L4 SP divider (periph_base_clk) */
-	reg = readl(&clock_manager_base->per_pll.perbaseclk);
-	clock /= (reg + 1);
-
-	return clock;
-}
-
-static void cm_print_clock_quick_summary(void)
-{
-	printf("MPU       %10ld kHz\n", cm_get_mpu_clk_hz() / 1000);
-	printf("DDR       %10ld kHz\n", cm_get_sdram_clk_hz() / 1000);
-	printf("EOSC1       %8d kHz\n", cm_get_osc_clk_hz(1) / 1000);
-	printf("EOSC2       %8d kHz\n", cm_get_osc_clk_hz(2) / 1000);
-	printf("F2S_SDR_REF %8d kHz\n", cm_get_f2s_sdr_ref_clk_hz() / 1000);
-	printf("F2S_PER_REF %8d kHz\n", cm_get_f2s_per_ref_clk_hz() / 1000);
-	printf("MMC         %8d kHz\n", cm_get_mmc_controller_clk_hz() / 1000);
-	printf("QSPI        %8d kHz\n", cm_get_qspi_controller_clk_hz() / 1000);
-	printf("UART        %8d kHz\n", cm_get_l4_sp_clk_hz() / 1000);
-	printf("SPI         %8d kHz\n", cm_get_spi_controller_clk_hz() / 1000);
-}
-
 int set_cpu_clk_info(void)
 {
 	/* Calculate the clock frequencies required for drivers */
diff --git a/arch/arm/mach-socfpga/clock_manager_gen5.c b/arch/arm/mach-socfpga/clock_manager_gen5.c
new file mode 100644
index 0000000..bca27df
--- /dev/null
+++ b/arch/arm/mach-socfpga/clock_manager_gen5.c
@@ -0,0 +1,510 @@
+/*
+ *  Copyright (C) 2013-2017 Altera Corporation <www.altera.com>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/arch/clock_manager.h>
+#include <wait_bit.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static const struct socfpga_clock_manager *clock_manager_base =
+	(struct socfpga_clock_manager *)SOCFPGA_CLKMGR_ADDRESS;
+
+/*
+ * function to write the bypass register which requires a poll of the
+ * busy bit
+ */
+static void cm_write_bypass(u32 val)
+{
+	writel(val, &clock_manager_base->bypass);
+	cm_wait_for_fsm();
+}
+
+/* function to write the ctrl register which requires a poll of the busy bit */
+static void cm_write_ctrl(u32 val)
+{
+	writel(val, &clock_manager_base->ctrl);
+	cm_wait_for_fsm();
+}
+
+/* function to write a clock register that has phase information */
+static void cm_write_with_phase(u32 value,
+				u32 reg_address, u32 mask)
+{
+	/* poll until phase is zero */
+	err = wait_for_bit(__func__, (const u32 *)reg_address, mask,
+			   false, 20000, false);
+
+	writel(value, reg_address);
+
+	err = wait_for_bit(__func__, (const u32 *)reg_address, mask,
+			   false, 20000, false);
+}
+
+/*
+ * Setup clocks while making no assumptions about previous state of the clocks.
+ *
+ * Start by being paranoid and gate all sw managed clocks
+ * Put all plls in bypass
+ * Put all plls VCO registers back to reset value (bandgap power down).
+ * Put peripheral and main pll src to reset value to avoid glitch.
+ * Delay 5 us.
+ * Deassert bandgap power down and set numerator and denominator
+ * Start 7 us timer.
+ * set internal dividers
+ * Wait for 7 us timer.
+ * Enable plls
+ * Set external dividers while plls are locking
+ * Wait for pll lock
+ * Assert/deassert outreset all.
+ * Take all pll's out of bypass
+ * Clear safe mode
+ * set source main and peripheral clocks
+ * Ungate clocks
+ */
+
+void cm_basic_init(const struct cm_config * const cfg)
+{
+	unsigned long end;
+
+	/* Start by being paranoid and gate all sw managed clocks */
+
+	/*
+	 * We need to disable nandclk
+	 * and then do another apb access before disabling
+	 * gatting off the rest of the periperal clocks.
+	 */
+	writel(~CLKMGR_PERPLLGRP_EN_NANDCLK_MASK &
+		readl(&clock_manager_base->per_pll.en),
+		&clock_manager_base->per_pll.en);
+
+	/* DO NOT GATE OFF DEBUG CLOCKS & BRIDGE CLOCKS */
+	writel(CLKMGR_MAINPLLGRP_EN_DBGTIMERCLK_MASK |
+		CLKMGR_MAINPLLGRP_EN_DBGTRACECLK_MASK |
+		CLKMGR_MAINPLLGRP_EN_DBGCLK_MASK |
+		CLKMGR_MAINPLLGRP_EN_DBGATCLK_MASK |
+		CLKMGR_MAINPLLGRP_EN_S2FUSER0CLK_MASK |
+		CLKMGR_MAINPLLGRP_EN_L4MPCLK_MASK,
+		&clock_manager_base->main_pll.en);
+
+	writel(0, &clock_manager_base->sdr_pll.en);
+
+	/* now we can gate off the rest of the peripheral clocks */
+	writel(0, &clock_manager_base->per_pll.en);
+
+	/* Put all plls in bypass */
+	cm_write_bypass(CLKMGR_BYPASS_PERPLL | CLKMGR_BYPASS_SDRPLL |
+			CLKMGR_BYPASS_MAINPLL);
+
+	/* Put all plls VCO registers back to reset value. */
+	writel(CLKMGR_MAINPLLGRP_VCO_RESET_VALUE &
+	       ~CLKMGR_MAINPLLGRP_VCO_REGEXTSEL_MASK,
+	       &clock_manager_base->main_pll.vco);
+	writel(CLKMGR_PERPLLGRP_VCO_RESET_VALUE &
+	       ~CLKMGR_PERPLLGRP_VCO_REGEXTSEL_MASK,
+	       &clock_manager_base->per_pll.vco);
+	writel(CLKMGR_SDRPLLGRP_VCO_RESET_VALUE &
+	       ~CLKMGR_SDRPLLGRP_VCO_REGEXTSEL_MASK,
+	       &clock_manager_base->sdr_pll.vco);
+
+	/*
+	 * The clocks to the flash devices and the L4_MAIN clocks can
+	 * glitch when coming out of safe mode if their source values
+	 * are different from their reset value.  So the trick it to
+	 * put them back to their reset state, and change input
+	 * after exiting safe mode but before ungating the clocks.
+	 */
+	writel(CLKMGR_PERPLLGRP_SRC_RESET_VALUE,
+	       &clock_manager_base->per_pll.src);
+	writel(CLKMGR_MAINPLLGRP_L4SRC_RESET_VALUE,
+	       &clock_manager_base->main_pll.l4src);
+
+	/* read back for the required 5 us delay. */
+	readl(&clock_manager_base->main_pll.vco);
+	readl(&clock_manager_base->per_pll.vco);
+	readl(&clock_manager_base->sdr_pll.vco);
+
+
+	/*
+	 * We made sure bgpwr down was assert for 5 us. Now deassert BG PWR DN
+	 * with numerator and denominator.
+	 */
+	writel(cfg->main_vco_base, &clock_manager_base->main_pll.vco);
+	writel(cfg->peri_vco_base, &clock_manager_base->per_pll.vco);
+	writel(cfg->sdram_vco_base, &clock_manager_base->sdr_pll.vco);
+
+	/*
+	 * Time starts here. Must wait 7 us from
+	 * BGPWRDN_SET(0) to VCO_ENABLE_SET(1).
+	 */
+	end = timer_get_us() + 7;
+
+	/* main mpu */
+	writel(cfg->mpuclk, &clock_manager_base->main_pll.mpuclk);
+
+	/* altera group mpuclk */
+	writel(cfg->altera_grp_mpuclk, &clock_manager_base->altera.mpuclk);
+
+	/* main main clock */
+	writel(cfg->mainclk, &clock_manager_base->main_pll.mainclk);
+
+	/* main for dbg */
+	writel(cfg->dbgatclk, &clock_manager_base->main_pll.dbgatclk);
+
+	/* main for cfgs2fuser0clk */
+	writel(cfg->cfg2fuser0clk,
+	       &clock_manager_base->main_pll.cfgs2fuser0clk);
+
+	/* Peri emac0 50 MHz default to RMII */
+	writel(cfg->emac0clk, &clock_manager_base->per_pll.emac0clk);
+
+	/* Peri emac1 50 MHz default to RMII */
+	writel(cfg->emac1clk, &clock_manager_base->per_pll.emac1clk);
+
+	/* Peri QSPI */
+	writel(cfg->mainqspiclk, &clock_manager_base->main_pll.mainqspiclk);
+
+	writel(cfg->perqspiclk, &clock_manager_base->per_pll.perqspiclk);
+
+	/* Peri pernandsdmmcclk */
+	writel(cfg->mainnandsdmmcclk,
+	       &clock_manager_base->main_pll.mainnandsdmmcclk);
+
+	writel(cfg->pernandsdmmcclk,
+	       &clock_manager_base->per_pll.pernandsdmmcclk);
+
+	/* Peri perbaseclk */
+	writel(cfg->perbaseclk, &clock_manager_base->per_pll.perbaseclk);
+
+	/* Peri s2fuser1clk */
+	writel(cfg->s2fuser1clk, &clock_manager_base->per_pll.s2fuser1clk);
+
+	/* 7 us must have elapsed before we can enable the VCO */
+	while (timer_get_us() < end)
+		;
+
+	/* Enable vco */
+	/* main pll vco */
+	writel(cfg->main_vco_base | CLKMGR_MAINPLLGRP_VCO_EN,
+	       &clock_manager_base->main_pll.vco);
+
+	/* periferal pll */
+	writel(cfg->peri_vco_base | CLKMGR_MAINPLLGRP_VCO_EN,
+	       &clock_manager_base->per_pll.vco);
+
+	/* sdram pll vco */
+	writel(cfg->sdram_vco_base | CLKMGR_MAINPLLGRP_VCO_EN,
+	       &clock_manager_base->sdr_pll.vco);
+
+	/* L3 MP and L3 SP */
+	writel(cfg->maindiv, &clock_manager_base->main_pll.maindiv);
+
+	writel(cfg->dbgdiv, &clock_manager_base->main_pll.dbgdiv);
+
+	writel(cfg->tracediv, &clock_manager_base->main_pll.tracediv);
+
+	/* L4 MP, L4 SP, can0, and can1 */
+	writel(cfg->perdiv, &clock_manager_base->per_pll.div);
+
+	writel(cfg->gpiodiv, &clock_manager_base->per_pll.gpiodiv);
+
+	cm_wait_for_lock(LOCKED_MASK);
+
+	/* write the sdram clock counters before toggling outreset all */
+	writel(cfg->ddrdqsclk & CLKMGR_SDRPLLGRP_DDRDQSCLK_CNT_MASK,
+	       &clock_manager_base->sdr_pll.ddrdqsclk);
+
+	writel(cfg->ddr2xdqsclk & CLKMGR_SDRPLLGRP_DDR2XDQSCLK_CNT_MASK,
+	       &clock_manager_base->sdr_pll.ddr2xdqsclk);
+
+	writel(cfg->ddrdqclk & CLKMGR_SDRPLLGRP_DDRDQCLK_CNT_MASK,
+	       &clock_manager_base->sdr_pll.ddrdqclk);
+
+	writel(cfg->s2fuser2clk & CLKMGR_SDRPLLGRP_S2FUSER2CLK_CNT_MASK,
+	       &clock_manager_base->sdr_pll.s2fuser2clk);
+
+	/*
+	 * after locking, but before taking out of bypass
+	 * assert/deassert outresetall
+	 */
+	u32 mainvco = readl(&clock_manager_base->main_pll.vco);
+
+	/* assert main outresetall */
+	writel(mainvco | CLKMGR_MAINPLLGRP_VCO_OUTRESETALL_MASK,
+	       &clock_manager_base->main_pll.vco);
+
+	u32 periphvco = readl(&clock_manager_base->per_pll.vco);
+
+	/* assert pheriph outresetall */
+	writel(periphvco | CLKMGR_PERPLLGRP_VCO_OUTRESETALL_MASK,
+	       &clock_manager_base->per_pll.vco);
+
+	/* assert sdram outresetall */
+	writel(cfg->sdram_vco_base | CLKMGR_MAINPLLGRP_VCO_EN|
+		CLKMGR_SDRPLLGRP_VCO_OUTRESETALL,
+		&clock_manager_base->sdr_pll.vco);
+
+	/* deassert main outresetall */
+	writel(mainvco & ~CLKMGR_MAINPLLGRP_VCO_OUTRESETALL_MASK,
+	       &clock_manager_base->main_pll.vco);
+
+	/* deassert pheriph outresetall */
+	writel(periphvco & ~CLKMGR_PERPLLGRP_VCO_OUTRESETALL_MASK,
+	       &clock_manager_base->per_pll.vco);
+
+	/* deassert sdram outresetall */
+	writel(cfg->sdram_vco_base | CLKMGR_MAINPLLGRP_VCO_EN,
+	       &clock_manager_base->sdr_pll.vco);
+
+	/*
+	 * now that we've toggled outreset all, all the clocks
+	 * are aligned nicely; so we can change any phase.
+	 */
+	cm_write_with_phase(cfg->ddrdqsclk,
+			    (u32)&clock_manager_base->sdr_pll.ddrdqsclk,
+			    CLKMGR_SDRPLLGRP_DDRDQSCLK_PHASE_MASK);
+
+	/* SDRAM DDR2XDQSCLK */
+	cm_write_with_phase(cfg->ddr2xdqsclk,
+			    (u32)&clock_manager_base->sdr_pll.ddr2xdqsclk,
+			    CLKMGR_SDRPLLGRP_DDR2XDQSCLK_PHASE_MASK);
+
+	cm_write_with_phase(cfg->ddrdqclk,
+			    (u32)&clock_manager_base->sdr_pll.ddrdqclk,
+			    CLKMGR_SDRPLLGRP_DDRDQCLK_PHASE_MASK);
+
+	cm_write_with_phase(cfg->s2fuser2clk,
+			    (u32)&clock_manager_base->sdr_pll.s2fuser2clk,
+			    CLKMGR_SDRPLLGRP_S2FUSER2CLK_PHASE_MASK);
+
+	/* Take all three PLLs out of bypass when safe mode is cleared. */
+	cm_write_bypass(0);
+
+	/* clear safe mode */
+	cm_write_ctrl(readl(&clock_manager_base->ctrl) | CLKMGR_CTRL_SAFEMODE);
+
+	/*
+	 * now that safe mode is clear with clocks gated
+	 * it safe to change the source mux for the flashes the the L4_MAIN
+	 */
+	writel(cfg->persrc, &clock_manager_base->per_pll.src);
+	writel(cfg->l4src, &clock_manager_base->main_pll.l4src);
+
+	/* Now ungate non-hw-managed clocks */
+	writel(~0, &clock_manager_base->main_pll.en);
+	writel(~0, &clock_manager_base->per_pll.en);
+	writel(~0, &clock_manager_base->sdr_pll.en);
+
+	/* Clear the loss of lock bits (write 1 to clear) */
+	writel(CLKMGR_INTER_SDRPLLLOST_MASK | CLKMGR_INTER_PERPLLLOST_MASK |
+	       CLKMGR_INTER_MAINPLLLOST_MASK,
+	       &clock_manager_base->inter);
+}
+
+static unsigned int cm_get_main_vco_clk_hz(void)
+{
+	u32 reg, clock;
+
+	/* get the main VCO clock */
+	reg = readl(&clock_manager_base->main_pll.vco);
+	clock = cm_get_osc_clk_hz(1);
+	clock /= ((reg & CLKMGR_MAINPLLGRP_VCO_DENOM_MASK) >>
+		  CLKMGR_MAINPLLGRP_VCO_DENOM_OFFSET) + 1;
+	clock *= ((reg & CLKMGR_MAINPLLGRP_VCO_NUMER_MASK) >>
+		  CLKMGR_MAINPLLGRP_VCO_NUMER_OFFSET) + 1;
+
+	return clock;
+}
+
+static unsigned int cm_get_per_vco_clk_hz(void)
+{
+	u32 reg, clock = 0;
+
+	/* identify PER PLL clock source */
+	reg = readl(&clock_manager_base->per_pll.vco);
+	reg = (reg & CLKMGR_PERPLLGRP_VCO_SSRC_MASK) >>
+	      CLKMGR_PERPLLGRP_VCO_SSRC_OFFSET;
+	if (reg == CLKMGR_VCO_SSRC_EOSC1)
+		clock = cm_get_osc_clk_hz(1);
+	else if (reg == CLKMGR_VCO_SSRC_EOSC2)
+		clock = cm_get_osc_clk_hz(2);
+	else if (reg == CLKMGR_VCO_SSRC_F2S)
+		clock = cm_get_f2s_per_ref_clk_hz();
+
+	/* get the PER VCO clock */
+	reg = readl(&clock_manager_base->per_pll.vco);
+	clock /= ((reg & CLKMGR_PERPLLGRP_VCO_DENOM_MASK) >>
+		  CLKMGR_PERPLLGRP_VCO_DENOM_OFFSET) + 1;
+	clock *= ((reg & CLKMGR_PERPLLGRP_VCO_NUMER_MASK) >>
+		  CLKMGR_PERPLLGRP_VCO_NUMER_OFFSET) + 1;
+
+	return clock;
+}
+
+unsigned long cm_get_mpu_clk_hz(void)
+{
+	u32 reg, clock;
+
+	clock = cm_get_main_vco_clk_hz();
+
+	/* get the MPU clock */
+	reg = readl(&clock_manager_base->altera.mpuclk);
+	clock /= (reg + 1);
+	reg = readl(&clock_manager_base->main_pll.mpuclk);
+	clock /= (reg + 1);
+	return clock;
+}
+
+unsigned long cm_get_sdram_clk_hz(void)
+{
+	u32 reg, clock = 0;
+
+	/* identify SDRAM PLL clock source */
+	reg = readl(&clock_manager_base->sdr_pll.vco);
+	reg = (reg & CLKMGR_SDRPLLGRP_VCO_SSRC_MASK) >>
+	      CLKMGR_SDRPLLGRP_VCO_SSRC_OFFSET;
+	if (reg == CLKMGR_VCO_SSRC_EOSC1)
+		clock = cm_get_osc_clk_hz(1);
+	else if (reg == CLKMGR_VCO_SSRC_EOSC2)
+		clock = cm_get_osc_clk_hz(2);
+	else if (reg == CLKMGR_VCO_SSRC_F2S)
+		clock = cm_get_f2s_sdr_ref_clk_hz();
+
+	/* get the SDRAM VCO clock */
+	reg = readl(&clock_manager_base->sdr_pll.vco);
+	clock /= ((reg & CLKMGR_SDRPLLGRP_VCO_DENOM_MASK) >>
+		  CLKMGR_SDRPLLGRP_VCO_DENOM_OFFSET) + 1;
+	clock *= ((reg & CLKMGR_SDRPLLGRP_VCO_NUMER_MASK) >>
+		  CLKMGR_SDRPLLGRP_VCO_NUMER_OFFSET) + 1;
+
+	/* get the SDRAM (DDR_DQS) clock */
+	reg = readl(&clock_manager_base->sdr_pll.ddrdqsclk);
+	reg = (reg & CLKMGR_SDRPLLGRP_DDRDQSCLK_CNT_MASK) >>
+	      CLKMGR_SDRPLLGRP_DDRDQSCLK_CNT_OFFSET;
+	clock /= (reg + 1);
+
+	return clock;
+}
+
+unsigned int cm_get_l4_sp_clk_hz(void)
+{
+	u32 reg, clock = 0;
+
+	/* identify the source of L4 SP clock */
+	reg = readl(&clock_manager_base->main_pll.l4src);
+	reg = (reg & CLKMGR_MAINPLLGRP_L4SRC_L4SP) >>
+	      CLKMGR_MAINPLLGRP_L4SRC_L4SP_OFFSET;
+
+	if (reg == CLKMGR_L4_SP_CLK_SRC_MAINPLL) {
+		clock = cm_get_main_vco_clk_hz();
+
+		/* get the clock prior L4 SP divider (main clk) */
+		reg = readl(&clock_manager_base->altera.mainclk);
+		clock /= (reg + 1);
+		reg = readl(&clock_manager_base->main_pll.mainclk);
+		clock /= (reg + 1);
+	} else if (reg == CLKMGR_L4_SP_CLK_SRC_PERPLL) {
+		clock = cm_get_per_vco_clk_hz();
+
+		/* get the clock prior L4 SP divider (periph_base_clk) */
+		reg = readl(&clock_manager_base->per_pll.perbaseclk);
+		clock /= (reg + 1);
+	}
+
+	/* get the L4 SP clock which supplied to UART */
+	reg = readl(&clock_manager_base->main_pll.maindiv);
+	reg = (reg & CLKMGR_MAINPLLGRP_MAINDIV_L4SPCLK_MASK) >>
+	      CLKMGR_MAINPLLGRP_MAINDIV_L4SPCLK_OFFSET;
+	clock = clock / (1 << reg);
+
+	return clock;
+}
+
+unsigned int cm_get_mmc_controller_clk_hz(void)
+{
+	u32 reg, clock = 0;
+
+	/* identify the source of MMC clock */
+	reg = readl(&clock_manager_base->per_pll.src);
+	reg = (reg & CLKMGR_PERPLLGRP_SRC_SDMMC_MASK) >>
+	      CLKMGR_PERPLLGRP_SRC_SDMMC_OFFSET;
+
+	if (reg == CLKMGR_SDMMC_CLK_SRC_F2S) {
+		clock = cm_get_f2s_per_ref_clk_hz();
+	} else if (reg == CLKMGR_SDMMC_CLK_SRC_MAIN) {
+		clock = cm_get_main_vco_clk_hz();
+
+		/* get the SDMMC clock */
+		reg = readl(&clock_manager_base->main_pll.mainnandsdmmcclk);
+		clock /= (reg + 1);
+	} else if (reg == CLKMGR_SDMMC_CLK_SRC_PER) {
+		clock = cm_get_per_vco_clk_hz();
+
+		/* get the SDMMC clock */
+		reg = readl(&clock_manager_base->per_pll.pernandsdmmcclk);
+		clock /= (reg + 1);
+	}
+
+	/* further divide by 4 as we have fixed divider at wrapper */
+	clock /= 4;
+	return clock;
+}
+
+unsigned int cm_get_qspi_controller_clk_hz(void)
+{
+	u32 reg, clock = 0;
+
+	/* identify the source of QSPI clock */
+	reg = readl(&clock_manager_base->per_pll.src);
+	reg = (reg & CLKMGR_PERPLLGRP_SRC_QSPI_MASK) >>
+	      CLKMGR_PERPLLGRP_SRC_QSPI_OFFSET;
+
+	if (reg == CLKMGR_QSPI_CLK_SRC_F2S) {
+		clock = cm_get_f2s_per_ref_clk_hz();
+	} else if (reg == CLKMGR_QSPI_CLK_SRC_MAIN) {
+		clock = cm_get_main_vco_clk_hz();
+
+		/* get the qspi clock */
+		reg = readl(&clock_manager_base->main_pll.mainqspiclk);
+		clock /= (reg + 1);
+	} else if (reg == CLKMGR_QSPI_CLK_SRC_PER) {
+		clock = cm_get_per_vco_clk_hz();
+
+		/* get the qspi clock */
+		reg = readl(&clock_manager_base->per_pll.perqspiclk);
+		clock /= (reg + 1);
+	}
+
+	return clock;
+}
+
+unsigned int cm_get_spi_controller_clk_hz(void)
+{
+	u32 reg, clock = 0;
+
+	clock = cm_get_per_vco_clk_hz();
+
+	/* get the clock prior L4 SP divider (periph_base_clk) */
+	reg = readl(&clock_manager_base->per_pll.perbaseclk);
+	clock /= (reg + 1);
+
+	return clock;
+}
+
+void cm_print_clock_quick_summary(void)
+{
+	printf("MPU       %10ld kHz\n", cm_get_mpu_clk_hz() / 1000);
+	printf("DDR       %10ld kHz\n", cm_get_sdram_clk_hz() / 1000);
+	printf("EOSC1       %8d kHz\n", cm_get_osc_clk_hz(1) / 1000);
+	printf("EOSC2       %8d kHz\n", cm_get_osc_clk_hz(2) / 1000);
+	printf("F2S_SDR_REF %8d kHz\n", cm_get_f2s_sdr_ref_clk_hz() / 1000);
+	printf("F2S_PER_REF %8d kHz\n", cm_get_f2s_per_ref_clk_hz() / 1000);
+	printf("MMC         %8d kHz\n", cm_get_mmc_controller_clk_hz() / 1000);
+	printf("QSPI        %8d kHz\n", cm_get_qspi_controller_clk_hz() / 1000);
+	printf("UART        %8d kHz\n", cm_get_l4_sp_clk_hz() / 1000);
+	printf("SPI         %8d kHz\n", cm_get_spi_controller_clk_hz() / 1000);
+}
diff --git a/arch/arm/mach-socfpga/include/mach/clock_manager.h b/arch/arm/mach-socfpga/include/mach/clock_manager.h
index 803c926..d0d0487 100644
--- a/arch/arm/mach-socfpga/include/mach/clock_manager.h
+++ b/arch/arm/mach-socfpga/include/mach/clock_manager.h
@@ -1,5 +1,5 @@
 /*
- *  Copyright (C) 2013 Altera Corporation <www.altera.com>
+ *  Copyright (C) 2013-2017 Altera Corporation <www.altera.com>
  *
  * SPDX-License-Identifier:	GPL-2.0+
  */
@@ -8,310 +8,12 @@
 #define	_CLOCK_MANAGER_H_
 
 #ifndef __ASSEMBLER__
-/* Clock speed accessors */
-unsigned long cm_get_mpu_clk_hz(void);
-unsigned long cm_get_sdram_clk_hz(void);
-unsigned int cm_get_l4_sp_clk_hz(void);
-unsigned int cm_get_mmc_controller_clk_hz(void);
-unsigned int cm_get_qspi_controller_clk_hz(void);
-unsigned int cm_get_spi_controller_clk_hz(void);
-const unsigned int cm_get_osc_clk_hz(const int osc);
-const unsigned int cm_get_f2s_per_ref_clk_hz(void);
-const unsigned int cm_get_f2s_sdr_ref_clk_hz(void);
-
-/* Clock configuration accessors */
-const struct cm_config * const cm_get_default_config(void);
+void cm_wait_for_lock(u32 mask);
+void cm_wait_for_fsm(void);
+void cm_print_clock_quick_summary(void);
 #endif
 
-struct cm_config {
-	/* main group */
-	uint32_t main_vco_base;
-	uint32_t mpuclk;
-	uint32_t mainclk;
-	uint32_t dbgatclk;
-	uint32_t mainqspiclk;
-	uint32_t mainnandsdmmcclk;
-	uint32_t cfg2fuser0clk;
-	uint32_t maindiv;
-	uint32_t dbgdiv;
-	uint32_t tracediv;
-	uint32_t l4src;
-
-	/* peripheral group */
-	uint32_t peri_vco_base;
-	uint32_t emac0clk;
-	uint32_t emac1clk;
-	uint32_t perqspiclk;
-	uint32_t pernandsdmmcclk;
-	uint32_t perbaseclk;
-	uint32_t s2fuser1clk;
-	uint32_t perdiv;
-	uint32_t gpiodiv;
-	uint32_t persrc;
-
-	/* sdram pll group */
-	uint32_t sdram_vco_base;
-	uint32_t ddrdqsclk;
-	uint32_t ddr2xdqsclk;
-	uint32_t ddrdqclk;
-	uint32_t s2fuser2clk;
-
-	/* altera group */
-	uint32_t altera_grp_mpuclk;
-};
-
-void cm_basic_init(const struct cm_config * const cfg);
-
-struct socfpga_clock_manager_main_pll {
-	u32	vco;
-	u32	misc;
-	u32	mpuclk;
-	u32	mainclk;
-	u32	dbgatclk;
-	u32	mainqspiclk;
-	u32	mainnandsdmmcclk;
-	u32	cfgs2fuser0clk;
-	u32	en;
-	u32	maindiv;
-	u32	dbgdiv;
-	u32	tracediv;
-	u32	l4src;
-	u32	stat;
-	u32	_pad_0x38_0x40[2];
-};
-
-struct socfpga_clock_manager_per_pll {
-	u32	vco;
-	u32	misc;
-	u32	emac0clk;
-	u32	emac1clk;
-	u32	perqspiclk;
-	u32	pernandsdmmcclk;
-	u32	perbaseclk;
-	u32	s2fuser1clk;
-	u32	en;
-	u32	div;
-	u32	gpiodiv;
-	u32	src;
-	u32	stat;
-	u32	_pad_0x34_0x40[3];
-};
-
-struct socfpga_clock_manager_sdr_pll {
-	u32	vco;
-	u32	ctrl;
-	u32	ddrdqsclk;
-	u32	ddr2xdqsclk;
-	u32	ddrdqclk;
-	u32	s2fuser2clk;
-	u32	en;
-	u32	stat;
-};
-
-struct socfpga_clock_manager_altera {
-	u32	mpuclk;
-	u32	mainclk;
-};
-
-struct socfpga_clock_manager {
-	u32	ctrl;
-	u32	bypass;
-	u32	inter;
-	u32	intren;
-	u32	dbctrl;
-	u32	stat;
-	u32	_pad_0x18_0x3f[10];
-	struct socfpga_clock_manager_main_pll main_pll;
-	struct socfpga_clock_manager_per_pll per_pll;
-	struct socfpga_clock_manager_sdr_pll sdr_pll;
-	struct socfpga_clock_manager_altera altera;
-	u32	_pad_0xe8_0x200[70];
-};
-
-#define CLKMGR_CTRL_SAFEMODE				(1 << 0)
-#define CLKMGR_CTRL_SAFEMODE_OFFSET			0
-
-#define CLKMGR_BYPASS_PERPLLSRC				(1 << 4)
-#define CLKMGR_BYPASS_PERPLLSRC_OFFSET			4
-#define CLKMGR_BYPASS_PERPLL				(1 << 3)
-#define CLKMGR_BYPASS_PERPLL_OFFSET			3
-#define CLKMGR_BYPASS_SDRPLLSRC				(1 << 2)
-#define CLKMGR_BYPASS_SDRPLLSRC_OFFSET			2
-#define CLKMGR_BYPASS_SDRPLL				(1 << 1)
-#define CLKMGR_BYPASS_SDRPLL_OFFSET			1
-#define CLKMGR_BYPASS_MAINPLL				(1 << 0)
-#define CLKMGR_BYPASS_MAINPLL_OFFSET			0
-
-#define CLKMGR_INTER_SDRPLLLOCKED_MASK			0x00000100
-#define CLKMGR_INTER_PERPLLLOCKED_MASK			0x00000080
-#define CLKMGR_INTER_MAINPLLLOCKED_MASK			0x00000040
-#define CLKMGR_INTER_PERPLLLOST_MASK			0x00000010
-#define CLKMGR_INTER_SDRPLLLOST_MASK			0x00000020
-#define CLKMGR_INTER_MAINPLLLOST_MASK			0x00000008
-
-#define CLKMGR_STAT_BUSY				(1 << 0)
-
-/* Main PLL */
-#define CLKMGR_MAINPLLGRP_VCO_BGPWRDN			(1 << 0)
-#define CLKMGR_MAINPLLGRP_VCO_BGPWRDN_OFFSET		0
-#define CLKMGR_MAINPLLGRP_VCO_DENOM_OFFSET		16
-#define CLKMGR_MAINPLLGRP_VCO_DENOM_MASK		0x003f0000
-#define CLKMGR_MAINPLLGRP_VCO_EN			(1 << 1)
-#define CLKMGR_MAINPLLGRP_VCO_EN_OFFSET			1
-#define CLKMGR_MAINPLLGRP_VCO_NUMER_OFFSET		3
-#define CLKMGR_MAINPLLGRP_VCO_NUMER_MASK		0x0000fff8
-#define CLKMGR_MAINPLLGRP_VCO_OUTRESETALL_MASK		0x01000000
-#define CLKMGR_MAINPLLGRP_VCO_PWRDN			(1 << 2)
-#define CLKMGR_MAINPLLGRP_VCO_PWRDN_OFFSET		2
-#define CLKMGR_MAINPLLGRP_VCO_REGEXTSEL_MASK		0x80000000
-#define CLKMGR_MAINPLLGRP_VCO_RESET_VALUE		0x8001000d
-
-#define CLKMGR_MAINPLLGRP_MPUCLK_CNT_OFFSET		0
-#define CLKMGR_MAINPLLGRP_MPUCLK_CNT_MASK		0x000001ff
-
-#define CLKMGR_MAINPLLGRP_MAINCLK_CNT_OFFSET		0
-#define CLKMGR_MAINPLLGRP_MAINCLK_CNT_MASK		0x000001ff
-
-#define CLKMGR_MAINPLLGRP_DBGATCLK_CNT_OFFSET		0
-#define CLKMGR_MAINPLLGRP_DBGATCLK_CNT_MASK		0x000001ff
-
-#define CLKMGR_MAINPLLGRP_MAINQSPICLK_CNT_OFFSET	0
-#define CLKMGR_MAINPLLGRP_MAINQSPICLK_CNT_MASK		0x000001ff
-
-#define CLKMGR_MAINPLLGRP_MAINNANDSDMMCCLK_CNT_OFFSET	0
-#define CLKMGR_MAINPLLGRP_MAINNANDSDMMCCLK_CNT_MASK	0x000001ff
-
-#define CLKMGR_MAINPLLGRP_CFGS2FUSER0CLK_CNT_OFFSET	0
-#define CLKMGR_MAINPLLGRP_CFGS2FUSER0CLK_CNT_MASK	0x000001ff
-
-#define CLKMGR_MAINPLLGRP_EN_DBGATCLK_MASK		0x00000010
-#define CLKMGR_MAINPLLGRP_EN_DBGCLK_MASK		0x00000020
-#define CLKMGR_MAINPLLGRP_EN_DBGTIMERCLK_MASK		0x00000080
-#define CLKMGR_MAINPLLGRP_EN_DBGTRACECLK_MASK		0x00000040
-#define CLKMGR_MAINPLLGRP_EN_L4MPCLK_MASK		0x00000004
-#define CLKMGR_MAINPLLGRP_EN_S2FUSER0CLK_MASK		0x00000200
-
-#define CLKMGR_MAINPLLGRP_MAINDIV_L3MPCLK_OFFSET	0
-#define CLKMGR_MAINPLLGRP_MAINDIV_L3MPCLK_MASK		0x00000003
-#define CLKMGR_MAINPLLGRP_MAINDIV_L3SPCLK_OFFSET	2
-#define CLKMGR_MAINPLLGRP_MAINDIV_L3SPCLK_MASK		0x0000000c
-#define CLKMGR_MAINPLLGRP_MAINDIV_L4MPCLK_OFFSET	4
-#define CLKMGR_MAINPLLGRP_MAINDIV_L4MPCLK_MASK		0x00000070
-#define CLKMGR_MAINPLLGRP_MAINDIV_L4SPCLK_OFFSET	7
-#define CLKMGR_MAINPLLGRP_MAINDIV_L4SPCLK_MASK		0x00000380
-
-#define CLKMGR_MAINPLLGRP_DBGDIV_DBGATCLK_OFFSET	0
-#define CLKMGR_MAINPLLGRP_DBGDIV_DBGATCLK_MASK		0x00000003
-#define CLKMGR_MAINPLLGRP_DBGDIV_DBGCLK_OFFSET		2
-#define CLKMGR_MAINPLLGRP_DBGDIV_DBGCLK_MASK		0x0000000c
-
-#define CLKMGR_MAINPLLGRP_TRACEDIV_TRACECLK_OFFSET	0
-#define CLKMGR_MAINPLLGRP_TRACEDIV_TRACECLK_MASK	0x00000007
-
-#define CLKMGR_MAINPLLGRP_L4SRC_L4MP			(1 << 0)
-#define CLKMGR_MAINPLLGRP_L4SRC_L4MP_OFFSET		0
-#define CLKMGR_MAINPLLGRP_L4SRC_L4SP			(1 << 1)
-#define CLKMGR_MAINPLLGRP_L4SRC_L4SP_OFFSET		1
-#define CLKMGR_MAINPLLGRP_L4SRC_RESET_VALUE		0x00000000
-#define CLKMGR_L4_SP_CLK_SRC_MAINPLL			0x0
-#define CLKMGR_L4_SP_CLK_SRC_PERPLL			0x1
-
-/* Per PLL */
-#define CLKMGR_PERPLLGRP_VCO_DENOM_OFFSET		16
-#define CLKMGR_PERPLLGRP_VCO_DENOM_MASK			0x003f0000
-#define CLKMGR_PERPLLGRP_VCO_NUMER_OFFSET		3
-#define CLKMGR_PERPLLGRP_VCO_NUMER_MASK			0x0000fff8
-#define CLKMGR_PERPLLGRP_VCO_OUTRESETALL_MASK		0x01000000
-#define CLKMGR_PERPLLGRP_VCO_PSRC_OFFSET		22
-#define CLKMGR_PERPLLGRP_VCO_PSRC_MASK			0x00c00000
-#define CLKMGR_PERPLLGRP_VCO_REGEXTSEL_MASK		0x80000000
-#define CLKMGR_PERPLLGRP_VCO_RESET_VALUE		0x8001000d
-#define CLKMGR_PERPLLGRP_VCO_SSRC_OFFSET		22
-#define CLKMGR_PERPLLGRP_VCO_SSRC_MASK			0x00c00000
-
-#define CLKMGR_VCO_SSRC_EOSC1				0x0
-#define CLKMGR_VCO_SSRC_EOSC2				0x1
-#define CLKMGR_VCO_SSRC_F2S				0x2
-
-#define CLKMGR_PERPLLGRP_EMAC0CLK_CNT_OFFSET		0
-#define CLKMGR_PERPLLGRP_EMAC0CLK_CNT_MASK		0x000001ff
-
-#define CLKMGR_PERPLLGRP_EMAC1CLK_CNT_OFFSET		0
-#define CLKMGR_PERPLLGRP_EMAC1CLK_CNT_MASK		0x000001ff
-
-#define CLKMGR_PERPLLGRP_PERQSPICLK_CNT_OFFSET		0
-#define CLKMGR_PERPLLGRP_PERQSPICLK_CNT_MASK		0x000001ff
-
-#define CLKMGR_PERPLLGRP_PERNANDSDMMCCLK_CNT_OFFSET	0
-#define CLKMGR_PERPLLGRP_PERNANDSDMMCCLK_CNT_MASK	0x000001ff
-
-#define CLKMGR_PERPLLGRP_PERBASECLK_CNT_OFFSET		0
-#define CLKMGR_PERPLLGRP_PERBASECLK_CNT_MASK		0x000001ff
-
-#define CLKMGR_PERPLLGRP_S2FUSER1CLK_CNT_OFFSET		0
-#define CLKMGR_PERPLLGRP_S2FUSER1CLK_CNT_MASK		0x000001ff
-
-#define CLKMGR_PERPLLGRP_EN_NANDCLK_MASK		0x00000400
-#define CLKMGR_PERPLLGRP_EN_SDMMCCLK_MASK		0x00000100
-
-#define CLKMGR_PERPLLGRP_DIV_CAN0CLK_OFFSET		6
-#define CLKMGR_PERPLLGRP_DIV_CAN0CLK_MASK		0x000001c0
-#define CLKMGR_PERPLLGRP_DIV_CAN1CLK_OFFSET		9
-#define CLKMGR_PERPLLGRP_DIV_CAN1CLK_MASK		0x00000e00
-#define CLKMGR_PERPLLGRP_DIV_SPIMCLK_OFFSET		3
-#define CLKMGR_PERPLLGRP_DIV_SPIMCLK_OFFSET		3
-#define CLKMGR_PERPLLGRP_DIV_USBCLK_OFFSET		0
-#define CLKMGR_PERPLLGRP_DIV_USBCLK_MASK		0x00000007
-
-#define CLKMGR_PERPLLGRP_GPIODIV_GPIODBCLK_OFFSET	0
-#define CLKMGR_PERPLLGRP_GPIODIV_GPIODBCLK_MASK		0x00ffffff
-
-#define CLKMGR_PERPLLGRP_SRC_NAND_OFFSET		2
-#define CLKMGR_PERPLLGRP_SRC_NAND_MASK			0x0000000c
-#define CLKMGR_PERPLLGRP_SRC_QSPI_OFFSET		4
-#define CLKMGR_PERPLLGRP_SRC_QSPI_MASK			0x00000030
-#define CLKMGR_PERPLLGRP_SRC_RESET_VALUE		0x00000015
-#define CLKMGR_PERPLLGRP_SRC_SDMMC_OFFSET		0
-#define CLKMGR_PERPLLGRP_SRC_SDMMC_MASK			0x00000003
-#define CLKMGR_SDMMC_CLK_SRC_F2S			0x0
-#define CLKMGR_SDMMC_CLK_SRC_MAIN			0x1
-#define CLKMGR_SDMMC_CLK_SRC_PER			0x2
-#define CLKMGR_QSPI_CLK_SRC_F2S				0x0
-#define CLKMGR_QSPI_CLK_SRC_MAIN			0x1
-#define CLKMGR_QSPI_CLK_SRC_PER				0x2
-
-/* SDR PLL */
-#define CLKMGR_SDRPLLGRP_VCO_DENOM_OFFSET		16
-#define CLKMGR_SDRPLLGRP_VCO_DENOM_MASK			0x003f0000
-#define CLKMGR_SDRPLLGRP_VCO_NUMER_OFFSET		3
-#define CLKMGR_SDRPLLGRP_VCO_NUMER_MASK			0x0000fff8
-#define CLKMGR_SDRPLLGRP_VCO_OUTRESETALL		(1 << 24)
-#define CLKMGR_SDRPLLGRP_VCO_OUTRESETALL_OFFSET		24
-#define CLKMGR_SDRPLLGRP_VCO_OUTRESET_OFFSET		25
-#define CLKMGR_SDRPLLGRP_VCO_OUTRESET_MASK		0x7e000000
-#define CLKMGR_SDRPLLGRP_VCO_REGEXTSEL_MASK		0x80000000
-#define CLKMGR_SDRPLLGRP_VCO_RESET_VALUE		0x8001000d
-#define CLKMGR_SDRPLLGRP_VCO_SSRC_OFFSET		22
-#define CLKMGR_SDRPLLGRP_VCO_SSRC_MASK			0x00c00000
-
-#define CLKMGR_SDRPLLGRP_DDRDQSCLK_CNT_OFFSET		0
-#define CLKMGR_SDRPLLGRP_DDRDQSCLK_CNT_MASK		0x000001ff
-#define CLKMGR_SDRPLLGRP_DDRDQSCLK_PHASE_OFFSET		9
-#define CLKMGR_SDRPLLGRP_DDRDQSCLK_PHASE_MASK		0x00000e00
-
-#define CLKMGR_SDRPLLGRP_DDR2XDQSCLK_CNT_OFFSET		0
-#define CLKMGR_SDRPLLGRP_DDR2XDQSCLK_CNT_MASK		0x000001ff
-#define CLKMGR_SDRPLLGRP_DDR2XDQSCLK_PHASE_OFFSET	9
-#define CLKMGR_SDRPLLGRP_DDR2XDQSCLK_PHASE_MASK		0x00000e00
-
-#define CLKMGR_SDRPLLGRP_DDRDQCLK_CNT_OFFSET		0
-#define CLKMGR_SDRPLLGRP_DDRDQCLK_CNT_MASK		0x000001ff
-#define CLKMGR_SDRPLLGRP_DDRDQCLK_PHASE_OFFSET		9
-#define CLKMGR_SDRPLLGRP_DDRDQCLK_PHASE_MASK		0x00000e00
-
-#define CLKMGR_SDRPLLGRP_S2FUSER2CLK_CNT_OFFSET		0
-#define CLKMGR_SDRPLLGRP_S2FUSER2CLK_CNT_MASK		0x000001ff
-#define CLKMGR_SDRPLLGRP_S2FUSER2CLK_PHASE_OFFSET	9
-#define CLKMGR_SDRPLLGRP_S2FUSER2CLK_PHASE_MASK		0x00000e00
-
+#if defined(CONFIG_TARGET_SOCFPGA_GEN5)
+#include <asm/arch/clock_manager_gen5.h>
+#endif
 #endif /* _CLOCK_MANAGER_H_ */
diff --git a/arch/arm/mach-socfpga/include/mach/clock_manager_gen5.h b/arch/arm/mach-socfpga/include/mach/clock_manager_gen5.h
new file mode 100644
index 0000000..8d62d8e
--- /dev/null
+++ b/arch/arm/mach-socfpga/include/mach/clock_manager_gen5.h
@@ -0,0 +1,322 @@
+/*
+ *  Copyright (C) 2013-2017 Altera Corporation <www.altera.com>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#ifndef _CLOCK_MANAGER_GEN5_H_
+#define _CLOCK_MANAGER_GEN5_H_
+
+#ifndef __ASSEMBLER__
+
+struct cm_config {
+	/* main group */
+	u32 main_vco_base;
+	u32 mpuclk;
+	u32 mainclk;
+	u32 dbgatclk;
+	u32 mainqspiclk;
+	u32 mainnandsdmmcclk;
+	u32 cfg2fuser0clk;
+	u32 maindiv;
+	u32 dbgdiv;
+	u32 tracediv;
+	u32 l4src;
+
+	/* peripheral group */
+	u32 peri_vco_base;
+	u32 emac0clk;
+	u32 emac1clk;
+	u32 perqspiclk;
+	u32 pernandsdmmcclk;
+	u32 perbaseclk;
+	u32 s2fuser1clk;
+	u32 perdiv;
+	u32 gpiodiv;
+	u32 persrc;
+
+	/* sdram pll group */
+	u32 sdram_vco_base;
+	u32 ddrdqsclk;
+	u32 ddr2xdqsclk;
+	u32 ddrdqclk;
+	u32 s2fuser2clk;
+
+	/* altera group */
+	u32 altera_grp_mpuclk;
+};
+
+struct socfpga_clock_manager_main_pll {
+	u32	vco;
+	u32	misc;
+	u32	mpuclk;
+	u32	mainclk;
+	u32	dbgatclk;
+	u32	mainqspiclk;
+	u32	mainnandsdmmcclk;
+	u32	cfgs2fuser0clk;
+	u32	en;
+	u32	maindiv;
+	u32	dbgdiv;
+	u32	tracediv;
+	u32	l4src;
+	u32	stat;
+	u32	_pad_0x38_0x40[2];
+};
+
+struct socfpga_clock_manager_per_pll {
+	u32	vco;
+	u32	misc;
+	u32	emac0clk;
+	u32	emac1clk;
+	u32	perqspiclk;
+	u32	pernandsdmmcclk;
+	u32	perbaseclk;
+	u32	s2fuser1clk;
+	u32	en;
+	u32	div;
+	u32	gpiodiv;
+	u32	src;
+	u32	stat;
+	u32	_pad_0x34_0x40[3];
+};
+
+struct socfpga_clock_manager_sdr_pll {
+	u32	vco;
+	u32	ctrl;
+	u32	ddrdqsclk;
+	u32	ddr2xdqsclk;
+	u32	ddrdqclk;
+	u32	s2fuser2clk;
+	u32	en;
+	u32	stat;
+};
+
+struct socfpga_clock_manager_altera {
+	u32	mpuclk;
+	u32	mainclk;
+};
+
+struct socfpga_clock_manager {
+	u32	ctrl;
+	u32	bypass;
+	u32	inter;
+	u32	intren;
+	u32	dbctrl;
+	u32	stat;
+	u32	_pad_0x18_0x3f[10];
+	struct socfpga_clock_manager_main_pll main_pll;
+	struct socfpga_clock_manager_per_pll per_pll;
+	struct socfpga_clock_manager_sdr_pll sdr_pll;
+	struct socfpga_clock_manager_altera altera;
+	u32	_pad_0xe8_0x200[70];
+};
+
+/* Clock speed accessors */
+unsigned long cm_get_mpu_clk_hz(void);
+unsigned long cm_get_sdram_clk_hz(void);
+unsigned int cm_get_l4_sp_clk_hz(void);
+unsigned int cm_get_mmc_controller_clk_hz(void);
+unsigned int cm_get_qspi_controller_clk_hz(void);
+unsigned int cm_get_spi_controller_clk_hz(void);
+const unsigned int cm_get_osc_clk_hz(const int osc);
+const unsigned int cm_get_f2s_per_ref_clk_hz(void);
+const unsigned int cm_get_f2s_sdr_ref_clk_hz(void);
+
+/* Clock configuration accessors */
+void cm_basic_init(const struct cm_config * const cfg);
+const struct cm_config * const cm_get_default_config(void);
+#endif /* __ASSEMBLER__ */
+
+#define LOCKED_MASK \
+	(CLKMGR_INTER_SDRPLLLOCKED_MASK  | \
+	CLKMGR_INTER_PERPLLLOCKED_MASK  | \
+	CLKMGR_INTER_MAINPLLLOCKED_MASK)
+
+#define CLKMGR_CTRL_SAFEMODE				BIT(0)
+#define CLKMGR_CTRL_SAFEMODE_OFFSET			0
+
+#define CLKMGR_BYPASS_PERPLLSRC				BIT(4)
+#define CLKMGR_BYPASS_PERPLLSRC_OFFSET			4
+#define CLKMGR_BYPASS_PERPLL				BIT(3)
+#define CLKMGR_BYPASS_PERPLL_OFFSET			3
+#define CLKMGR_BYPASS_SDRPLLSRC				BIT(2)
+#define CLKMGR_BYPASS_SDRPLLSRC_OFFSET			2
+#define CLKMGR_BYPASS_SDRPLL				BIT(1)
+#define CLKMGR_BYPASS_SDRPLL_OFFSET			1
+#define CLKMGR_BYPASS_MAINPLL				BIT(0)
+#define CLKMGR_BYPASS_MAINPLL_OFFSET			0
+
+#define CLKMGR_INTER_SDRPLLLOCKED_MASK			0x00000100
+#define CLKMGR_INTER_PERPLLLOCKED_MASK			0x00000080
+#define CLKMGR_INTER_MAINPLLLOCKED_MASK			0x00000040
+#define CLKMGR_INTER_PERPLLLOST_MASK			0x00000010
+#define CLKMGR_INTER_SDRPLLLOST_MASK			0x00000020
+#define CLKMGR_INTER_MAINPLLLOST_MASK			0x00000008
+
+#define CLKMGR_STAT_BUSY				BIT(0)
+
+/* Main PLL */
+#define CLKMGR_MAINPLLGRP_VCO_BGPWRDN			BIT(0)
+#define CLKMGR_MAINPLLGRP_VCO_BGPWRDN_OFFSET		0
+#define CLKMGR_MAINPLLGRP_VCO_DENOM_OFFSET		16
+#define CLKMGR_MAINPLLGRP_VCO_DENOM_MASK		0x003f0000
+#define CLKMGR_MAINPLLGRP_VCO_EN			BIT(1)
+#define CLKMGR_MAINPLLGRP_VCO_EN_OFFSET			1
+#define CLKMGR_MAINPLLGRP_VCO_NUMER_OFFSET		3
+#define CLKMGR_MAINPLLGRP_VCO_NUMER_MASK		0x0000fff8
+#define CLKMGR_MAINPLLGRP_VCO_OUTRESETALL_MASK		0x01000000
+#define CLKMGR_MAINPLLGRP_VCO_PWRDN			BIT(2)
+#define CLKMGR_MAINPLLGRP_VCO_PWRDN_OFFSET		2
+#define CLKMGR_MAINPLLGRP_VCO_REGEXTSEL_MASK		0x80000000
+#define CLKMGR_MAINPLLGRP_VCO_RESET_VALUE		0x8001000d
+
+#define CLKMGR_MAINPLLGRP_MPUCLK_CNT_OFFSET		0
+#define CLKMGR_MAINPLLGRP_MPUCLK_CNT_MASK		0x000001ff
+
+#define CLKMGR_MAINPLLGRP_MAINCLK_CNT_OFFSET		0
+#define CLKMGR_MAINPLLGRP_MAINCLK_CNT_MASK		0x000001ff
+
+#define CLKMGR_MAINPLLGRP_DBGATCLK_CNT_OFFSET		0
+#define CLKMGR_MAINPLLGRP_DBGATCLK_CNT_MASK		0x000001ff
+
+#define CLKMGR_MAINPLLGRP_MAINQSPICLK_CNT_OFFSET	0
+#define CLKMGR_MAINPLLGRP_MAINQSPICLK_CNT_MASK		0x000001ff
+
+#define CLKMGR_MAINPLLGRP_MAINNANDSDMMCCLK_CNT_OFFSET	0
+#define CLKMGR_MAINPLLGRP_MAINNANDSDMMCCLK_CNT_MASK	0x000001ff
+
+#define CLKMGR_MAINPLLGRP_CFGS2FUSER0CLK_CNT_OFFSET	0
+#define CLKMGR_MAINPLLGRP_CFGS2FUSER0CLK_CNT_MASK	0x000001ff
+
+#define CLKMGR_MAINPLLGRP_EN_DBGATCLK_MASK		0x00000010
+#define CLKMGR_MAINPLLGRP_EN_DBGCLK_MASK		0x00000020
+#define CLKMGR_MAINPLLGRP_EN_DBGTIMERCLK_MASK		0x00000080
+#define CLKMGR_MAINPLLGRP_EN_DBGTRACECLK_MASK		0x00000040
+#define CLKMGR_MAINPLLGRP_EN_L4MPCLK_MASK		0x00000004
+#define CLKMGR_MAINPLLGRP_EN_S2FUSER0CLK_MASK		0x00000200
+
+#define CLKMGR_MAINPLLGRP_MAINDIV_L3MPCLK_OFFSET	0
+#define CLKMGR_MAINPLLGRP_MAINDIV_L3MPCLK_MASK		0x00000003
+#define CLKMGR_MAINPLLGRP_MAINDIV_L3SPCLK_OFFSET	2
+#define CLKMGR_MAINPLLGRP_MAINDIV_L3SPCLK_MASK		0x0000000c
+#define CLKMGR_MAINPLLGRP_MAINDIV_L4MPCLK_OFFSET	4
+#define CLKMGR_MAINPLLGRP_MAINDIV_L4MPCLK_MASK		0x00000070
+#define CLKMGR_MAINPLLGRP_MAINDIV_L4SPCLK_OFFSET	7
+#define CLKMGR_MAINPLLGRP_MAINDIV_L4SPCLK_MASK		0x00000380
+
+#define CLKMGR_MAINPLLGRP_DBGDIV_DBGATCLK_OFFSET	0
+#define CLKMGR_MAINPLLGRP_DBGDIV_DBGATCLK_MASK		0x00000003
+#define CLKMGR_MAINPLLGRP_DBGDIV_DBGCLK_OFFSET		2
+#define CLKMGR_MAINPLLGRP_DBGDIV_DBGCLK_MASK		0x0000000c
+
+#define CLKMGR_MAINPLLGRP_TRACEDIV_TRACECLK_OFFSET	0
+#define CLKMGR_MAINPLLGRP_TRACEDIV_TRACECLK_MASK	0x00000007
+
+#define CLKMGR_MAINPLLGRP_L4SRC_L4MP			BIT(0)
+#define CLKMGR_MAINPLLGRP_L4SRC_L4MP_OFFSET		0
+#define CLKMGR_MAINPLLGRP_L4SRC_L4SP			BIT(1)
+#define CLKMGR_MAINPLLGRP_L4SRC_L4SP_OFFSET		1
+#define CLKMGR_MAINPLLGRP_L4SRC_RESET_VALUE		0x00000000
+#define CLKMGR_L4_SP_CLK_SRC_MAINPLL			0x0
+#define CLKMGR_L4_SP_CLK_SRC_PERPLL			0x1
+
+/* Per PLL */
+#define CLKMGR_PERPLLGRP_VCO_DENOM_OFFSET		16
+#define CLKMGR_PERPLLGRP_VCO_DENOM_MASK			0x003f0000
+#define CLKMGR_PERPLLGRP_VCO_NUMER_OFFSET		3
+#define CLKMGR_PERPLLGRP_VCO_NUMER_MASK			0x0000fff8
+#define CLKMGR_PERPLLGRP_VCO_OUTRESETALL_MASK		0x01000000
+#define CLKMGR_PERPLLGRP_VCO_PSRC_OFFSET		22
+#define CLKMGR_PERPLLGRP_VCO_PSRC_MASK			0x00c00000
+#define CLKMGR_PERPLLGRP_VCO_REGEXTSEL_MASK		0x80000000
+#define CLKMGR_PERPLLGRP_VCO_RESET_VALUE		0x8001000d
+#define CLKMGR_PERPLLGRP_VCO_SSRC_OFFSET		22
+#define CLKMGR_PERPLLGRP_VCO_SSRC_MASK			0x00c00000
+
+#define CLKMGR_VCO_SSRC_EOSC1				0x0
+#define CLKMGR_VCO_SSRC_EOSC2				0x1
+#define CLKMGR_VCO_SSRC_F2S				0x2
+
+#define CLKMGR_PERPLLGRP_EMAC0CLK_CNT_OFFSET		0
+#define CLKMGR_PERPLLGRP_EMAC0CLK_CNT_MASK		0x000001ff
+
+#define CLKMGR_PERPLLGRP_EMAC1CLK_CNT_OFFSET		0
+#define CLKMGR_PERPLLGRP_EMAC1CLK_CNT_MASK		0x000001ff
+
+#define CLKMGR_PERPLLGRP_PERQSPICLK_CNT_OFFSET		0
+#define CLKMGR_PERPLLGRP_PERQSPICLK_CNT_MASK		0x000001ff
+
+#define CLKMGR_PERPLLGRP_PERNANDSDMMCCLK_CNT_OFFSET	0
+#define CLKMGR_PERPLLGRP_PERNANDSDMMCCLK_CNT_MASK	0x000001ff
+
+#define CLKMGR_PERPLLGRP_PERBASECLK_CNT_OFFSET		0
+#define CLKMGR_PERPLLGRP_PERBASECLK_CNT_MASK		0x000001ff
+
+#define CLKMGR_PERPLLGRP_S2FUSER1CLK_CNT_OFFSET		0
+#define CLKMGR_PERPLLGRP_S2FUSER1CLK_CNT_MASK		0x000001ff
+
+#define CLKMGR_PERPLLGRP_EN_NANDCLK_MASK		0x00000400
+#define CLKMGR_PERPLLGRP_EN_SDMMCCLK_MASK		0x00000100
+
+#define CLKMGR_PERPLLGRP_DIV_CAN0CLK_OFFSET		6
+#define CLKMGR_PERPLLGRP_DIV_CAN0CLK_MASK		0x000001c0
+#define CLKMGR_PERPLLGRP_DIV_CAN1CLK_OFFSET		9
+#define CLKMGR_PERPLLGRP_DIV_CAN1CLK_MASK		0x00000e00
+#define CLKMGR_PERPLLGRP_DIV_SPIMCLK_OFFSET		3
+#define CLKMGR_PERPLLGRP_DIV_SPIMCLK_OFFSET		3
+#define CLKMGR_PERPLLGRP_DIV_USBCLK_OFFSET		0
+#define CLKMGR_PERPLLGRP_DIV_USBCLK_MASK		0x00000007
+
+#define CLKMGR_PERPLLGRP_GPIODIV_GPIODBCLK_OFFSET	0
+#define CLKMGR_PERPLLGRP_GPIODIV_GPIODBCLK_MASK		0x00ffffff
+
+#define CLKMGR_PERPLLGRP_SRC_NAND_OFFSET		2
+#define CLKMGR_PERPLLGRP_SRC_NAND_MASK			0x0000000c
+#define CLKMGR_PERPLLGRP_SRC_QSPI_OFFSET		4
+#define CLKMGR_PERPLLGRP_SRC_QSPI_MASK			0x00000030
+#define CLKMGR_PERPLLGRP_SRC_RESET_VALUE		0x00000015
+#define CLKMGR_PERPLLGRP_SRC_SDMMC_OFFSET		0
+#define CLKMGR_PERPLLGRP_SRC_SDMMC_MASK			0x00000003
+#define CLKMGR_SDMMC_CLK_SRC_F2S			0x0
+#define CLKMGR_SDMMC_CLK_SRC_MAIN			0x1
+#define CLKMGR_SDMMC_CLK_SRC_PER			0x2
+#define CLKMGR_QSPI_CLK_SRC_F2S				0x0
+#define CLKMGR_QSPI_CLK_SRC_MAIN			0x1
+#define CLKMGR_QSPI_CLK_SRC_PER				0x2
+
+/* SDR PLL */
+#define CLKMGR_SDRPLLGRP_VCO_DENOM_OFFSET		16
+#define CLKMGR_SDRPLLGRP_VCO_DENOM_MASK			0x003f0000
+#define CLKMGR_SDRPLLGRP_VCO_NUMER_OFFSET		3
+#define CLKMGR_SDRPLLGRP_VCO_NUMER_MASK			0x0000fff8
+#define CLKMGR_SDRPLLGRP_VCO_OUTRESETALL		BIT(24)
+#define CLKMGR_SDRPLLGRP_VCO_OUTRESETALL_OFFSET		24
+#define CLKMGR_SDRPLLGRP_VCO_OUTRESET_OFFSET		25
+#define CLKMGR_SDRPLLGRP_VCO_OUTRESET_MASK		0x7e000000
+#define CLKMGR_SDRPLLGRP_VCO_REGEXTSEL_MASK		0x80000000
+#define CLKMGR_SDRPLLGRP_VCO_RESET_VALUE		0x8001000d
+#define CLKMGR_SDRPLLGRP_VCO_SSRC_OFFSET		22
+#define CLKMGR_SDRPLLGRP_VCO_SSRC_MASK			0x00c00000
+
+#define CLKMGR_SDRPLLGRP_DDRDQSCLK_CNT_OFFSET		0
+#define CLKMGR_SDRPLLGRP_DDRDQSCLK_CNT_MASK		0x000001ff
+#define CLKMGR_SDRPLLGRP_DDRDQSCLK_PHASE_OFFSET		9
+#define CLKMGR_SDRPLLGRP_DDRDQSCLK_PHASE_MASK		0x00000e00
+
+#define CLKMGR_SDRPLLGRP_DDR2XDQSCLK_CNT_OFFSET		0
+#define CLKMGR_SDRPLLGRP_DDR2XDQSCLK_CNT_MASK		0x000001ff
+#define CLKMGR_SDRPLLGRP_DDR2XDQSCLK_PHASE_OFFSET	9
+#define CLKMGR_SDRPLLGRP_DDR2XDQSCLK_PHASE_MASK		0x00000e00
+
+#define CLKMGR_SDRPLLGRP_DDRDQCLK_CNT_OFFSET		0
+#define CLKMGR_SDRPLLGRP_DDRDQCLK_CNT_MASK		0x000001ff
+#define CLKMGR_SDRPLLGRP_DDRDQCLK_PHASE_OFFSET		9
+#define CLKMGR_SDRPLLGRP_DDRDQCLK_PHASE_MASK		0x00000e00
+
+#define CLKMGR_SDRPLLGRP_S2FUSER2CLK_CNT_OFFSET		0
+#define CLKMGR_SDRPLLGRP_S2FUSER2CLK_CNT_MASK		0x000001ff
+#define CLKMGR_SDRPLLGRP_S2FUSER2CLK_PHASE_OFFSET	9
+#define CLKMGR_SDRPLLGRP_S2FUSER2CLK_PHASE_MASK		0x00000e00
+
+#endif /* _CLOCK_MANAGER_GEN5_H_ */
-- 
1.8.2.3

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 02/20] arm: socfpga: Update clock for Gen5
  2017-03-09  0:26 [U-Boot] [PATCH v2 00/20] Add Intel Arria 10 SoC support Ley Foon Tan
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 01/20] arm: socfpga: Restructure clock manager driver Ley Foon Tan
@ 2017-03-09  0:26 ` Ley Foon Tan
  2017-03-09 16:39   ` Dinh Nguyen
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 03/20] arm: socfpga: Restructure reset manager driver Ley Foon Tan
                   ` (19 subsequent siblings)
  21 siblings, 1 reply; 60+ messages in thread
From: Ley Foon Tan @ 2017-03-09  0:26 UTC (permalink / raw)
  To: u-boot

Rename some of variables and fixes on clock calculation.

Signed-off-by: Tien Fong Chee <tien.fong.chee@intel.com>
Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
---
 arch/arm/mach-socfpga/clock_manager_gen5.c | 126 +++++++++++++++++------------
 1 file changed, 76 insertions(+), 50 deletions(-)

diff --git a/arch/arm/mach-socfpga/clock_manager_gen5.c b/arch/arm/mach-socfpga/clock_manager_gen5.c
index bca27df..bef0adb 100644
--- a/arch/arm/mach-socfpga/clock_manager_gen5.c
+++ b/arch/arm/mach-socfpga/clock_manager_gen5.c
@@ -1,5 +1,5 @@
 /*
- *  Copyright (C) 2013-2017 Altera Corporation <www.altera.com>
+ * Copyright (C) 2013-2017 Altera Corporation <www.altera.com>
  *
  * SPDX-License-Identifier:	GPL-2.0+
  */
@@ -66,7 +66,6 @@ static void cm_write_with_phase(u32 value,
  * set source main and peripheral clocks
  * Ungate clocks
  */
-
 void cm_basic_init(const struct cm_config * const cfg)
 {
 	unsigned long end;
@@ -307,56 +306,73 @@ void cm_basic_init(const struct cm_config * const cfg)
 
 static unsigned int cm_get_main_vco_clk_hz(void)
 {
-	u32 reg, clock;
+	u32 src_hz, numer, denom, vco;
 
 	/* get the main VCO clock */
-	reg = readl(&clock_manager_base->main_pll.vco);
-	clock = cm_get_osc_clk_hz(1);
-	clock /= ((reg & CLKMGR_MAINPLLGRP_VCO_DENOM_MASK) >>
-		  CLKMGR_MAINPLLGRP_VCO_DENOM_OFFSET) + 1;
-	clock *= ((reg & CLKMGR_MAINPLLGRP_VCO_NUMER_MASK) >>
-		  CLKMGR_MAINPLLGRP_VCO_NUMER_OFFSET) + 1;
+	vco = readl(&clock_manager_base->main_pll.vco);
 
-	return clock;
+	numer = ((vco & CLKMGR_MAINPLLGRP_VCO_NUMER_MASK) >>
+		CLKMGR_MAINPLLGRP_VCO_NUMER_OFFSET);
+	denom = ((vco & CLKMGR_MAINPLLGRP_VCO_DENOM_MASK) >>
+		 CLKMGR_MAINPLLGRP_VCO_DENOM_OFFSET);
+
+	src_hz = cm_get_osc_clk_hz(1);
+
+	vco = src_hz;
+	vco /= (1 + denom);
+	vco *= (1 + numer);
+
+	return vco;
 }
 
 static unsigned int cm_get_per_vco_clk_hz(void)
 {
-	u32 reg, clock = 0;
+	u32 src_hz = 0;
+	u32 clk_src = 0;
+	u32 numer = 0;
+	u32 denom = 0;
+	u32 vco = 0;
 
 	/* identify PER PLL clock source */
-	reg = readl(&clock_manager_base->per_pll.vco);
-	reg = (reg & CLKMGR_PERPLLGRP_VCO_SSRC_MASK) >>
+	clk_src = readl(&clock_manager_base->per_pll.vco);
+	clk_src = (clk_src & CLKMGR_PERPLLGRP_VCO_SSRC_MASK) >>
 	      CLKMGR_PERPLLGRP_VCO_SSRC_OFFSET;
-	if (reg == CLKMGR_VCO_SSRC_EOSC1)
-		clock = cm_get_osc_clk_hz(1);
-	else if (reg == CLKMGR_VCO_SSRC_EOSC2)
-		clock = cm_get_osc_clk_hz(2);
-	else if (reg == CLKMGR_VCO_SSRC_F2S)
-		clock = cm_get_f2s_per_ref_clk_hz();
+	if (clk_src == CLKMGR_VCO_SSRC_EOSC1)
+		src_hz = cm_get_osc_clk_hz(1);
+	else if (clk_src == CLKMGR_VCO_SSRC_EOSC2)
+		src_hz = cm_get_osc_clk_hz(2);
+	else if (clk_src == CLKMGR_VCO_SSRC_F2S)
+		src_hz = cm_get_f2s_per_ref_clk_hz();
 
 	/* get the PER VCO clock */
-	reg = readl(&clock_manager_base->per_pll.vco);
-	clock /= ((reg & CLKMGR_PERPLLGRP_VCO_DENOM_MASK) >>
-		  CLKMGR_PERPLLGRP_VCO_DENOM_OFFSET) + 1;
-	clock *= ((reg & CLKMGR_PERPLLGRP_VCO_NUMER_MASK) >>
-		  CLKMGR_PERPLLGRP_VCO_NUMER_OFFSET) + 1;
+	vco = readl(&clock_manager_base->per_pll.vco);
 
-	return clock;
+	numer = (vco & CLKMGR_PERPLLGRP_VCO_NUMER_MASK) >>
+		CLKMGR_PERPLLGRP_VCO_NUMER_OFFSET;
+
+	denom = (vco & CLKMGR_PERPLLGRP_VCO_DENOM_MASK) >>
+		CLKMGR_PERPLLGRP_VCO_DENOM_OFFSET;
+
+	vco = src_hz;
+	vco /= (1 + denom);
+	vco *= (1 + numer);
+
+	return vco;
 }
 
 unsigned long cm_get_mpu_clk_hz(void)
 {
-	u32 reg, clock;
+	u32 reg, clk_hz;
 
-	clock = cm_get_main_vco_clk_hz();
+	clk_hz = cm_get_main_vco_clk_hz();
 
 	/* get the MPU clock */
 	reg = readl(&clock_manager_base->altera.mpuclk);
-	clock /= (reg + 1);
+	clk_hz /= (reg + 1);
 	reg = readl(&clock_manager_base->main_pll.mpuclk);
-	clock /= (reg + 1);
-	return clock;
+	clk_hz /= (reg + 1);
+
+	return clk_hz;
 }
 
 unsigned long cm_get_sdram_clk_hz(void)
@@ -392,7 +408,8 @@ unsigned long cm_get_sdram_clk_hz(void)
 
 unsigned int cm_get_l4_sp_clk_hz(void)
 {
-	u32 reg, clock = 0;
+	u32 clock = 0;
+	u32 reg;
 
 	/* identify the source of L4 SP clock */
 	reg = readl(&clock_manager_base->main_pll.l4src);
@@ -426,37 +443,45 @@ unsigned int cm_get_l4_sp_clk_hz(void)
 
 unsigned int cm_get_mmc_controller_clk_hz(void)
 {
-	u32 reg, clock = 0;
+	u32 clk_hz = 0;
+	u32 clk_input = 0;
 
-	/* identify the source of MMC clock */
-	reg = readl(&clock_manager_base->per_pll.src);
-	reg = (reg & CLKMGR_PERPLLGRP_SRC_SDMMC_MASK) >>
+	clk_input = readl(&clock_manager_base->per_pll.src);
+	clk_input = (clk_input & CLKMGR_PERPLLGRP_SRC_SDMMC_MASK) >>
 	      CLKMGR_PERPLLGRP_SRC_SDMMC_OFFSET;
 
-	if (reg == CLKMGR_SDMMC_CLK_SRC_F2S) {
-		clock = cm_get_f2s_per_ref_clk_hz();
-	} else if (reg == CLKMGR_SDMMC_CLK_SRC_MAIN) {
-		clock = cm_get_main_vco_clk_hz();
+	switch (clk_input) {
+	case CLKMGR_SDMMC_CLK_SRC_F2S:
+		clk_hz = cm_get_f2s_per_ref_clk_hz();
+		break;
+
+	case CLKMGR_SDMMC_CLK_SRC_MAIN:
+		clk_hz = cm_get_main_vco_clk_hz();
 
 		/* get the SDMMC clock */
-		reg = readl(&clock_manager_base->main_pll.mainnandsdmmcclk);
-		clock /= (reg + 1);
-	} else if (reg == CLKMGR_SDMMC_CLK_SRC_PER) {
-		clock = cm_get_per_vco_clk_hz();
+		clk_input =
+			readl(&clock_manager_base->main_pll.mainnandsdmmcclk);
+		clk_hz /= (clk_input + 1);
+		break;
+
+	case CLKMGR_SDMMC_CLK_SRC_PER:
+		clk_hz = cm_get_per_vco_clk_hz();
 
 		/* get the SDMMC clock */
-		reg = readl(&clock_manager_base->per_pll.pernandsdmmcclk);
-		clock /= (reg + 1);
+		clk_input =
+			readl(&clock_manager_base->per_pll.pernandsdmmcclk);
+		clk_hz /= (clk_input + 1);
+		break;
 	}
 
-	/* further divide by 4 as we have fixed divider at wrapper */
-	clock /= 4;
-	return clock;
+	return clk_hz / 4;
 }
 
+
 unsigned int cm_get_qspi_controller_clk_hz(void)
 {
-	u32 reg, clock = 0;
+	u32 clock = 0;
+	u32 reg;
 
 	/* identify the source of QSPI clock */
 	reg = readl(&clock_manager_base->per_pll.src);
@@ -484,7 +509,8 @@ unsigned int cm_get_qspi_controller_clk_hz(void)
 
 unsigned int cm_get_spi_controller_clk_hz(void)
 {
-	u32 reg, clock = 0;
+	u32 clock = 0;
+	u32 reg;
 
 	clock = cm_get_per_vco_clk_hz();
 
-- 
1.8.2.3

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 03/20] arm: socfpga: Restructure reset manager driver
  2017-03-09  0:26 [U-Boot] [PATCH v2 00/20] Add Intel Arria 10 SoC support Ley Foon Tan
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 01/20] arm: socfpga: Restructure clock manager driver Ley Foon Tan
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 02/20] arm: socfpga: Update clock for Gen5 Ley Foon Tan
@ 2017-03-09  0:26 ` Ley Foon Tan
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 04/20] arm: socfpga: Restructure misc driver Ley Foon Tan
                   ` (18 subsequent siblings)
  21 siblings, 0 replies; 60+ messages in thread
From: Ley Foon Tan @ 2017-03-09  0:26 UTC (permalink / raw)
  To: u-boot

Restructure reset manager driver in the preparation to support A10.
Move the Gen5 specific code to _gen5 files. Minor update in socfpga_per_reset().
No functional change.

Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
---
 arch/arm/mach-socfpga/Makefile                     |   2 +-
 arch/arm/mach-socfpga/include/mach/reset_manager.h |  42 +-------
 .../mach-socfpga/include/mach/reset_manager_gen5.h |  47 +++++++++
 arch/arm/mach-socfpga/reset_manager.c              |  93 +----------------
 arch/arm/mach-socfpga/reset_manager_gen5.c         | 113 +++++++++++++++++++++
 5 files changed, 168 insertions(+), 129 deletions(-)
 create mode 100644 arch/arm/mach-socfpga/include/mach/reset_manager_gen5.h
 create mode 100644 arch/arm/mach-socfpga/reset_manager_gen5.c

diff --git a/arch/arm/mach-socfpga/Makefile b/arch/arm/mach-socfpga/Makefile
index b76de4c..97819ac 100644
--- a/arch/arm/mach-socfpga/Makefile
+++ b/arch/arm/mach-socfpga/Makefile
@@ -14,7 +14,7 @@ obj-$(CONFIG_SPL_BUILD) += spl.o freeze_controller.o
 
 # QTS-generated config file wrappers
 obj-$(CONFIG_TARGET_SOCFPGA_GEN5)	+= scan_manager.o wrap_pll_config.o \
-					   clock_manager_gen5.o
+					   clock_manager_gen5.o reset_manager_gen5.o
 obj-$(CONFIG_SPL_BUILD) += wrap_iocsr_config.o wrap_pinmux_config.o	\
 			   wrap_sdram_config.o
 CFLAGS_wrap_iocsr_config.o	+= -I$(srctree)/board/$(BOARDDIR)
diff --git a/arch/arm/mach-socfpga/include/mach/reset_manager.h b/arch/arm/mach-socfpga/include/mach/reset_manager.h
index 2f070f2..9e253bf 100644
--- a/arch/arm/mach-socfpga/include/mach/reset_manager.h
+++ b/arch/arm/mach-socfpga/include/mach/reset_manager.h
@@ -1,5 +1,5 @@
 /*
- *  Copyright (C) 2012 Altera Corporation <www.altera.com>
+ *  Copyright (C) 2012-2017 Altera Corporation <www.altera.com>
  *
  * SPDX-License-Identifier:	GPL-2.0+
  */
@@ -8,27 +8,12 @@
 #define	_RESET_MANAGER_H_
 
 void reset_cpu(ulong addr);
-void reset_deassert_peripherals_handoff(void);
 
 void socfpga_bridges_reset(int enable);
 
 void socfpga_per_reset(u32 reset, int set);
 void socfpga_per_reset_all(void);
 
-struct socfpga_reset_manager {
-	u32	status;
-	u32	ctrl;
-	u32	counts;
-	u32	padding1;
-	u32	mpu_mod_reset;
-	u32	per_mod_reset;
-	u32	per2_mod_reset;
-	u32	brg_mod_reset;
-	u32	misc_mod_reset;
-	u32	padding2[12];
-	u32	tstscratch;
-};
-
 #if defined(CONFIG_SOCFPGA_VIRTUAL_TARGET)
 #define RSTMGR_CTRL_SWWARMRSTREQ_LSB 2
 #else
@@ -55,28 +40,11 @@ struct socfpga_reset_manager {
 #define RSTMGR_BANK(_reset)			\
 	(((_reset) >> RSTMGR_BANK_OFFSET) & RSTMGR_BANK_MASK)
 
-/*
- * SocFPGA Cyclone V/Arria V reset IDs, bank mapping is as follows:
- * 0 ... mpumodrst
- * 1 ... permodrst
- * 2 ... per2modrst
- * 3 ... brgmodrst
- * 4 ... miscmodrst
- */
-#define RSTMGR_EMAC0		RSTMGR_DEFINE(1, 0)
-#define RSTMGR_EMAC1		RSTMGR_DEFINE(1, 1)
-#define RSTMGR_NAND		RSTMGR_DEFINE(1, 4)
-#define RSTMGR_QSPI		RSTMGR_DEFINE(1, 5)
-#define RSTMGR_L4WD0		RSTMGR_DEFINE(1, 6)
-#define RSTMGR_OSC1TIMER0	RSTMGR_DEFINE(1, 8)
-#define RSTMGR_UART0		RSTMGR_DEFINE(1, 16)
-#define RSTMGR_SPIM0		RSTMGR_DEFINE(1, 18)
-#define RSTMGR_SPIM1		RSTMGR_DEFINE(1, 19)
-#define RSTMGR_SDMMC		RSTMGR_DEFINE(1, 22)
-#define RSTMGR_DMA		RSTMGR_DEFINE(1, 28)
-#define RSTMGR_SDR		RSTMGR_DEFINE(1, 29)
-
 /* Create a human-readable reference to SoCFPGA reset. */
 #define SOCFPGA_RESET(_name)	RSTMGR_##_name
 
+#if defined(CONFIG_TARGET_SOCFPGA_GEN5)
+#include <asm/arch/reset_manager_gen5.h>
+#endif
+
 #endif /* _RESET_MANAGER_H_ */
diff --git a/arch/arm/mach-socfpga/include/mach/reset_manager_gen5.h b/arch/arm/mach-socfpga/include/mach/reset_manager_gen5.h
new file mode 100644
index 0000000..028974a
--- /dev/null
+++ b/arch/arm/mach-socfpga/include/mach/reset_manager_gen5.h
@@ -0,0 +1,47 @@
+/*
+ *  Copyright (C) 2012-2017 Altera Corporation <www.altera.com>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#ifndef	_RESET_MANAGER_GEN5_H_
+#define	_RESET_MANAGER_GEN5_H_
+
+void reset_deassert_peripherals_handoff(void);
+
+struct socfpga_reset_manager {
+	u32	status;
+	u32	ctrl;
+	u32	counts;
+	u32	padding1;
+	u32	mpu_mod_reset;
+	u32	per_mod_reset;
+	u32	per2_mod_reset;
+	u32	brg_mod_reset;
+	u32	misc_mod_reset;
+	u32	padding2[12];
+	u32	tstscratch;
+};
+
+/*
+ * SocFPGA Cyclone V/Arria V reset IDs, bank mapping is as follows:
+ * 0 ... mpumodrst
+ * 1 ... permodrst
+ * 2 ... per2modrst
+ * 3 ... brgmodrst
+ * 4 ... miscmodrst
+ */
+#define RSTMGR_EMAC0		RSTMGR_DEFINE(1, 0)
+#define RSTMGR_EMAC1		RSTMGR_DEFINE(1, 1)
+#define RSTMGR_NAND		RSTMGR_DEFINE(1, 4)
+#define RSTMGR_QSPI		RSTMGR_DEFINE(1, 5)
+#define RSTMGR_L4WD0		RSTMGR_DEFINE(1, 6)
+#define RSTMGR_OSC1TIMER0	RSTMGR_DEFINE(1, 8)
+#define RSTMGR_UART0		RSTMGR_DEFINE(1, 16)
+#define RSTMGR_SPIM0		RSTMGR_DEFINE(1, 18)
+#define RSTMGR_SPIM1		RSTMGR_DEFINE(1, 19)
+#define RSTMGR_SDMMC		RSTMGR_DEFINE(1, 22)
+#define RSTMGR_DMA		RSTMGR_DEFINE(1, 28)
+#define RSTMGR_SDR		RSTMGR_DEFINE(1, 29)
+
+#endif /* _RESET_MANAGER_GEN5_H_ */
diff --git a/arch/arm/mach-socfpga/reset_manager.c b/arch/arm/mach-socfpga/reset_manager.c
index b6beaa2..29438ed 100644
--- a/arch/arm/mach-socfpga/reset_manager.c
+++ b/arch/arm/mach-socfpga/reset_manager.c
@@ -7,53 +7,12 @@
 
 #include <common.h>
 #include <asm/io.h>
-#include <asm/arch/fpga_manager.h>
 #include <asm/arch/reset_manager.h>
-#include <asm/arch/system_manager.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
 static const struct socfpga_reset_manager *reset_manager_base =
 		(void *)SOCFPGA_RSTMGR_ADDRESS;
-static struct socfpga_system_manager *sysmgr_regs =
-	(struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS;
-
-/* Assert or de-assert SoCFPGA reset manager reset. */
-void socfpga_per_reset(u32 reset, int set)
-{
-	const void *reg;
-
-	if (RSTMGR_BANK(reset) == 0)
-		reg = &reset_manager_base->mpu_mod_reset;
-	else if (RSTMGR_BANK(reset) == 1)
-		reg = &reset_manager_base->per_mod_reset;
-	else if (RSTMGR_BANK(reset) == 2)
-		reg = &reset_manager_base->per2_mod_reset;
-	else if (RSTMGR_BANK(reset) == 3)
-		reg = &reset_manager_base->brg_mod_reset;
-	else if (RSTMGR_BANK(reset) == 4)
-		reg = &reset_manager_base->misc_mod_reset;
-	else	/* Invalid reset register, do nothing */
-		return;
-
-	if (set)
-		setbits_le32(reg, 1 << RSTMGR_RESET(reset));
-	else
-		clrbits_le32(reg, 1 << RSTMGR_RESET(reset));
-}
-
-/*
- * Assert reset on every peripheral but L4WD0.
- * Watchdog must be kept intact to prevent glitches
- * and/or hangs.
- */
-void socfpga_per_reset_all(void)
-{
-	const u32 l4wd0 = 1 << RSTMGR_RESET(SOCFPGA_RESET(L4WD0));
-
-	writel(~l4wd0, &reset_manager_base->per_mod_reset);
-	writel(0xffffffff, &reset_manager_base->per2_mod_reset);
-}
 
 /*
  * Write the reset manager register to cause reset
@@ -61,8 +20,8 @@ void socfpga_per_reset_all(void)
 void reset_cpu(ulong addr)
 {
 	/* request a warm reset */
-	writel((1 << RSTMGR_CTRL_SWWARMRSTREQ_LSB),
-		&reset_manager_base->ctrl);
+	writel(1 << RSTMGR_CTRL_SWWARMRSTREQ_LSB,
+	       &reset_manager_base->ctrl);
 	/*
 	 * infinite loop here as watchdog will trigger and reset
 	 * the processor
@@ -70,51 +29,3 @@ void reset_cpu(ulong addr)
 	while (1)
 		;
 }
-
-/*
- * Release peripherals from reset based on handoff
- */
-void reset_deassert_peripherals_handoff(void)
-{
-	writel(0, &reset_manager_base->per_mod_reset);
-}
-
-#if defined(CONFIG_SOCFPGA_VIRTUAL_TARGET)
-void socfpga_bridges_reset(int enable)
-{
-	/* For SoCFPGA-VT, this is NOP. */
-}
-#else
-
-#define L3REGS_REMAP_LWHPS2FPGA_MASK	0x10
-#define L3REGS_REMAP_HPS2FPGA_MASK	0x08
-#define L3REGS_REMAP_OCRAM_MASK		0x01
-
-void socfpga_bridges_reset(int enable)
-{
-	const uint32_t l3mask = L3REGS_REMAP_LWHPS2FPGA_MASK |
-				L3REGS_REMAP_HPS2FPGA_MASK |
-				L3REGS_REMAP_OCRAM_MASK;
-
-	if (enable) {
-		/* brdmodrst */
-		writel(0xffffffff, &reset_manager_base->brg_mod_reset);
-	} else {
-		writel(0, &sysmgr_regs->iswgrp_handoff[0]);
-		writel(l3mask, &sysmgr_regs->iswgrp_handoff[1]);
-
-		/* Check signal from FPGA. */
-		if (!fpgamgr_test_fpga_ready()) {
-			/* FPGA not ready, do nothing. */
-			printf("%s: FPGA not ready, aborting.\n", __func__);
-			return;
-		}
-
-		/* brdmodrst */
-		writel(0, &reset_manager_base->brg_mod_reset);
-
-		/* Remap the bridges into memory map */
-		writel(l3mask, SOCFPGA_L3REGS_ADDRESS);
-	}
-}
-#endif
diff --git a/arch/arm/mach-socfpga/reset_manager_gen5.c b/arch/arm/mach-socfpga/reset_manager_gen5.c
new file mode 100644
index 0000000..54c0578
--- /dev/null
+++ b/arch/arm/mach-socfpga/reset_manager_gen5.c
@@ -0,0 +1,113 @@
+/*
+ *  Copyright (C) 2013 Altera Corporation <www.altera.com>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/arch/fpga_manager.h>
+#include <asm/arch/reset_manager.h>
+#include <asm/arch/system_manager.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static const struct socfpga_reset_manager *reset_manager_base =
+		(void *)SOCFPGA_RSTMGR_ADDRESS;
+static const struct socfpga_system_manager *sysmgr_regs =
+	(struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS;
+
+/* Assert or de-assert SoCFPGA reset manager reset. */
+void socfpga_per_reset(u32 reset, int set)
+{
+	const u32 *reg;
+	u32 rstmgr_bank = RSTMGR_BANK(reset);
+
+	switch (rstmgr_bank) {
+	case 0:
+		reg = &reset_manager_base->mpu_mod_reset;
+		break;
+	case 1:
+		reg = &reset_manager_base->per_mod_reset;
+		break;
+	case 2:
+		reg = &reset_manager_base->per2_mod_reset;
+		break;
+	case 3:
+		reg = &reset_manager_base->brg_mod_reset;
+		break;
+	case 4:
+		reg = &reset_manager_base->misc_mod_reset;
+		break;
+
+	default:
+		return;
+	}
+
+	if (set)
+		setbits_le32(reg, 1 << RSTMGR_RESET(reset));
+	else
+		clrbits_le32(reg, 1 << RSTMGR_RESET(reset));
+}
+
+/*
+ * Assert reset on every peripheral but L4WD0.
+ * Watchdog must be kept intact to prevent glitches
+ * and/or hangs.
+ */
+void socfpga_per_reset_all(void)
+{
+	const u32 l4wd0 = 1 << RSTMGR_RESET(SOCFPGA_RESET(L4WD0));
+
+	writel(~l4wd0, &reset_manager_base->per_mod_reset);
+	writel(0xffffffff, &reset_manager_base->per2_mod_reset);
+}
+
+/*
+ * Release peripherals from reset based on handoff
+ */
+void reset_deassert_peripherals_handoff(void)
+{
+	writel(0, &reset_manager_base->per_mod_reset);
+}
+
+#if defined(CONFIG_SOCFPGA_VIRTUAL_TARGET)
+void socfpga_bridges_reset(int enable)
+{
+	/* For SoCFPGA-VT, this is NOP. */
+}
+#else
+
+#define L3REGS_REMAP_LWHPS2FPGA_MASK	0x10
+#define L3REGS_REMAP_HPS2FPGA_MASK	0x08
+#define L3REGS_REMAP_OCRAM_MASK		0x01
+
+void socfpga_bridges_reset(int enable)
+{
+	const u32 l3mask = L3REGS_REMAP_LWHPS2FPGA_MASK |
+				L3REGS_REMAP_HPS2FPGA_MASK |
+				L3REGS_REMAP_OCRAM_MASK;
+
+	if (enable) {
+		/* brdmodrst */
+		writel(0xffffffff, &reset_manager_base->brg_mod_reset);
+	} else {
+		writel(0, &sysmgr_regs->iswgrp_handoff[0]);
+		writel(l3mask, &sysmgr_regs->iswgrp_handoff[1]);
+
+		/* Check signal from FPGA. */
+		if (!fpgamgr_test_fpga_ready()) {
+			/* FPGA not ready, do nothing. */
+			printf("%s: FPGA not ready, aborting.\n", __func__);
+			return;
+		}
+
+		/* brdmodrst */
+		writel(0, &reset_manager_base->brg_mod_reset);
+
+		/* Remap the bridges into memory map */
+		writel(l3mask, SOCFPGA_L3REGS_ADDRESS);
+	}
+}
+#endif
-- 
1.8.2.3

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 04/20] arm: socfpga: Restructure misc driver
  2017-03-09  0:26 [U-Boot] [PATCH v2 00/20] Add Intel Arria 10 SoC support Ley Foon Tan
                   ` (2 preceding siblings ...)
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 03/20] arm: socfpga: Restructure reset manager driver Ley Foon Tan
@ 2017-03-09  0:26 ` Ley Foon Tan
  2017-03-10  1:36   ` Marek Vasut
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 05/20] arm: socfpga: Restructure system manager Ley Foon Tan
                   ` (17 subsequent siblings)
  21 siblings, 1 reply; 60+ messages in thread
From: Ley Foon Tan @ 2017-03-09  0:26 UTC (permalink / raw)
  To: u-boot

Restructure misc driver in the preparation to support A10.
Move the Gen5 specific code to _gen5 file. No functional change.

Change all uint32_t_to u32.

Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
---
 arch/arm/mach-socfpga/Makefile            |   3 +-
 arch/arm/mach-socfpga/include/mach/misc.h |  26 +++
 arch/arm/mach-socfpga/misc.c              | 361 ++----------------------------
 arch/arm/mach-socfpga/misc_gen5.c         | 355 +++++++++++++++++++++++++++++
 4 files changed, 398 insertions(+), 347 deletions(-)
 create mode 100644 arch/arm/mach-socfpga/include/mach/misc.h
 create mode 100644 arch/arm/mach-socfpga/misc_gen5.c

diff --git a/arch/arm/mach-socfpga/Makefile b/arch/arm/mach-socfpga/Makefile
index 97819ac..5b09ea9 100644
--- a/arch/arm/mach-socfpga/Makefile
+++ b/arch/arm/mach-socfpga/Makefile
@@ -14,7 +14,8 @@ obj-$(CONFIG_SPL_BUILD) += spl.o freeze_controller.o
 
 # QTS-generated config file wrappers
 obj-$(CONFIG_TARGET_SOCFPGA_GEN5)	+= scan_manager.o wrap_pll_config.o \
-					   clock_manager_gen5.o reset_manager_gen5.o
+					   clock_manager_gen5.o reset_manager_gen5.o \
+					   misc_gen5.o
 obj-$(CONFIG_SPL_BUILD) += wrap_iocsr_config.o wrap_pinmux_config.o	\
 			   wrap_sdram_config.o
 CFLAGS_wrap_iocsr_config.o	+= -I$(srctree)/board/$(BOARDDIR)
diff --git a/arch/arm/mach-socfpga/include/mach/misc.h b/arch/arm/mach-socfpga/include/mach/misc.h
new file mode 100644
index 0000000..64f9b86
--- /dev/null
+++ b/arch/arm/mach-socfpga/include/mach/misc.h
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2016-2017 Intel Corporation
+ *
+ * SPDX-License-Identifier:    GPL-2.0
+ */
+
+#ifndef _MISC_H_
+#define _MISC_H_
+
+void dwmac_deassert_reset(const unsigned int of_reset_id,
+				 const u32 phymode);
+
+struct bsel {
+	const char	*mode;
+	const char	*name;
+};
+
+extern struct bsel bsel_str[];
+
+#ifdef CONFIG_FPGA
+void socfpga_fpga_add(void);
+#else
+inline void socfpga_fpga_add(void) {}
+#endif
+
+#endif /* _MISC_H_ */
diff --git a/arch/arm/mach-socfpga/misc.c b/arch/arm/mach-socfpga/misc.c
index dd6b53b..cd250af 100644
--- a/arch/arm/mach-socfpga/misc.c
+++ b/arch/arm/mach-socfpga/misc.c
@@ -1,5 +1,5 @@
 /*
- *  Copyright (C) 2012 Altera Corporation <www.altera.com>
+ *  Copyright (C) 2012-2017 Altera Corporation <www.altera.com>
  *
  * SPDX-License-Identifier:	GPL-2.0+
  */
@@ -13,6 +13,7 @@
 #include <miiphy.h>
 #include <netdev.h>
 #include <watchdog.h>
+#include <asm/arch/misc.h>
 #include <asm/arch/reset_manager.h>
 #include <asm/arch/scan_manager.h>
 #include <asm/arch/system_manager.h>
@@ -24,16 +25,19 @@
 
 DECLARE_GLOBAL_DATA_PTR;
 
-static struct pl310_regs *const pl310 =
+static const struct pl310_regs *const pl310 =
 	(struct pl310_regs *)CONFIG_SYS_PL310_BASE;
-static struct socfpga_system_manager *sysmgr_regs =
-	(struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS;
-static struct socfpga_reset_manager *reset_manager_base =
-	(struct socfpga_reset_manager *)SOCFPGA_RSTMGR_ADDRESS;
-static struct nic301_registers *nic301_regs =
-	(struct nic301_registers *)SOCFPGA_L3REGS_ADDRESS;
-static struct scu_registers *scu_regs =
-	(struct scu_registers *)SOCFPGA_MPUSCU_ADDRESS;
+
+struct bsel bsel_str[] = {
+	{ "rsvd", "Reserved", },
+	{ "fpga", "FPGA (HPS2FPGA Bridge)", },
+	{ "nand", "NAND Flash (1.8V)", },
+	{ "nand", "NAND Flash (3.0V)", },
+	{ "sd", "SD/MMC External Transceiver (1.8V)", },
+	{ "sd", "SD/MMC Internal Transceiver (3.0V)", },
+	{ "qspi", "QSPI Flash (1.8V)", },
+	{ "qspi", "QSPI Flash (3.0V)", },
+};
 
 int dram_init(void)
 {
@@ -72,207 +76,6 @@ void v7_outer_cache_disable(void)
 	clrbits_le32(&pl310->pl310_ctrl, L2X0_CTRL_EN);
 }
 
-/*
- * DesignWare Ethernet initialization
- */
-#ifdef CONFIG_ETH_DESIGNWARE
-static void dwmac_deassert_reset(const unsigned int of_reset_id,
-				 const u32 phymode)
-{
-	u32 physhift, reset;
-
-	if (of_reset_id == EMAC0_RESET) {
-		physhift = SYSMGR_EMACGRP_CTRL_PHYSEL0_LSB;
-		reset = SOCFPGA_RESET(EMAC0);
-	} else if (of_reset_id == EMAC1_RESET) {
-		physhift = SYSMGR_EMACGRP_CTRL_PHYSEL1_LSB;
-		reset = SOCFPGA_RESET(EMAC1);
-	} else {
-		printf("GMAC: Invalid reset ID (%i)!\n", of_reset_id);
-		return;
-	}
-
-	/* Clearing emac0 PHY interface select to 0 */
-	clrbits_le32(&sysmgr_regs->emacgrp_ctrl,
-		     SYSMGR_EMACGRP_CTRL_PHYSEL_MASK << physhift);
-
-	/* configure to PHY interface select choosed */
-	setbits_le32(&sysmgr_regs->emacgrp_ctrl,
-		     phymode << physhift);
-
-	/* Release the EMAC controller from reset */
-	socfpga_per_reset(reset, 0);
-}
-
-static u32 dwmac_phymode_to_modereg(const char *phymode, u32 *modereg)
-{
-	if (!phymode)
-		return -EINVAL;
-
-	if (!strcmp(phymode, "mii") || !strcmp(phymode, "gmii")) {
-		*modereg = SYSMGR_EMACGRP_CTRL_PHYSEL_ENUM_GMII_MII;
-		return 0;
-	}
-
-	if (!strcmp(phymode, "rgmii")) {
-		*modereg = SYSMGR_EMACGRP_CTRL_PHYSEL_ENUM_RGMII;
-		return 0;
-	}
-
-	if (!strcmp(phymode, "rmii")) {
-		*modereg = SYSMGR_EMACGRP_CTRL_PHYSEL_ENUM_RMII;
-		return 0;
-	}
-
-	return -EINVAL;
-}
-
-static int socfpga_eth_reset(void)
-{
-	const void *fdt = gd->fdt_blob;
-	struct fdtdec_phandle_args args;
-	const char *phy_mode;
-	u32 phy_modereg;
-	int nodes[2];	/* Max. two GMACs */
-	int ret, count;
-	int i, node;
-
-	/* Put both GMACs into RESET state. */
-	socfpga_per_reset(SOCFPGA_RESET(EMAC0), 1);
-	socfpga_per_reset(SOCFPGA_RESET(EMAC1), 1);
-
-	count = fdtdec_find_aliases_for_id(fdt, "ethernet",
-					   COMPAT_ALTERA_SOCFPGA_DWMAC,
-					   nodes, ARRAY_SIZE(nodes));
-	for (i = 0; i < count; i++) {
-		node = nodes[i];
-		if (node <= 0)
-			continue;
-
-		ret = fdtdec_parse_phandle_with_args(fdt, node, "resets",
-						     "#reset-cells", 1, 0,
-						     &args);
-		if (ret || (args.args_count != 1)) {
-			debug("GMAC%i: Failed to parse DT 'resets'!\n", i);
-			continue;
-		}
-
-		phy_mode = fdt_getprop(fdt, node, "phy-mode", NULL);
-		ret = dwmac_phymode_to_modereg(phy_mode, &phy_modereg);
-		if (ret) {
-			debug("GMAC%i: Failed to parse DT 'phy-mode'!\n", i);
-			continue;
-		}
-
-		dwmac_deassert_reset(args.args[0], phy_modereg);
-	}
-
-	return 0;
-}
-#else
-static int socfpga_eth_reset(void)
-{
-	return 0;
-};
-#endif
-
-struct {
-	const char	*mode;
-	const char	*name;
-} bsel_str[] = {
-	{ "rsvd", "Reserved", },
-	{ "fpga", "FPGA (HPS2FPGA Bridge)", },
-	{ "nand", "NAND Flash (1.8V)", },
-	{ "nand", "NAND Flash (3.0V)", },
-	{ "sd", "SD/MMC External Transceiver (1.8V)", },
-	{ "sd", "SD/MMC Internal Transceiver (3.0V)", },
-	{ "qspi", "QSPI Flash (1.8V)", },
-	{ "qspi", "QSPI Flash (3.0V)", },
-};
-
-static const struct {
-	const u16	pn;
-	const char	*name;
-	const char	*var;
-} const socfpga_fpga_model[] = {
-	/* Cyclone V E */
-	{ 0x2b15, "Cyclone V, E/A2", "cv_e_a2" },
-	{ 0x2b05, "Cyclone V, E/A4", "cv_e_a4" },
-	{ 0x2b22, "Cyclone V, E/A5", "cv_e_a5" },
-	{ 0x2b13, "Cyclone V, E/A7", "cv_e_a7" },
-	{ 0x2b14, "Cyclone V, E/A9", "cv_e_a9" },
-	/* Cyclone V GX/GT */
-	{ 0x2b01, "Cyclone V, GX/C3", "cv_gx_c3" },
-	{ 0x2b12, "Cyclone V, GX/C4", "cv_gx_c4" },
-	{ 0x2b02, "Cyclone V, GX/C5 or GT/D5", "cv_gx_c5" },
-	{ 0x2b03, "Cyclone V, GX/C7 or GT/D7", "cv_gx_c7" },
-	{ 0x2b04, "Cyclone V, GX/C9 or GT/D9", "cv_gx_c9" },
-	/* Cyclone V SE/SX/ST */
-	{ 0x2d11, "Cyclone V, SE/A2 or SX/C2", "cv_se_a2" },
-	{ 0x2d01, "Cyclone V, SE/A4 or SX/C4", "cv_se_a4" },
-	{ 0x2d12, "Cyclone V, SE/A5 or SX/C5 or ST/D5", "cv_se_a5" },
-	{ 0x2d02, "Cyclone V, SE/A6 or SX/C6 or ST/D6", "cv_se_a6" },
-	/* Arria V */
-	{ 0x2d03, "Arria V, D5", "av_d5" },
-};
-
-static int socfpga_fpga_id(const bool print_id)
-{
-	const u32 altera_mi = 0x6e;
-	const u32 id = scan_mgr_get_fpga_id();
-
-	const u32 lsb = id & 0x00000001;
-	const u32 mi = (id >> 1) & 0x000007ff;
-	const u32 pn = (id >> 12) & 0x0000ffff;
-	const u32 version = (id >> 28) & 0x0000000f;
-	int i;
-
-	if ((mi != altera_mi) || (lsb != 1)) {
-		printf("FPGA:  Not Altera chip ID\n");
-		return -EINVAL;
-	}
-
-	for (i = 0; i < ARRAY_SIZE(socfpga_fpga_model); i++)
-		if (pn == socfpga_fpga_model[i].pn)
-			break;
-
-	if (i == ARRAY_SIZE(socfpga_fpga_model)) {
-		printf("FPGA:  Unknown Altera chip, ID 0x%08x\n", id);
-		return -EINVAL;
-	}
-
-	if (print_id)
-		printf("FPGA:  Altera %s, version 0x%01x\n",
-		       socfpga_fpga_model[i].name, version);
-	return i;
-}
-
-/*
- * Print CPU information
- */
-#if defined(CONFIG_DISPLAY_CPUINFO)
-int print_cpuinfo(void)
-{
-	const u32 bsel = readl(&sysmgr_regs->bootinfo) & 0x7;
-	puts("CPU:   Altera SoCFPGA Platform\n");
-	socfpga_fpga_id(1);
-	printf("BOOT:  %s\n", bsel_str[bsel].name);
-	return 0;
-}
-#endif
-
-#ifdef CONFIG_ARCH_MISC_INIT
-int arch_misc_init(void)
-{
-	const u32 bsel = readl(&sysmgr_regs->bootinfo) & 0x7;
-	const int fpga_id = socfpga_fpga_id(0);
-	setenv("bootmode", bsel_str[bsel].mode);
-	if (fpga_id >= 0)
-		setenv("fpgatype", socfpga_fpga_model[fpga_id].var);
-	return socfpga_eth_reset();
-}
-#endif
-
 #if defined(CONFIG_SYS_CONSOLE_IS_IN_ENV) && \
 defined(CONFIG_SYS_CONSOLE_OVERWRITE_ROUTINE)
 int overwrite_console(void)
@@ -303,15 +106,13 @@ static Altera_desc altera_fpga[] = {
 };
 
 /* add device descriptor to FPGA device table */
-static void socfpga_fpga_add(void)
+void socfpga_fpga_add(void)
 {
 	int i;
 	fpga_init();
 	for (i = 0; i < ARRAY_SIZE(altera_fpga); i++)
 		fpga_add(fpga_altera, &altera_fpga[i]);
 }
-#else
-static inline void socfpga_fpga_add(void) {}
 #endif
 
 int arch_cpu_init(void)
@@ -337,135 +138,3 @@ int arch_cpu_init(void)
 
 	return 0;
 }
-
-/*
- * Convert all NIC-301 AMBA slaves from secure to non-secure
- */
-static void socfpga_nic301_slave_ns(void)
-{
-	writel(0x1, &nic301_regs->lwhps2fpgaregs);
-	writel(0x1, &nic301_regs->hps2fpgaregs);
-	writel(0x1, &nic301_regs->acp);
-	writel(0x1, &nic301_regs->rom);
-	writel(0x1, &nic301_regs->ocram);
-	writel(0x1, &nic301_regs->sdrdata);
-}
-
-static uint32_t iswgrp_handoff[8];
-
-int arch_early_init_r(void)
-{
-	int i;
-
-	/*
-	 * Write magic value into magic register to unlock support for
-	 * issuing warm reset. The ancient kernel code expects this
-	 * value to be written into the register by the bootloader, so
-	 * to support that old code, we write it here instead of in the
-	 * reset_cpu() function just before resetting the CPU.
-	 */
-	writel(0xae9efebc, &sysmgr_regs->romcodegrp_warmramgrp_enable);
-
-	for (i = 0; i < 8; i++)	/* Cache initial SW setting regs */
-		iswgrp_handoff[i] = readl(&sysmgr_regs->iswgrp_handoff[i]);
-
-	socfpga_bridges_reset(1);
-	socfpga_nic301_slave_ns();
-
-	/*
-	 * Private components security:
-	 * U-Boot : configure private timer, global timer and cpu component
-	 * access as non secure for kernel stage (as required by Linux)
-	 */
-	setbits_le32(&scu_regs->sacr, 0xfff);
-
-	/* Configure the L2 controller to make SDRAM start at 0 */
-#ifdef CONFIG_SOCFPGA_VIRTUAL_TARGET
-	writel(0x2, &nic301_regs->remap);
-#else
-	writel(0x1, &nic301_regs->remap);	/* remap.mpuzero */
-	writel(0x1, &pl310->pl310_addr_filter_start);
-#endif
-
-	/* Add device descriptor to FPGA device table */
-	socfpga_fpga_add();
-
-#ifdef CONFIG_DESIGNWARE_SPI
-	/* Get Designware SPI controller out of reset */
-	socfpga_per_reset(SOCFPGA_RESET(SPIM0), 0);
-	socfpga_per_reset(SOCFPGA_RESET(SPIM1), 0);
-#endif
-
-#ifdef CONFIG_NAND_DENALI
-	socfpga_per_reset(SOCFPGA_RESET(NAND), 0);
-#endif
-
-	return 0;
-}
-
-static void socfpga_sdram_apply_static_cfg(void)
-{
-	const uint32_t staticcfg = SOCFPGA_SDR_ADDRESS + 0x505c;
-	const uint32_t applymask = 0x8;
-	uint32_t val = readl(staticcfg) | applymask;
-
-	/*
-	 * SDRAM staticcfg register specific:
-	 * When applying the register setting, the CPU must not access
-	 * SDRAM. Luckily for us, we can abuse i-cache here to help us
-	 * circumvent the SDRAM access issue. The idea is to make sure
-	 * that the code is in one full i-cache line by branching past
-	 * it and back. Once it is in the i-cache, we execute the core
-	 * of the code and apply the register settings.
-	 *
-	 * The code below uses 7 instructions, while the Cortex-A9 has
-	 * 32-byte cachelines, thus the limit is 8 instructions total.
-	 */
-	asm volatile(
-		".align	5			\n"
-		"	b	2f		\n"
-		"1:	str	%0,	[%1]	\n"
-		"	dsb			\n"
-		"	isb			\n"
-		"	b	3f		\n"
-		"2:	b	1b		\n"
-		"3:	nop			\n"
-	: : "r"(val), "r"(staticcfg) : "memory", "cc");
-}
-
-int do_bridge(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
-{
-	if (argc != 2)
-		return CMD_RET_USAGE;
-
-	argv++;
-
-	switch (*argv[0]) {
-	case 'e':	/* Enable */
-		writel(iswgrp_handoff[2], &sysmgr_regs->fpgaintfgrp_module);
-		socfpga_sdram_apply_static_cfg();
-		writel(iswgrp_handoff[3], SOCFPGA_SDR_ADDRESS + 0x5080);
-		writel(iswgrp_handoff[0], &reset_manager_base->brg_mod_reset);
-		writel(iswgrp_handoff[1], &nic301_regs->remap);
-		break;
-	case 'd':	/* Disable */
-		writel(0, &sysmgr_regs->fpgaintfgrp_module);
-		writel(0, SOCFPGA_SDR_ADDRESS + 0x5080);
-		socfpga_sdram_apply_static_cfg();
-		writel(0, &reset_manager_base->brg_mod_reset);
-		writel(1, &nic301_regs->remap);
-		break;
-	default:
-		return CMD_RET_USAGE;
-	}
-
-	return 0;
-}
-
-U_BOOT_CMD(
-	bridge, 2, 1, do_bridge,
-	"SoCFPGA HPS FPGA bridge control",
-	"enable  - Enable HPS-to-FPGA, FPGA-to-HPS, LWHPS-to-FPGA bridges\n"
-	"bridge disable - Enable HPS-to-FPGA, FPGA-to-HPS, LWHPS-to-FPGA bridges\n"
-	""
-);
diff --git a/arch/arm/mach-socfpga/misc_gen5.c b/arch/arm/mach-socfpga/misc_gen5.c
new file mode 100644
index 0000000..f870e1f
--- /dev/null
+++ b/arch/arm/mach-socfpga/misc_gen5.c
@@ -0,0 +1,355 @@
+/*
+ *  Copyright (C) 2012-2017 Altera Corporation <www.altera.com>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <errno.h>
+#include <fdtdec.h>
+#include <libfdt.h>
+#include <altera.h>
+#include <miiphy.h>
+#include <netdev.h>
+#include <watchdog.h>
+#include <asm/arch/misc.h>
+#include <asm/arch/reset_manager.h>
+#include <asm/arch/scan_manager.h>
+#include <asm/arch/system_manager.h>
+#include <asm/arch/nic301.h>
+#include <asm/arch/scu.h>
+#include <asm/pl310.h>
+
+#include <dt-bindings/reset/altr,rst-mgr.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static struct pl310_regs *const pl310 =
+	(struct pl310_regs *)CONFIG_SYS_PL310_BASE;
+static struct socfpga_system_manager *sysmgr_regs =
+	(struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS;
+static struct socfpga_reset_manager *reset_manager_base =
+	(struct socfpga_reset_manager *)SOCFPGA_RSTMGR_ADDRESS;
+static struct nic301_registers *nic301_regs =
+	(struct nic301_registers *)SOCFPGA_L3REGS_ADDRESS;
+static struct scu_registers *scu_regs =
+	(struct scu_registers *)SOCFPGA_MPUSCU_ADDRESS;
+
+/*
+ * DesignWare Ethernet initialization
+ */
+#ifdef CONFIG_ETH_DESIGNWARE
+void dwmac_deassert_reset(const unsigned int of_reset_id,
+				 const u32 phymode)
+{
+	u32 physhift, reset;
+
+	if (of_reset_id == EMAC0_RESET) {
+		physhift = SYSMGR_EMACGRP_CTRL_PHYSEL0_LSB;
+		reset = SOCFPGA_RESET(EMAC0);
+	} else if (of_reset_id == EMAC1_RESET) {
+		physhift = SYSMGR_EMACGRP_CTRL_PHYSEL1_LSB;
+		reset = SOCFPGA_RESET(EMAC1);
+	} else {
+		printf("GMAC: Invalid reset ID (%i)!\n", of_reset_id);
+		return;
+	}
+
+	/* configure to PHY interface select choosed */
+	clrsetbits_le32(&sysmgr_regs->emacgrp_ctrl,
+			SYSMGR_EMACGRP_CTRL_PHYSEL_MASK << physhift,
+			phymode << physhift);
+
+	/* Release the EMAC controller from reset */
+	socfpga_per_reset(reset, 0);
+}
+
+static u32 dwmac_phymode_to_modereg(const char *phymode, u32 *modereg)
+{
+	if (!phymode)
+		return -EINVAL;
+
+	if (!strcmp(phymode, "mii") || !strcmp(phymode, "gmii")) {
+		*modereg = SYSMGR_EMACGRP_CTRL_PHYSEL_ENUM_GMII_MII;
+		return 0;
+	}
+
+	if (!strcmp(phymode, "rgmii")) {
+		*modereg = SYSMGR_EMACGRP_CTRL_PHYSEL_ENUM_RGMII;
+		return 0;
+	}
+
+	if (!strcmp(phymode, "rmii")) {
+		*modereg = SYSMGR_EMACGRP_CTRL_PHYSEL_ENUM_RMII;
+		return 0;
+	}
+
+	return -EINVAL;
+}
+
+static int socfpga_eth_reset(void)
+{
+	const void *fdt = gd->fdt_blob;
+	struct fdtdec_phandle_args args;
+	const char *phy_mode;
+	u32 phy_modereg;
+	int nodes[2];	/* Max. two GMACs */
+	int ret, count;
+	int i, node;
+
+	/* Put both GMACs into RESET state. */
+	socfpga_per_reset(SOCFPGA_RESET(EMAC0), 1);
+	socfpga_per_reset(SOCFPGA_RESET(EMAC1), 1);
+
+	count = fdtdec_find_aliases_for_id(fdt, "ethernet",
+					   COMPAT_ALTERA_SOCFPGA_DWMAC,
+					   nodes, ARRAY_SIZE(nodes));
+	for (i = 0; i < count; i++) {
+		node = nodes[i];
+		if (node <= 0)
+			continue;
+
+		ret = fdtdec_parse_phandle_with_args(fdt, node, "resets",
+						     "#reset-cells", 1, 0,
+						     &args);
+		if (ret || (args.args_count != 1)) {
+			debug("GMAC%i: Failed to parse DT 'resets'!\n", i);
+			continue;
+		}
+
+		phy_mode = fdt_getprop(fdt, node, "phy-mode", NULL);
+		ret = dwmac_phymode_to_modereg(phy_mode, &phy_modereg);
+		if (ret) {
+			debug("GMAC%i: Failed to parse DT 'phy-mode'!\n", i);
+			continue;
+		}
+
+		dwmac_deassert_reset(args.args[0], phy_modereg);
+	}
+
+	return 0;
+}
+#else
+static int socfpga_eth_reset(void)
+{
+	return 0;
+};
+#endif
+
+static const struct {
+	const u16	pn;
+	const char	*name;
+	const char	*var;
+} const socfpga_fpga_model[] = {
+	/* Cyclone V E */
+	{ 0x2b15, "Cyclone V, E/A2", "cv_e_a2" },
+	{ 0x2b05, "Cyclone V, E/A4", "cv_e_a4" },
+	{ 0x2b22, "Cyclone V, E/A5", "cv_e_a5" },
+	{ 0x2b13, "Cyclone V, E/A7", "cv_e_a7" },
+	{ 0x2b14, "Cyclone V, E/A9", "cv_e_a9" },
+	/* Cyclone V GX/GT */
+	{ 0x2b01, "Cyclone V, GX/C3", "cv_gx_c3" },
+	{ 0x2b12, "Cyclone V, GX/C4", "cv_gx_c4" },
+	{ 0x2b02, "Cyclone V, GX/C5 or GT/D5", "cv_gx_c5" },
+	{ 0x2b03, "Cyclone V, GX/C7 or GT/D7", "cv_gx_c7" },
+	{ 0x2b04, "Cyclone V, GX/C9 or GT/D9", "cv_gx_c9" },
+	/* Cyclone V SE/SX/ST */
+	{ 0x2d11, "Cyclone V, SE/A2 or SX/C2", "cv_se_a2" },
+	{ 0x2d01, "Cyclone V, SE/A4 or SX/C4", "cv_se_a4" },
+	{ 0x2d12, "Cyclone V, SE/A5 or SX/C5 or ST/D5", "cv_se_a5" },
+	{ 0x2d02, "Cyclone V, SE/A6 or SX/C6 or ST/D6", "cv_se_a6" },
+	/* Arria V */
+	{ 0x2d03, "Arria V, D5", "av_d5" },
+};
+
+static int socfpga_fpga_id(const bool print_id)
+{
+	const u32 altera_mi = 0x6e;
+	const u32 id = scan_mgr_get_fpga_id();
+
+	const u32 lsb = id & 0x00000001;
+	const u32 mi = (id >> 1) & 0x000007ff;
+	const u32 pn = (id >> 12) & 0x0000ffff;
+	const u32 version = (id >> 28) & 0x0000000f;
+	int i;
+
+	if ((mi != altera_mi) || (lsb != 1)) {
+		printf("FPGA:  Not Altera chip ID\n");
+		return -EINVAL;
+	}
+
+	for (i = 0; i < ARRAY_SIZE(socfpga_fpga_model); i++)
+		if (pn == socfpga_fpga_model[i].pn)
+			break;
+
+	if (i == ARRAY_SIZE(socfpga_fpga_model)) {
+		printf("FPGA:  Unknown Altera chip, ID 0x%08x\n", id);
+		return -EINVAL;
+	}
+
+	if (print_id)
+		printf("FPGA:  Altera %s, version 0x%01x\n",
+		       socfpga_fpga_model[i].name, version);
+	return i;
+}
+
+/*
+ * Print CPU information
+ */
+#if defined(CONFIG_DISPLAY_CPUINFO)
+int print_cpuinfo(void)
+{
+	const u32 bsel = readl(&sysmgr_regs->bootinfo) & 0x7;
+
+	puts("CPU:   Altera SoCFPGA Platform\n");
+	socfpga_fpga_id(1);
+
+	printf("BOOT:  %s\n", bsel_str[bsel].name);
+	return 0;
+}
+#endif
+
+#ifdef CONFIG_ARCH_MISC_INIT
+int arch_misc_init(void)
+{
+	const u32 bsel = readl(&sysmgr_regs->bootinfo) & 0x7;
+	const int fpga_id = socfpga_fpga_id(0);
+	setenv("bootmode", bsel_str[bsel].mode);
+	if (fpga_id >= 0)
+		setenv("fpgatype", socfpga_fpga_model[fpga_id].var);
+	return socfpga_eth_reset();
+}
+#endif
+
+/*
+ * Convert all NIC-301 AMBA slaves from secure to non-secure
+ */
+static void socfpga_nic301_slave_ns(void)
+{
+	writel(0x1, &nic301_regs->lwhps2fpgaregs);
+	writel(0x1, &nic301_regs->hps2fpgaregs);
+	writel(0x1, &nic301_regs->acp);
+	writel(0x1, &nic301_regs->rom);
+	writel(0x1, &nic301_regs->ocram);
+	writel(0x1, &nic301_regs->sdrdata);
+}
+
+static u32 iswgrp_handoff[8];
+
+int arch_early_init_r(void)
+{
+	int i;
+
+	/*
+	 * Write magic value into magic register to unlock support for
+	 * issuing warm reset. The ancient kernel code expects this
+	 * value to be written into the register by the bootloader, so
+	 * to support that old code, we write it here instead of in the
+	 * reset_cpu() function just before resetting the CPU.
+	 */
+	writel(0xae9efebc, &sysmgr_regs->romcodegrp_warmramgrp_enable);
+
+	for (i = 0; i < 8; i++)	/* Cache initial SW setting regs */
+		iswgrp_handoff[i] = readl(&sysmgr_regs->iswgrp_handoff[i]);
+
+	socfpga_bridges_reset(1);
+	socfpga_nic301_slave_ns();
+
+	/*
+	 * Private components security:
+	 * U-Boot : configure private timer, global timer and cpu component
+	 * access as non secure for kernel stage (as required by Linux)
+	 */
+	setbits_le32(&scu_regs->sacr, 0xfff);
+
+	/* Configure the L2 controller to make SDRAM start at 0 */
+#ifdef CONFIG_SOCFPGA_VIRTUAL_TARGET
+	writel(0x2, &nic301_regs->remap);
+#else
+	writel(0x1, &nic301_regs->remap);	/* remap.mpuzero */
+	writel(0x1, &pl310->pl310_addr_filter_start);
+#endif
+
+	/* Add device descriptor to FPGA device table */
+	socfpga_fpga_add();
+
+#ifdef CONFIG_DESIGNWARE_SPI
+	/* Get Designware SPI controller out of reset */
+	socfpga_per_reset(SOCFPGA_RESET(SPIM0), 0);
+	socfpga_per_reset(SOCFPGA_RESET(SPIM1), 0);
+#endif
+
+#ifdef CONFIG_NAND_DENALI
+	socfpga_per_reset(SOCFPGA_RESET(NAND), 0);
+#endif
+
+	return 0;
+}
+
+static void socfpga_sdram_apply_static_cfg(void)
+{
+	const u32 staticcfg = SOCFPGA_SDR_ADDRESS + 0x505c;
+	const u32 applymask = 0x8;
+	u32 val = readl(staticcfg) | applymask;
+
+	/*
+	 * SDRAM staticcfg register specific:
+	 * When applying the register setting, the CPU must not access
+	 * SDRAM. Luckily for us, we can abuse i-cache here to help us
+	 * circumvent the SDRAM access issue. The idea is to make sure
+	 * that the code is in one full i-cache line by branching past
+	 * it and back. Once it is in the i-cache, we execute the core
+	 * of the code and apply the register settings.
+	 *
+	 * The code below uses 7 instructions, while the Cortex-A9 has
+	 * 32-byte cachelines, thus the limit is 8 instructions total.
+	 */
+	asm volatile(
+		".align	5			\n"
+		"	b	2f		\n"
+		"1:	str	%0,	[%1]	\n"
+		"	dsb			\n"
+		"	isb			\n"
+		"	b	3f		\n"
+		"2:	b	1b		\n"
+		"3:	nop			\n"
+	: : "r"(val), "r"(staticcfg) : "memory", "cc");
+}
+
+int do_bridge(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+	if (argc != 2)
+		return CMD_RET_USAGE;
+
+	argv++;
+
+	switch (*argv[0]) {
+	case 'e':	/* Enable */
+		writel(iswgrp_handoff[2], &sysmgr_regs->fpgaintfgrp_module);
+		socfpga_sdram_apply_static_cfg();
+		writel(iswgrp_handoff[3], SOCFPGA_SDR_ADDRESS + 0x5080);
+		writel(iswgrp_handoff[0], &reset_manager_base->brg_mod_reset);
+		writel(iswgrp_handoff[1], &nic301_regs->remap);
+		break;
+	case 'd':	/* Disable */
+		writel(0, &sysmgr_regs->fpgaintfgrp_module);
+		writel(0, SOCFPGA_SDR_ADDRESS + 0x5080);
+		socfpga_sdram_apply_static_cfg();
+		writel(0, &reset_manager_base->brg_mod_reset);
+		writel(1, &nic301_regs->remap);
+		break;
+	default:
+		return CMD_RET_USAGE;
+	}
+
+	return 0;
+}
+
+U_BOOT_CMD(
+	bridge, 2, 1, do_bridge,
+	"SoCFPGA HPS FPGA bridge control",
+	"enable  - Enable HPS-to-FPGA, FPGA-to-HPS, LWHPS-to-FPGA bridges\n"
+	"bridge disable - Enable HPS-to-FPGA, FPGA-to-HPS, LWHPS-to-FPGA bridges\n"
+	""
+);
-- 
1.8.2.3

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 05/20] arm: socfpga: Restructure system manager
  2017-03-09  0:26 [U-Boot] [PATCH v2 00/20] Add Intel Arria 10 SoC support Ley Foon Tan
                   ` (3 preceding siblings ...)
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 04/20] arm: socfpga: Restructure misc driver Ley Foon Tan
@ 2017-03-09  0:26 ` Ley Foon Tan
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 06/20] arm: socfpga: Add A10 defines Ley Foon Tan
                   ` (16 subsequent siblings)
  21 siblings, 0 replies; 60+ messages in thread
From: Ley Foon Tan @ 2017-03-09  0:26 UTC (permalink / raw)
  To: u-boot

Restructure system manager in the preparation to support A10.
No functional change.

Change uint32_t to u32.

Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
---
 arch/arm/mach-socfpga/Makefile                     |   4 +-
 .../arm/mach-socfpga/include/mach/system_manager.h | 125 ++-------------------
 .../include/mach/system_manager_gen5.h             | 121 ++++++++++++++++++++
 arch/arm/mach-socfpga/system_manager.c             |  85 --------------
 arch/arm/mach-socfpga/system_manager_gen5.c        |  85 ++++++++++++++
 5 files changed, 215 insertions(+), 205 deletions(-)
 create mode 100644 arch/arm/mach-socfpga/include/mach/system_manager_gen5.h
 delete mode 100644 arch/arm/mach-socfpga/system_manager.c
 create mode 100644 arch/arm/mach-socfpga/system_manager_gen5.c

diff --git a/arch/arm/mach-socfpga/Makefile b/arch/arm/mach-socfpga/Makefile
index 5b09ea9..e83da2e 100644
--- a/arch/arm/mach-socfpga/Makefile
+++ b/arch/arm/mach-socfpga/Makefile
@@ -7,7 +7,7 @@
 # SPDX-License-Identifier:	GPL-2.0+
 #
 
-obj-y	+= misc.o timer.o reset_manager.o system_manager.o clock_manager.o \
+obj-y	+= misc.o timer.o reset_manager.o clock_manager.o \
 	   fpga_manager.o board.o
 
 obj-$(CONFIG_SPL_BUILD) += spl.o freeze_controller.o
@@ -15,7 +15,7 @@ obj-$(CONFIG_SPL_BUILD) += spl.o freeze_controller.o
 # QTS-generated config file wrappers
 obj-$(CONFIG_TARGET_SOCFPGA_GEN5)	+= scan_manager.o wrap_pll_config.o \
 					   clock_manager_gen5.o reset_manager_gen5.o \
-					   misc_gen5.o
+					   misc_gen5.o system_manager_gen5.o
 obj-$(CONFIG_SPL_BUILD) += wrap_iocsr_config.o wrap_pinmux_config.o	\
 			   wrap_sdram_config.o
 CFLAGS_wrap_iocsr_config.o	+= -I$(srctree)/board/$(BOARDDIR)
diff --git a/arch/arm/mach-socfpga/include/mach/system_manager.h b/arch/arm/mach-socfpga/include/mach/system_manager.h
index c45edea..53ced81 100644
--- a/arch/arm/mach-socfpga/include/mach/system_manager.h
+++ b/arch/arm/mach-socfpga/include/mach/system_manager.h
@@ -1,120 +1,11 @@
 /*
- * Copyright (C) 2013 Altera Corporation <www.altera.com>
+ * Copyright (C) 2013-2017 Altera Corporation <www.altera.com>
  *
  * SPDX-License-Identifier:	GPL-2.0+
  */
 
-#ifndef	_SYSTEM_MANAGER_H_
-#define	_SYSTEM_MANAGER_H_
-
-#ifndef __ASSEMBLY__
-
-void sysmgr_pinmux_init(void);
-void sysmgr_config_warmrstcfgio(int enable);
-
-void sysmgr_get_pinmux_table(const u8 **table, unsigned int *table_len);
-#endif
-
-struct socfpga_system_manager {
-	/* System Manager Module */
-	u32	siliconid1;			/* 0x00 */
-	u32	siliconid2;
-	u32	_pad_0x8_0xf[2];
-	u32	wddbg;				/* 0x10 */
-	u32	bootinfo;
-	u32	hpsinfo;
-	u32	parityinj;
-	/* FPGA Interface Group */
-	u32	fpgaintfgrp_gbl;		/* 0x20 */
-	u32	fpgaintfgrp_indiv;
-	u32	fpgaintfgrp_module;
-	u32	_pad_0x2c_0x2f;
-	/* Scan Manager Group */
-	u32	scanmgrgrp_ctrl;		/* 0x30 */
-	u32	_pad_0x34_0x3f[3];
-	/* Freeze Control Group */
-	u32	frzctrl_vioctrl;		/* 0x40 */
-	u32	_pad_0x44_0x4f[3];
-	u32	frzctrl_hioctrl;		/* 0x50 */
-	u32	frzctrl_src;
-	u32	frzctrl_hwctrl;
-	u32	_pad_0x5c_0x5f;
-	/* EMAC Group */
-	u32	emacgrp_ctrl;			/* 0x60 */
-	u32	emacgrp_l3master;
-	u32	_pad_0x68_0x6f[2];
-	/* DMA Controller Group */
-	u32	dmagrp_ctrl;			/* 0x70 */
-	u32	dmagrp_persecurity;
-	u32	_pad_0x78_0x7f[2];
-	/* Preloader (initial software) Group */
-	u32	iswgrp_handoff[8];		/* 0x80 */
-	u32	_pad_0xa0_0xbf[8];		/* 0xa0 */
-	/* Boot ROM Code Register Group */
-	u32	romcodegrp_ctrl;		/* 0xc0 */
-	u32	romcodegrp_cpu1startaddr;
-	u32	romcodegrp_initswstate;
-	u32	romcodegrp_initswlastld;
-	u32	romcodegrp_bootromswstate;	/* 0xd0 */
-	u32	__pad_0xd4_0xdf[3];
-	/* Warm Boot from On-Chip RAM Group */
-	u32	romcodegrp_warmramgrp_enable;	/* 0xe0 */
-	u32	romcodegrp_warmramgrp_datastart;
-	u32	romcodegrp_warmramgrp_length;
-	u32	romcodegrp_warmramgrp_execution;
-	u32	romcodegrp_warmramgrp_crc;	/* 0xf0 */
-	u32	__pad_0xf4_0xff[3];
-	/* Boot ROM Hardware Register Group */
-	u32	romhwgrp_ctrl;			/* 0x100 */
-	u32	_pad_0x104_0x107;
-	/* SDMMC Controller Group */
-	u32	sdmmcgrp_ctrl;
-	u32	sdmmcgrp_l3master;
-	/* NAND Flash Controller Register Group */
-	u32	nandgrp_bootstrap;		/* 0x110 */
-	u32	nandgrp_l3master;
-	/* USB Controller Group */
-	u32	usbgrp_l3master;
-	u32	_pad_0x11c_0x13f[9];
-	/* ECC Management Register Group */
-	u32	eccgrp_l2;			/* 0x140 */
-	u32	eccgrp_ocram;
-	u32	eccgrp_usb0;
-	u32	eccgrp_usb1;
-	u32	eccgrp_emac0;			/* 0x150 */
-	u32	eccgrp_emac1;
-	u32	eccgrp_dma;
-	u32	eccgrp_can0;
-	u32	eccgrp_can1;			/* 0x160 */
-	u32	eccgrp_nand;
-	u32	eccgrp_qspi;
-	u32	eccgrp_sdmmc;
-	u32	_pad_0x170_0x3ff[164];
-	/* Pin Mux Control Group */
-	u32	emacio[20];			/* 0x400 */
-	u32	flashio[12];			/* 0x450 */
-	u32	generalio[28];			/* 0x480 */
-	u32	_pad_0x4f0_0x4ff[4];
-	u32	mixed1io[22];			/* 0x500 */
-	u32	mixed2io[8];			/* 0x558 */
-	u32	gplinmux[23];			/* 0x578 */
-	u32	gplmux[71];			/* 0x5d4 */
-	u32	nandusefpga;			/* 0x6f0 */
-	u32	_pad_0x6f4;
-	u32	rgmii1usefpga;			/* 0x6f8 */
-	u32	_pad_0x6fc_0x700[2];
-	u32	i2c0usefpga;			/* 0x704 */
-	u32	sdmmcusefpga;			/* 0x708 */
-	u32	_pad_0x70c_0x710[2];
-	u32	rgmii0usefpga;			/* 0x714 */
-	u32	_pad_0x718_0x720[3];
-	u32	i2c3usefpga;			/* 0x724 */
-	u32	i2c2usefpga;			/* 0x728 */
-	u32	i2c1usefpga;			/* 0x72c */
-	u32	spim1usefpga;			/* 0x730 */
-	u32	_pad_0x734;
-	u32	spim0usefpga;			/* 0x738 */
-};
+#ifndef _SYSTEM_MANAGER_H_
+#define _SYSTEM_MANAGER_H_
 
 #define SYSMGR_ROMCODEGRP_CTRL_WARMRSTCFGPINMUX	(1 << 0)
 #define SYSMGR_ROMCODEGRP_CTRL_WARMRSTCFGIO	(1 << 1)
@@ -129,12 +20,6 @@ struct socfpga_system_manager {
 #define SYSMGR_FPGAINTF_NAND	(1 << 4)
 #define SYSMGR_FPGAINTF_SDMMC	(1 << 5)
 
-#if defined(CONFIG_TARGET_SOCFPGA_GEN5)
-#define SYSMGR_SDMMC_SMPLSEL_SHIFT	3
-#else
-#define SYSMGR_SDMMC_SMPLSEL_SHIFT	4
-#endif
-
 #define SYSMGR_SDMMC_DRVSEL_SHIFT	0
 
 /* EMAC Group Bit definitions */
@@ -146,4 +31,8 @@ struct socfpga_system_manager {
 #define SYSMGR_EMACGRP_CTRL_PHYSEL1_LSB			2
 #define SYSMGR_EMACGRP_CTRL_PHYSEL_MASK			0x3
 
+#if defined(CONFIG_TARGET_SOCFPGA_GEN5)
+#include <asm/arch/system_manager_gen5.h>
+#endif
+
 #endif /* _SYSTEM_MANAGER_H_ */
diff --git a/arch/arm/mach-socfpga/include/mach/system_manager_gen5.h b/arch/arm/mach-socfpga/include/mach/system_manager_gen5.h
new file mode 100644
index 0000000..3ad4ca1
--- /dev/null
+++ b/arch/arm/mach-socfpga/include/mach/system_manager_gen5.h
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2013-2017 Altera Corporation <www.altera.com>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#ifndef _SYSTEM_MANAGER_GEN5_H_
+#define _SYSTEM_MANAGER_GEN5_H_
+
+#ifndef __ASSEMBLY__
+
+void sysmgr_pinmux_init(void);
+void sysmgr_config_warmrstcfgio(int enable);
+
+void sysmgr_get_pinmux_table(const u8 **table, unsigned int *table_len);
+
+struct socfpga_system_manager {
+	/* System Manager Module */
+	u32	siliconid1;			/* 0x00 */
+	u32	siliconid2;
+	u32	_pad_0x8_0xf[2];
+	u32	wddbg;				/* 0x10 */
+	u32	bootinfo;
+	u32	hpsinfo;
+	u32	parityinj;
+	/* FPGA Interface Group */
+	u32	fpgaintfgrp_gbl;		/* 0x20 */
+	u32	fpgaintfgrp_indiv;
+	u32	fpgaintfgrp_module;
+	u32	_pad_0x2c_0x2f;
+	/* Scan Manager Group */
+	u32	scanmgrgrp_ctrl;		/* 0x30 */
+	u32	_pad_0x34_0x3f[3];
+	/* Freeze Control Group */
+	u32	frzctrl_vioctrl;		/* 0x40 */
+	u32	_pad_0x44_0x4f[3];
+	u32	frzctrl_hioctrl;		/* 0x50 */
+	u32	frzctrl_src;
+	u32	frzctrl_hwctrl;
+	u32	_pad_0x5c_0x5f;
+	/* EMAC Group */
+	u32	emacgrp_ctrl;			/* 0x60 */
+	u32	emacgrp_l3master;
+	u32	_pad_0x68_0x6f[2];
+	/* DMA Controller Group */
+	u32	dmagrp_ctrl;			/* 0x70 */
+	u32	dmagrp_persecurity;
+	u32	_pad_0x78_0x7f[2];
+	/* Preloader (initial software) Group */
+	u32	iswgrp_handoff[8];		/* 0x80 */
+	u32	_pad_0xa0_0xbf[8];		/* 0xa0 */
+	/* Boot ROM Code Register Group */
+	u32	romcodegrp_ctrl;		/* 0xc0 */
+	u32	romcodegrp_cpu1startaddr;
+	u32	romcodegrp_initswstate;
+	u32	romcodegrp_initswlastld;
+	u32	romcodegrp_bootromswstate;	/* 0xd0 */
+	u32	__pad_0xd4_0xdf[3];
+	/* Warm Boot from On-Chip RAM Group */
+	u32	romcodegrp_warmramgrp_enable;	/* 0xe0 */
+	u32	romcodegrp_warmramgrp_datastart;
+	u32	romcodegrp_warmramgrp_length;
+	u32	romcodegrp_warmramgrp_execution;
+	u32	romcodegrp_warmramgrp_crc;	/* 0xf0 */
+	u32	__pad_0xf4_0xff[3];
+	/* Boot ROM Hardware Register Group */
+	u32	romhwgrp_ctrl;			/* 0x100 */
+	u32	_pad_0x104_0x107;
+	/* SDMMC Controller Group */
+	u32	sdmmcgrp_ctrl;
+	u32	sdmmcgrp_l3master;
+	/* NAND Flash Controller Register Group */
+	u32	nandgrp_bootstrap;		/* 0x110 */
+	u32	nandgrp_l3master;
+	/* USB Controller Group */
+	u32	usbgrp_l3master;
+	u32	_pad_0x11c_0x13f[9];
+	/* ECC Management Register Group */
+	u32	eccgrp_l2;			/* 0x140 */
+	u32	eccgrp_ocram;
+	u32	eccgrp_usb0;
+	u32	eccgrp_usb1;
+	u32	eccgrp_emac0;			/* 0x150 */
+	u32	eccgrp_emac1;
+	u32	eccgrp_dma;
+	u32	eccgrp_can0;
+	u32	eccgrp_can1;			/* 0x160 */
+	u32	eccgrp_nand;
+	u32	eccgrp_qspi;
+	u32	eccgrp_sdmmc;
+	u32	_pad_0x170_0x3ff[164];
+	/* Pin Mux Control Group */
+	u32	emacio[20];			/* 0x400 */
+	u32	flashio[12];			/* 0x450 */
+	u32	generalio[28];			/* 0x480 */
+	u32	_pad_0x4f0_0x4ff[4];
+	u32	mixed1io[22];			/* 0x500 */
+	u32	mixed2io[8];			/* 0x558 */
+	u32	gplinmux[23];			/* 0x578 */
+	u32	gplmux[71];			/* 0x5d4 */
+	u32	nandusefpga;			/* 0x6f0 */
+	u32	_pad_0x6f4;
+	u32	rgmii1usefpga;			/* 0x6f8 */
+	u32	_pad_0x6fc_0x700[2];
+	u32	i2c0usefpga;			/* 0x704 */
+	u32	sdmmcusefpga;			/* 0x708 */
+	u32	_pad_0x70c_0x710[2];
+	u32	rgmii0usefpga;			/* 0x714 */
+	u32	_pad_0x718_0x720[3];
+	u32	i2c3usefpga;			/* 0x724 */
+	u32	i2c2usefpga;			/* 0x728 */
+	u32	i2c1usefpga;			/* 0x72c */
+	u32	spim1usefpga;			/* 0x730 */
+	u32	_pad_0x734;
+	u32	spim0usefpga;			/* 0x738 */
+};
+#endif
+
+#define SYSMGR_SDMMC_SMPLSEL_SHIFT	3
+
+#endif /* _SYSTEM_MANAGER_GEN5_H_ */
diff --git a/arch/arm/mach-socfpga/system_manager.c b/arch/arm/mach-socfpga/system_manager.c
deleted file mode 100644
index 75a65f3..0000000
--- a/arch/arm/mach-socfpga/system_manager.c
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (C) 2013 Altera Corporation <www.altera.com>
- *
- * SPDX-License-Identifier:	GPL-2.0+
- */
-
-#include <common.h>
-#include <asm/io.h>
-#include <asm/arch/system_manager.h>
-#include <asm/arch/fpga_manager.h>
-
-DECLARE_GLOBAL_DATA_PTR;
-
-static struct socfpga_system_manager *sysmgr_regs =
-	(struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS;
-
-/*
- * Populate the value for SYSMGR.FPGAINTF.MODULE based on pinmux setting.
- * The value is not wrote to SYSMGR.FPGAINTF.MODULE but
- * CONFIG_SYSMGR_ISWGRP_HANDOFF.
- */
-static void populate_sysmgr_fpgaintf_module(void)
-{
-	uint32_t handoff_val = 0;
-
-	/* ISWGRP_HANDOFF_FPGAINTF */
-	writel(0, &sysmgr_regs->iswgrp_handoff[2]);
-
-	/* Enable the signal for those HPS peripherals that use FPGA. */
-	if (readl(&sysmgr_regs->nandusefpga) == SYSMGR_FPGAINTF_USEFPGA)
-		handoff_val |= SYSMGR_FPGAINTF_NAND;
-	if (readl(&sysmgr_regs->rgmii1usefpga) == SYSMGR_FPGAINTF_USEFPGA)
-		handoff_val |= SYSMGR_FPGAINTF_EMAC1;
-	if (readl(&sysmgr_regs->sdmmcusefpga) == SYSMGR_FPGAINTF_USEFPGA)
-		handoff_val |= SYSMGR_FPGAINTF_SDMMC;
-	if (readl(&sysmgr_regs->rgmii0usefpga) == SYSMGR_FPGAINTF_USEFPGA)
-		handoff_val |= SYSMGR_FPGAINTF_EMAC0;
-	if (readl(&sysmgr_regs->spim0usefpga) == SYSMGR_FPGAINTF_USEFPGA)
-		handoff_val |= SYSMGR_FPGAINTF_SPIM0;
-	if (readl(&sysmgr_regs->spim1usefpga) == SYSMGR_FPGAINTF_USEFPGA)
-		handoff_val |= SYSMGR_FPGAINTF_SPIM1;
-
-	/* populate (not writing) the value for SYSMGR.FPGAINTF.MODULE
-	based on pinmux setting */
-	setbits_le32(&sysmgr_regs->iswgrp_handoff[2], handoff_val);
-
-	handoff_val = readl(&sysmgr_regs->iswgrp_handoff[2]);
-	if (fpgamgr_test_fpga_ready()) {
-		/* Enable the required signals only */
-		writel(handoff_val, &sysmgr_regs->fpgaintfgrp_module);
-	}
-}
-
-/*
- * Configure all the pin muxes
- */
-void sysmgr_pinmux_init(void)
-{
-	uint32_t regs = (uint32_t)&sysmgr_regs->emacio[0];
-	const u8 *sys_mgr_init_table;
-	unsigned int len;
-	int i;
-
-	sysmgr_get_pinmux_table(&sys_mgr_init_table, &len);
-
-	for (i = 0; i < len; i++) {
-		writel(sys_mgr_init_table[i], regs);
-		regs += sizeof(regs);
-	}
-
-	populate_sysmgr_fpgaintf_module();
-}
-
-/*
- * This bit allows the bootrom to configure the IOs after a warm reset.
- */
-void sysmgr_config_warmrstcfgio(int enable)
-{
-	if (enable)
-		setbits_le32(&sysmgr_regs->romcodegrp_ctrl,
-			     SYSMGR_ROMCODEGRP_CTRL_WARMRSTCFGIO);
-	else
-		clrbits_le32(&sysmgr_regs->romcodegrp_ctrl,
-			     SYSMGR_ROMCODEGRP_CTRL_WARMRSTCFGIO);
-}
diff --git a/arch/arm/mach-socfpga/system_manager_gen5.c b/arch/arm/mach-socfpga/system_manager_gen5.c
new file mode 100644
index 0000000..3588a57
--- /dev/null
+++ b/arch/arm/mach-socfpga/system_manager_gen5.c
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2013-2017 Altera Corporation <www.altera.com>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/arch/system_manager.h>
+#include <asm/arch/fpga_manager.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static struct socfpga_system_manager *sysmgr_regs =
+	(struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS;
+
+/*
+ * Populate the value for SYSMGR.FPGAINTF.MODULE based on pinmux setting.
+ * The value is not wrote to SYSMGR.FPGAINTF.MODULE but
+ * CONFIG_SYSMGR_ISWGRP_HANDOFF.
+ */
+static void populate_sysmgr_fpgaintf_module(void)
+{
+	u32 handoff_val = 0;
+
+	/* ISWGRP_HANDOFF_FPGAINTF */
+	writel(0, &sysmgr_regs->iswgrp_handoff[2]);
+
+	/* Enable the signal for those HPS peripherals that use FPGA. */
+	if (readl(&sysmgr_regs->nandusefpga) == SYSMGR_FPGAINTF_USEFPGA)
+		handoff_val |= SYSMGR_FPGAINTF_NAND;
+	if (readl(&sysmgr_regs->rgmii1usefpga) == SYSMGR_FPGAINTF_USEFPGA)
+		handoff_val |= SYSMGR_FPGAINTF_EMAC1;
+	if (readl(&sysmgr_regs->sdmmcusefpga) == SYSMGR_FPGAINTF_USEFPGA)
+		handoff_val |= SYSMGR_FPGAINTF_SDMMC;
+	if (readl(&sysmgr_regs->rgmii0usefpga) == SYSMGR_FPGAINTF_USEFPGA)
+		handoff_val |= SYSMGR_FPGAINTF_EMAC0;
+	if (readl(&sysmgr_regs->spim0usefpga) == SYSMGR_FPGAINTF_USEFPGA)
+		handoff_val |= SYSMGR_FPGAINTF_SPIM0;
+	if (readl(&sysmgr_regs->spim1usefpga) == SYSMGR_FPGAINTF_USEFPGA)
+		handoff_val |= SYSMGR_FPGAINTF_SPIM1;
+
+	/* populate (not writing) the value for SYSMGR.FPGAINTF.MODULE
+	based on pinmux setting */
+	setbits_le32(&sysmgr_regs->iswgrp_handoff[2], handoff_val);
+
+	handoff_val = readl(&sysmgr_regs->iswgrp_handoff[2]);
+	if (fpgamgr_test_fpga_ready()) {
+		/* Enable the required signals only */
+		writel(handoff_val, &sysmgr_regs->fpgaintfgrp_module);
+	}
+}
+
+/*
+ * Configure all the pin muxes
+ */
+void sysmgr_pinmux_init(void)
+{
+	u32 regs = (u32)&sysmgr_regs->emacio[0];
+	const u8 *sys_mgr_init_table;
+	unsigned int len;
+	int i;
+
+	sysmgr_get_pinmux_table(&sys_mgr_init_table, &len);
+
+	for (i = 0; i < len; i++) {
+		writel(sys_mgr_init_table[i], regs);
+		regs += sizeof(regs);
+	}
+
+	populate_sysmgr_fpgaintf_module();
+}
+
+/*
+ * This bit allows the bootrom to configure the IOs after a warm reset.
+ */
+void sysmgr_config_warmrstcfgio(int enable)
+{
+	if (enable)
+		setbits_le32(&sysmgr_regs->romcodegrp_ctrl,
+			     SYSMGR_ROMCODEGRP_CTRL_WARMRSTCFGIO);
+	else
+		clrbits_le32(&sysmgr_regs->romcodegrp_ctrl,
+			     SYSMGR_ROMCODEGRP_CTRL_WARMRSTCFGIO);
+}
-- 
1.8.2.3

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 06/20] arm: socfpga: Add A10 defines
  2017-03-09  0:26 [U-Boot] [PATCH v2 00/20] Add Intel Arria 10 SoC support Ley Foon Tan
                   ` (4 preceding siblings ...)
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 05/20] arm: socfpga: Restructure system manager Ley Foon Tan
@ 2017-03-09  0:26 ` Ley Foon Tan
  2017-03-10  1:38   ` Marek Vasut
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 07/20] arm: socfpga: Add reset driver support for Arria 10 Ley Foon Tan
                   ` (15 subsequent siblings)
  21 siblings, 1 reply; 60+ messages in thread
From: Ley Foon Tan @ 2017-03-09  0:26 UTC (permalink / raw)
  To: u-boot

Add i2c, timer and other A10 defines.

Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
---
 arch/arm/mach-socfpga/include/mach/base_addr_a10.h | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/arch/arm/mach-socfpga/include/mach/base_addr_a10.h b/arch/arm/mach-socfpga/include/mach/base_addr_a10.h
index a7056d4..448fbdc 100644
--- a/arch/arm/mach-socfpga/include/mach/base_addr_a10.h
+++ b/arch/arm/mach-socfpga/include/mach/base_addr_a10.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2014 Altera Corporation <www.altera.com>
+ * Copyright (C) 2014-2017 Altera Corporation <www.altera.com>
  *
  * SPDX-License-Identifier:	GPL-2.0+
  */
@@ -29,14 +29,20 @@
 #define SOCFPGA_MPUL2_ADDRESS			0xfffff000
 #define SOCFPGA_I2C0_ADDRESS			0xffc02200
 #define SOCFPGA_I2C1_ADDRESS			0xffc02300
+#define SOCFPGA_I2C2_ADDRESS			0xffc02400
+#define SOCFPGA_I2C3_ADDRESS			0xffc02500
+#define SOCFPGA_I2C4_ADDRESS			0xffc02600
 
 #define SOCFPGA_ECC_OCRAM_ADDRESS		0xff8c3000
 #define SOCFPGA_UART0_ADDRESS			0xffc02000
 #define SOCFPGA_OSC1TIMER0_ADDRESS		0xffd00000
+#define SOCFPGA_OSC1TIMER1_ADDRESS		0xffd00100
 #define SOCFPGA_CLKMGR_ADDRESS			0xffd04000
 #define SOCFPGA_RSTMGR_ADDRESS			0xffd05000
 
 #define SOCFPGA_SDR_ADDRESS			0xffcfb000
+#define SOCFPGA_NOC_L4_PRIV_FLT_OFST		0xffd11000
+#define SOCFPGA_NOC_FW_H2F_SCR_OFST		0xffd13500
 #define SOCFPGA_SDR_SCHEDULER_ADDRESS		0xffd12400
 #define SOCFPGA_SDR_FIREWALL_OCRAM_ADDRESS	0xffd13200
 #define SOCFPGA_SDR_FIREWALL_MPU_FPGA_ADDRESS	0xffd13300
-- 
1.8.2.3

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 07/20] arm: socfpga: Add reset driver support for Arria 10
  2017-03-09  0:26 [U-Boot] [PATCH v2 00/20] Add Intel Arria 10 SoC support Ley Foon Tan
                   ` (5 preceding siblings ...)
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 06/20] arm: socfpga: Add A10 defines Ley Foon Tan
@ 2017-03-09  0:26 ` Ley Foon Tan
  2017-03-10  1:40   ` Marek Vasut
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 08/20] arm: socfpga: Add clock driver " Ley Foon Tan
                   ` (14 subsequent siblings)
  21 siblings, 1 reply; 60+ messages in thread
From: Ley Foon Tan @ 2017-03-09  0:26 UTC (permalink / raw)
  To: u-boot

Add reset driver support for Arria 10.

Signed-off-by: Tien Fong Chee <tien.fong.chee@intel.com>
Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
---
 arch/arm/mach-socfpga/Makefile                     |   2 +
 arch/arm/mach-socfpga/include/mach/reset_manager.h |   2 +
 .../include/mach/reset_manager_arria10.h           | 143 ++++++++
 arch/arm/mach-socfpga/reset_manager_arria10.c      | 362 +++++++++++++++++++++
 include/dt-bindings/reset/altr,rst-mgr-a10.h       | 103 ++++++
 5 files changed, 612 insertions(+)
 create mode 100644 arch/arm/mach-socfpga/include/mach/reset_manager_arria10.h
 create mode 100644 arch/arm/mach-socfpga/reset_manager_arria10.c
 create mode 100644 include/dt-bindings/reset/altr,rst-mgr-a10.h

diff --git a/arch/arm/mach-socfpga/Makefile b/arch/arm/mach-socfpga/Makefile
index e83da2e..d81f003 100644
--- a/arch/arm/mach-socfpga/Makefile
+++ b/arch/arm/mach-socfpga/Makefile
@@ -10,6 +10,8 @@
 obj-y	+= misc.o timer.o reset_manager.o clock_manager.o \
 	   fpga_manager.o board.o
 
+obj-$(CONFIG_TARGET_SOCFPGA_ARRIA10) += reset_manager_arria10.o
+
 obj-$(CONFIG_SPL_BUILD) += spl.o freeze_controller.o
 
 # QTS-generated config file wrappers
diff --git a/arch/arm/mach-socfpga/include/mach/reset_manager.h b/arch/arm/mach-socfpga/include/mach/reset_manager.h
index 9e253bf..57dc034 100644
--- a/arch/arm/mach-socfpga/include/mach/reset_manager.h
+++ b/arch/arm/mach-socfpga/include/mach/reset_manager.h
@@ -45,6 +45,8 @@ void socfpga_per_reset_all(void);
 
 #if defined(CONFIG_TARGET_SOCFPGA_GEN5)
 #include <asm/arch/reset_manager_gen5.h>
+#elif defined(CONFIG_TARGET_SOCFPGA_ARRIA10)
+#include <asm/arch/reset_manager_arria10.h>
 #endif
 
 #endif /* _RESET_MANAGER_H_ */
diff --git a/arch/arm/mach-socfpga/include/mach/reset_manager_arria10.h b/arch/arm/mach-socfpga/include/mach/reset_manager_arria10.h
new file mode 100644
index 0000000..e3171d1
--- /dev/null
+++ b/arch/arm/mach-socfpga/include/mach/reset_manager_arria10.h
@@ -0,0 +1,143 @@
+/*
+ * Copyright (C) 2016-2017 Intel Corporation
+ *
+ * SPDX-License-Identifier:	GPL-2.0
+ */
+
+#ifndef _RESET_MANAGER_ARRIA10_H_
+#define _RESET_MANAGER_ARRIA10_H_
+
+void watchdog_disable(void);
+void reset_deassert_noc_ddr_scheduler(void);
+int is_wdt_in_reset(void);
+void emac_manage_reset(ulong emacbase, uint state);
+int reset_deassert_bridges_handoff(void);
+void reset_assert_fpga_connected_peripherals(void);
+void reset_deassert_osc1wd0(void);
+
+struct socfpga_reset_manager {
+	u32	stat;
+	u32	ramstat;
+	u32	miscstat;
+	u32	ctrl;
+	u32	hdsken;
+	u32	hdskreq;
+	u32	hdskack;
+	u32	counts;
+	u32	mpumodrst;
+	u32	per0modrst;
+	u32	per1modrst;
+	u32	brgmodrst;
+	u32	sysmodrst;
+	u32	coldmodrst;
+	u32	nrstmodrst;
+	u32	dbgmodrst;
+	u32	mpuwarmmask;
+	u32	per0warmmask;
+	u32	per1warmmask;
+	u32	brgwarmmask;
+	u32	syswarmmask;
+	u32	nrstwarmmask;
+	u32	l3warmmask;
+	u32	tststa;
+	u32	tstscratch;
+	u32	hdsktimeout;
+	u32	hmcintr;
+	u32	hmcintren;
+	u32	hmcintrens;
+	u32	hmcintrenr;
+	u32	hmcgpout;
+	u32	hmcgpin;
+};
+
+/*
+ * SocFPGA Arria10 reset IDs, bank mapping is as follows:
+ * 0 ... mpumodrst
+ * 1 ... per0modrst
+ * 2 ... per1modrst
+ * 3 ... brgmodrst
+ * 4 ... sysmodrst
+ */
+#define RSTMGR_EMAC0		RSTMGR_DEFINE(1, 0)
+#define RSTMGR_EMAC1		RSTMGR_DEFINE(1, 1)
+#define RSTMGR_EMAC2		RSTMGR_DEFINE(1, 2)
+#define RSTMGR_NAND		RSTMGR_DEFINE(1, 5)
+#define RSTMGR_QSPI		RSTMGR_DEFINE(1, 6)
+#define RSTMGR_SDMMC		RSTMGR_DEFINE(1, 7)
+#define RSTMGR_DMA		RSTMGR_DEFINE(1, 16)
+#define RSTMGR_SPIM0		RSTMGR_DEFINE(1, 17)
+#define RSTMGR_SPIM1		RSTMGR_DEFINE(1, 18)
+#define RSTMGR_L4WD0		RSTMGR_DEFINE(2, 0)
+#define RSTMGR_L4WD1		RSTMGR_DEFINE(2, 1)
+#define RSTMGR_L4SYSTIMER0	RSTMGR_DEFINE(2, 2)
+#define RSTMGR_L4SYSTIMER1	RSTMGR_DEFINE(2, 3)
+#define RSTMGR_SPTIMER0		RSTMGR_DEFINE(2, 4)
+#define RSTMGR_SPTIMER1		RSTMGR_DEFINE(2, 5)
+#define RSTMGR_UART0		RSTMGR_DEFINE(2, 16)
+#define RSTMGR_UART1		RSTMGR_DEFINE(2, 17)
+#define RSTMGR_DDRSCH		RSTMGR_DEFINE(3, 6)
+
+#define ALT_RSTMGR_CTL_SWWARMRSTREQ_SET_MSK	BIT(1)
+#define ALT_RSTMGR_PER0MODRST_EMAC0_SET_MSK	BIT(0)
+#define ALT_RSTMGR_PER0MODRST_EMAC1_SET_MSK	BIT(1)
+#define ALT_RSTMGR_PER0MODRST_EMAC2_SET_MSK	BIT(2)
+#define ALT_RSTMGR_PER0MODRST_USB0_SET_MSK	BIT(3)
+#define ALT_RSTMGR_PER0MODRST_USB1_SET_MSK	BIT(4)
+#define ALT_RSTMGR_PER0MODRST_NAND_SET_MSK	BIT(5)
+#define ALT_RSTMGR_PER0MODRST_QSPI_SET_MSK	BIT(6)
+#define ALT_RSTMGR_PER0MODRST_SDMMC_SET_MSK	BIT(7)
+#define ALT_RSTMGR_PER0MODRST_EMACECC0_SET_MSK	BIT(8)
+#define ALT_RSTMGR_PER0MODRST_EMACECC1_SET_MSK	BIT(9)
+#define ALT_RSTMGR_PER0MODRST_EMACECC2_SET_MSK	BIT(10)
+#define ALT_RSTMGR_PER0MODRST_USBECC0_SET_MSK	BIT(11)
+#define ALT_RSTMGR_PER0MODRST_USBECC1_SET_MSK	BIT(12)
+#define ALT_RSTMGR_PER0MODRST_NANDECC_SET_MSK	BIT(13)
+#define ALT_RSTMGR_PER0MODRST_QSPIECC_SET_MSK	BIT(14)
+#define ALT_RSTMGR_PER0MODRST_SDMMCECC_SET_MSK	BIT(15)
+#define ALT_RSTMGR_PER0MODRST_DMA_SET_MSK	BIT(16)
+#define ALT_RSTMGR_PER0MODRST_SPIM0_SET_MSK	BIT(17)
+#define ALT_RSTMGR_PER0MODRST_SPIM1_SET_MSK	BIT(18)
+#define ALT_RSTMGR_PER0MODRST_SPIS0_SET_MSK	BIT(19)
+#define ALT_RSTMGR_PER0MODRST_SPIS1_SET_MSK	BIT(20)
+#define ALT_RSTMGR_PER0MODRST_DMAECC_SET_MSK	BIT(21)
+#define ALT_RSTMGR_PER0MODRST_EMACPTP_SET_MSK	BIT(22)
+#define ALT_RSTMGR_PER0MODRST_DMAIF0_SET_MSK	BIT(24)
+#define ALT_RSTMGR_PER0MODRST_DMAIF1_SET_MSK	BIT(25)
+#define ALT_RSTMGR_PER0MODRST_DMAIF2_SET_MSK	BIT(26)
+#define ALT_RSTMGR_PER0MODRST_DMAIF3_SET_MSK	BIT(27)
+#define ALT_RSTMGR_PER0MODRST_DMAIF4_SET_MSK	BIT(28)
+#define ALT_RSTMGR_PER0MODRST_DMAIF5_SET_MSK	BIT(29)
+#define ALT_RSTMGR_PER0MODRST_DMAIF6_SET_MSK	BIT(30)
+#define ALT_RSTMGR_PER0MODRST_DMAIF7_SET_MSK	BIT(31)
+
+#define ALT_RSTMGR_PER1MODRST_WD0_SET_MSK	BIT(0)
+#define ALT_RSTMGR_PER1MODRST_WD1_SET_MSK	BIT(1)
+#define ALT_RSTMGR_PER1MODRST_L4SYSTMR0_SET_MSK	BIT(2)
+#define ALT_RSTMGR_PER1MODRST_L4SYSTMR1_SET_MSK	BIT(3)
+#define ALT_RSTMGR_PER1MODRST_SPTMR0_SET_MSK	BIT(4)
+#define ALT_RSTMGR_PER1MODRST_SPTMR1_SET_MSK	BIT(5)
+#define ALT_RSTMGR_PER1MODRST_I2C0_SET_MSK	BIT(8)
+#define ALT_RSTMGR_PER1MODRST_I2C1_SET_MSK	BIT(9)
+#define ALT_RSTMGR_PER1MODRST_I2C2_SET_MSK	BIT(10)
+#define ALT_RSTMGR_PER1MODRST_I2C3_SET_MSK	BIT(11)
+#define ALT_RSTMGR_PER1MODRST_I2C4_SET_MSK	BIT(12)
+#define ALT_RSTMGR_PER1MODRST_UART0_SET_MSK	BIT(16)
+#define ALT_RSTMGR_PER1MODRST_UART1_SET_MSK	BIT(17)
+#define ALT_RSTMGR_PER1MODRST_GPIO0_SET_MSK	BIT(24)
+#define ALT_RSTMGR_PER1MODRST_GPIO1_SET_MSK	BIT(25)
+#define ALT_RSTMGR_PER1MODRST_GPIO2_SET_MSK	BIT(26)
+
+#define ALT_RSTMGR_BRGMODRST_H2F_SET_MSK	BIT(0)
+#define ALT_RSTMGR_BRGMODRST_LWH2F_SET_MSK	BIT(1)
+#define ALT_RSTMGR_BRGMODRST_F2H_SET_MSK	BIT(2)
+#define ALT_RSTMGR_BRGMODRST_F2SSDRAM0_SET_MSK	BIT(3)
+#define ALT_RSTMGR_BRGMODRST_F2SSDRAM1_SET_MSK	BIT(4)
+#define ALT_RSTMGR_BRGMODRST_F2SSDRAM2_SET_MSK	BIT(5)
+#define ALT_RSTMGR_BRGMODRST_DDRSCH_SET_MSK	BIT(6)
+
+#define ALT_RSTMGR_HDSKEN_SDRSELFREFEN_SET_MSK	BIT(0)
+#define ALT_RSTMGR_HDSKEN_FPGAMGRHSEN_SET_MSK	BIT(1)
+#define ALT_RSTMGR_HDSKEN_FPGAHSEN_SET_MSK	BIT(2)
+#define ALT_RSTMGR_HDSKEN_ETRSTALLEN_SET_MSK	BIT(3)
+
+#endif /* _RESET_MANAGER_ARRIA10_H_ */
diff --git a/arch/arm/mach-socfpga/reset_manager_arria10.c b/arch/arm/mach-socfpga/reset_manager_arria10.c
new file mode 100644
index 0000000..547a8bb
--- /dev/null
+++ b/arch/arm/mach-socfpga/reset_manager_arria10.c
@@ -0,0 +1,362 @@
+/*
+ * Copyright (C) 2016-2017 Intel Corporation
+ *
+ * SPDX-License-Identifier:    GPL-2.0
+ */
+
+#include <asm/io.h>
+#include <asm/arch/fpga_manager.h>
+#include <asm/arch/misc.h>
+#include <asm/arch/reset_manager.h>
+#include <asm/arch/system_manager.h>
+#include <common.h>
+#include <errno.h>
+#include <fdtdec.h>
+#include <wait_bit.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static const struct socfpga_reset_manager *reset_manager_base =
+		(void *)SOCFPGA_RSTMGR_ADDRESS;
+static const struct socfpga_system_manager *sysmgr_regs =
+		(struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS;
+
+#define ECC_MASK (ALT_RSTMGR_PER0MODRST_EMACECC0_SET_MSK | \
+	ALT_RSTMGR_PER0MODRST_EMACECC1_SET_MSK | \
+	ALT_RSTMGR_PER0MODRST_EMACECC2_SET_MSK | \
+	ALT_RSTMGR_PER0MODRST_NANDECC_SET_MSK | \
+	ALT_RSTMGR_PER0MODRST_QSPIECC_SET_MSK | \
+	ALT_RSTMGR_PER0MODRST_SDMMCECC_SET_MSK)
+
+static const u32 per0fpgamasks[] = {
+	ALT_RSTMGR_PER0MODRST_EMACECC0_SET_MSK |
+	ALT_RSTMGR_PER0MODRST_EMAC0_SET_MSK,
+	ALT_RSTMGR_PER0MODRST_EMACECC1_SET_MSK |
+	ALT_RSTMGR_PER0MODRST_EMAC1_SET_MSK,
+	ALT_RSTMGR_PER0MODRST_EMACECC2_SET_MSK |
+	ALT_RSTMGR_PER0MODRST_EMAC2_SET_MSK,
+	0, /* i2c0 per1mod */
+	0, /* i2c1 per1mod */
+	0, /* i2c0_emac */
+	0, /* i2c1_emac */
+	0, /* i2c2_emac */
+	ALT_RSTMGR_PER0MODRST_NANDECC_SET_MSK |
+	ALT_RSTMGR_PER0MODRST_NAND_SET_MSK,
+	ALT_RSTMGR_PER0MODRST_QSPIECC_SET_MSK |
+	ALT_RSTMGR_PER0MODRST_QSPI_SET_MSK,
+	ALT_RSTMGR_PER0MODRST_SDMMCECC_SET_MSK |
+	ALT_RSTMGR_PER0MODRST_SDMMC_SET_MSK,
+	ALT_RSTMGR_PER0MODRST_SPIM0_SET_MSK,
+	ALT_RSTMGR_PER0MODRST_SPIM1_SET_MSK,
+	ALT_RSTMGR_PER0MODRST_SPIS0_SET_MSK,
+	ALT_RSTMGR_PER0MODRST_SPIS1_SET_MSK,
+	0, /* uart0 per1mod */
+	0, /* uart1 per1mod */
+};
+
+static const u32 per1fpgamasks[] = {
+	0, /* emac0 per0mod */
+	0, /* emac1 per0mod */
+	0, /* emac2 per0mod */
+	ALT_RSTMGR_PER1MODRST_I2C0_SET_MSK,
+	ALT_RSTMGR_PER1MODRST_I2C1_SET_MSK,
+	ALT_RSTMGR_PER1MODRST_I2C2_SET_MSK, /* i2c0_emac */
+	ALT_RSTMGR_PER1MODRST_I2C3_SET_MSK, /* i2c1_emac */
+	ALT_RSTMGR_PER1MODRST_I2C4_SET_MSK, /* i2c2_emac */
+	0, /* nand per0mod */
+	0, /* qspi per0mod */
+	0, /* sdmmc per0mod */
+	0, /* spim0 per0mod */
+	0, /* spim1 per0mod */
+	0, /* spis0 per0mod */
+	0, /* spis1 per0mod */
+	ALT_RSTMGR_PER1MODRST_UART0_SET_MSK,
+	ALT_RSTMGR_PER1MODRST_UART1_SET_MSK,
+};
+
+struct bridge_cfg {
+	int compat_id;
+	u32  mask_noc;
+	u32  mask_rstmgr;
+};
+
+static const struct bridge_cfg bridge_cfg_tbl[] = {
+	{
+		COMPAT_ALTERA_SOCFPGA_H2F_BRG,
+		ALT_SYSMGR_NOC_H2F_SET_MSK,
+		ALT_RSTMGR_BRGMODRST_H2F_SET_MSK,
+	},
+	{
+		COMPAT_ALTERA_SOCFPGA_LWH2F_BRG,
+		ALT_SYSMGR_NOC_LWH2F_SET_MSK,
+		ALT_RSTMGR_BRGMODRST_LWH2F_SET_MSK,
+	},
+	{
+		COMPAT_ALTERA_SOCFPGA_F2H_BRG,
+		ALT_SYSMGR_NOC_F2H_SET_MSK,
+		ALT_RSTMGR_BRGMODRST_F2H_SET_MSK,
+	},
+	{
+		COMPAT_ALTERA_SOCFPGA_F2SDR0,
+		ALT_SYSMGR_NOC_F2SDR0_SET_MSK,
+		ALT_RSTMGR_BRGMODRST_F2SSDRAM0_SET_MSK,
+	},
+	{
+		COMPAT_ALTERA_SOCFPGA_F2SDR1,
+		ALT_SYSMGR_NOC_F2SDR1_SET_MSK,
+		ALT_RSTMGR_BRGMODRST_F2SSDRAM1_SET_MSK,
+	},
+	{
+		COMPAT_ALTERA_SOCFPGA_F2SDR2,
+		ALT_SYSMGR_NOC_F2SDR2_SET_MSK,
+		ALT_RSTMGR_BRGMODRST_F2SSDRAM2_SET_MSK,
+	},
+};
+
+/* Disable the watchdog (toggle reset to watchdog) */
+void watchdog_disable(void)
+{
+	/* assert reset for watchdog */
+	setbits_le32(&reset_manager_base->per1modrst,
+		     ALT_RSTMGR_PER1MODRST_WD0_SET_MSK);
+}
+
+/* Release NOC ddr scheduler from reset */
+void reset_deassert_noc_ddr_scheduler(void)
+{
+	clrbits_le32(&reset_manager_base->brgmodrst,
+		     ALT_RSTMGR_BRGMODRST_DDRSCH_SET_MSK);
+}
+
+/* Check whether Watchdog in reset state? */
+int is_wdt_in_reset(void)
+{
+	u32 val;
+
+	val = readl(&reset_manager_base->per1modrst);
+	val &= ALT_RSTMGR_PER1MODRST_WD0_SET_MSK;
+
+	/* return 0x1 if watchdog in reset */
+	return val;
+}
+
+/* emacbase: base address of emac to enable/disable reset
+ * state: 0 - disable reset, !0 - enable reset
+ */
+void emac_manage_reset(ulong emacbase, uint state)
+{
+	ulong eccmask;
+	ulong emacmask;
+
+	switch (emacbase) {
+	case SOCFPGA_EMAC0_ADDRESS:
+		eccmask = ALT_RSTMGR_PER0MODRST_EMACECC0_SET_MSK;
+		emacmask = ALT_RSTMGR_PER0MODRST_EMAC0_SET_MSK;
+		break;
+	case SOCFPGA_EMAC1_ADDRESS:
+		eccmask = ALT_RSTMGR_PER0MODRST_EMACECC1_SET_MSK;
+		emacmask = ALT_RSTMGR_PER0MODRST_EMAC1_SET_MSK;
+		break;
+	case SOCFPGA_EMAC2_ADDRESS:
+		eccmask = ALT_RSTMGR_PER0MODRST_EMACECC2_SET_MSK;
+		emacmask = ALT_RSTMGR_PER0MODRST_EMAC2_SET_MSK;
+		break;
+	default:
+		error("emac base address unexpected! %lx", emacbase);
+		hang();
+		break;
+	}
+
+	if (state) {
+		/* Enable ECC OCP first */
+		setbits_le32(&reset_manager_base->per0modrst, eccmask);
+		setbits_le32(&reset_manager_base->per0modrst, emacmask);
+	} else {
+		/* Disable ECC OCP first */
+		clrbits_le32(&reset_manager_base->per0modrst, emacmask);
+		clrbits_le32(&reset_manager_base->per0modrst, eccmask);
+	}
+}
+
+static int get_bridge_init_val(const void *blob, int compat_id)
+{
+	int node;
+
+	node = fdtdec_next_compatible(blob, 0, compat_id);
+	if (node < 0)
+		return 0;
+
+	return fdtdec_get_uint(blob, node, "init-val", 0);
+}
+
+/* Enable bridges (hps2fpga, lwhps2fpga, fpga2hps, fpga2sdram) per handoff */
+int reset_deassert_bridges_handoff(void)
+{
+	u32 mask_noc = 0, mask_rstmgr = 0;
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(bridge_cfg_tbl); i++) {
+		if (get_bridge_init_val(gd->fdt_blob,
+					bridge_cfg_tbl[i].compat_id)) {
+			mask_noc |= bridge_cfg_tbl[i].mask_noc;
+			mask_rstmgr |= bridge_cfg_tbl[i].mask_rstmgr;
+		}
+	}
+
+	/* clear idle request to all bridges */
+	setbits_le32(&sysmgr_regs->noc_idlereq_clr, mask_noc);
+
+	/* Release bridges from reset state per handoff value */
+	clrbits_le32(&reset_manager_base->brgmodrst, mask_rstmgr);
+
+	/* Poll until all idleack to 0, timeout at 1000ms */
+	return wait_for_bit(__func__, &sysmgr_regs->noc_idleack, mask_noc,
+			    false, 1000, false);
+}
+
+void reset_assert_fpga_connected_peripherals(void)
+{
+	u32 mask0 = 0;
+	u32 mask1 = 0;
+	u32 fpga_pinux_addr = SOCFPGA_PINMUX_FPGA_INTERFACE_ADDRESS;
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(per1fpgamasks); i++) {
+		if (readl(fpga_pinux_addr)) {
+			mask0 |= per0fpgamasks[i];
+			mask1 |= per1fpgamasks[i];
+		}
+		fpga_pinux_addr += sizeof(u32);
+	}
+
+	setbits_le32(&reset_manager_base->per0modrst, mask0 & ECC_MASK);
+	setbits_le32(&reset_manager_base->per1modrst, mask1);
+	setbits_le32(&reset_manager_base->per0modrst, mask0);
+}
+
+/* Release L4 OSC1 Watchdog Timer 0 from reset through reset manager */
+void reset_deassert_osc1wd0(void)
+{
+	clrbits_le32(&reset_manager_base->per1modrst,
+		     ALT_RSTMGR_PER1MODRST_WD0_SET_MSK);
+}
+
+/*
+ * Assert or de-assert SoCFPGA reset manager reset.
+ */
+void socfpga_per_reset(u32 reset, int set)
+{
+	const u32 *reg;
+	u32 rstmgr_bank = RSTMGR_BANK(reset);
+
+	switch (rstmgr_bank) {
+	case 0:
+		reg = &reset_manager_base->mpumodrst;
+		break;
+	case 1:
+		reg = &reset_manager_base->per0modrst;
+		break;
+	case 2:
+		reg = &reset_manager_base->per1modrst;
+		break;
+	case 3:
+		reg = &reset_manager_base->brgmodrst;
+		break;
+	case 4:
+		reg = &reset_manager_base->sysmodrst;
+		break;
+
+	default:
+		return;
+	}
+
+	if (set)
+		setbits_le32(reg, 1 << RSTMGR_RESET(reset));
+	else
+		clrbits_le32(reg, 1 << RSTMGR_RESET(reset));
+}
+
+/*
+ * Assert reset on every peripheral but L4WD0.
+ * Watchdog must be kept intact to prevent glitches
+ * and/or hangs.
+ * For the Arria10, we disable all the peripherals except L4 watchdog0,
+ * L4 Timer 0, and ECC.
+ */
+void socfpga_per_reset_all(void)
+{
+	const u32 l4wd0 = (1 << RSTMGR_RESET(SOCFPGA_RESET(L4WD0)) |
+			  (1 << RSTMGR_RESET(SOCFPGA_RESET(L4SYSTIMER0))));
+	unsigned mask_ecc_ocp =
+		ALT_RSTMGR_PER0MODRST_EMACECC0_SET_MSK |
+		ALT_RSTMGR_PER0MODRST_EMACECC1_SET_MSK |
+		ALT_RSTMGR_PER0MODRST_EMACECC2_SET_MSK |
+		ALT_RSTMGR_PER0MODRST_USBECC0_SET_MSK |
+		ALT_RSTMGR_PER0MODRST_USBECC1_SET_MSK |
+		ALT_RSTMGR_PER0MODRST_NANDECC_SET_MSK |
+		ALT_RSTMGR_PER0MODRST_QSPIECC_SET_MSK |
+		ALT_RSTMGR_PER0MODRST_SDMMCECC_SET_MSK;
+
+	/* disable all components except ECC_OCP, L4 Timer0 and L4 WD0 */
+	writel(~l4wd0, &reset_manager_base->per1modrst);
+	setbits_le32(&reset_manager_base->per0modrst, ~mask_ecc_ocp);
+
+	/* Finally disable the ECC_OCP */
+	setbits_le32(&reset_manager_base->per0modrst, mask_ecc_ocp);
+}
+
+#if defined(CONFIG_SOCFPGA_VIRTUAL_TARGET)
+void socfpga_bridges_reset(int enable)
+{
+	/* For SoCFPGA-VT, this is NOP. */
+}
+#else
+void socfpga_bridges_reset(int enable)
+{
+	/* Disable all the bridges (hps2fpga, lwhps2fpga, fpga2hps,
+	   fpga2sdram) */
+	/* set idle request to all bridges */
+	writel(ALT_SYSMGR_NOC_H2F_SET_MSK |
+		ALT_SYSMGR_NOC_LWH2F_SET_MSK |
+		ALT_SYSMGR_NOC_F2H_SET_MSK |
+		ALT_SYSMGR_NOC_F2SDR0_SET_MSK |
+		ALT_SYSMGR_NOC_F2SDR1_SET_MSK |
+		ALT_SYSMGR_NOC_F2SDR2_SET_MSK,
+		&sysmgr_regs->noc_idlereq_set);
+
+	/* Enable the NOC timeout */
+	writel(ALT_SYSMGR_NOC_TMO_EN_SET_MSK, &sysmgr_regs->noc_timeout);
+
+	/* Poll until all idleack to 1 */
+	wait_for_bit(__func__, &sysmgr_regs->noc_idleack,
+		     ALT_SYSMGR_NOC_H2F_SET_MSK |
+		     ALT_SYSMGR_NOC_LWH2F_SET_MSK |
+		     ALT_SYSMGR_NOC_F2H_SET_MSK |
+		     ALT_SYSMGR_NOC_F2SDR0_SET_MSK |
+		     ALT_SYSMGR_NOC_F2SDR1_SET_MSK |
+		     ALT_SYSMGR_NOC_F2SDR2_SET_MSK,
+		     true, 10000, false);
+
+	/* Poll until all idlestatus to 1 */
+	wait_for_bit(__func__, &sysmgr_regs->noc_idlestatus,
+		     ALT_SYSMGR_NOC_H2F_SET_MSK |
+		     ALT_SYSMGR_NOC_LWH2F_SET_MSK |
+		     ALT_SYSMGR_NOC_F2H_SET_MSK |
+		     ALT_SYSMGR_NOC_F2SDR0_SET_MSK |
+		     ALT_SYSMGR_NOC_F2SDR1_SET_MSK |
+		     ALT_SYSMGR_NOC_F2SDR2_SET_MSK,
+		     true, 10000, false);
+
+	/* Put all bridges (except NOR DDR scheduler) into reset state */
+	setbits_le32(&reset_manager_base->brgmodrst,
+		     (ALT_RSTMGR_BRGMODRST_H2F_SET_MSK |
+		     ALT_RSTMGR_BRGMODRST_LWH2F_SET_MSK |
+		     ALT_RSTMGR_BRGMODRST_F2H_SET_MSK |
+		     ALT_RSTMGR_BRGMODRST_F2SSDRAM0_SET_MSK |
+		     ALT_RSTMGR_BRGMODRST_F2SSDRAM1_SET_MSK |
+		     ALT_RSTMGR_BRGMODRST_F2SSDRAM2_SET_MSK));
+
+	/* Disable NOC timeout */
+	writel(0, &sysmgr_regs->noc_timeout);
+}
+#endif
diff --git a/include/dt-bindings/reset/altr,rst-mgr-a10.h b/include/dt-bindings/reset/altr,rst-mgr-a10.h
new file mode 100644
index 0000000..99875de
--- /dev/null
+++ b/include/dt-bindings/reset/altr,rst-mgr-a10.h
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2016-2017 Intel Corporation
+ *
+ * SPDX-License-Identifier:	GPL-2.0
+ */
+
+#ifndef _DT_BINDINGS_RESET_ALTR_RST_MGR_A10_H
+#define _DT_BINDINGS_RESET_ALTR_RST_MGR_A10_H
+
+/* MPUMODRST */
+#define CPU0_RESET		0
+#define CPU1_RESET		1
+#define WDS_RESET		2
+#define SCUPER_RESET		3
+
+/* PER0MODRST */
+#define EMAC0_RESET		32
+#define EMAC1_RESET		33
+#define EMAC2_RESET		34
+#define USB0_RESET		35
+#define USB1_RESET		36
+#define NAND_RESET		37
+#define QSPI_RESET		38
+#define SDMMC_RESET		39
+#define EMAC0_OCP_RESET		40
+#define EMAC1_OCP_RESET		41
+#define EMAC2_OCP_RESET		42
+#define USB0_OCP_RESET		43
+#define USB1_OCP_RESET		44
+#define NAND_OCP_RESET		45
+#define QSPI_OCP_RESET		46
+#define SDMMC_OCP_RESET		47
+#define DMA_RESET		48
+#define SPIM0_RESET		49
+#define SPIM1_RESET		50
+#define SPIS0_RESET		51
+#define SPIS1_RESET		52
+#define DMA_OCP_RESET		53
+#define EMAC_PTP_RESET		54
+/* 55 is empty*/
+#define DMAIF0_RESET		56
+#define DMAIF1_RESET		57
+#define DMAIF2_RESET		58
+#define DMAIF3_RESET		59
+#define DMAIF4_RESET		60
+#define DMAIF5_RESET		61
+#define DMAIF6_RESET		62
+#define DMAIF7_RESET		63
+
+/* PER1MODRST */
+#define L4WD0_RESET		64
+#define L4WD1_RESET		65
+#define L4SYSTIMER0_RESET	66
+#define L4SYSTIMER1_RESET	67
+#define SPTIMER0_RESET		68
+#define SPTIMER1_RESET		69
+/* 70-71 is reserved */
+#define I2C0_RESET		72
+#define I2C1_RESET		73
+#define I2C2_RESET		74
+#define I2C3_RESET		75
+#define I2C4_RESET		76
+/* 77-79 is reserved */
+#define UART0_RESET		80
+#define UART1_RESET		81
+/* 82-87 is reserved */
+#define GPIO0_RESET		88
+#define GPIO1_RESET		89
+#define GPIO2_RESET		90
+
+/* BRGMODRST */
+#define HPS2FPGA_RESET		96
+#define LWHPS2FPGA_RESET	97
+#define FPGA2HPS_RESET		98
+#define F2SSDRAM0_RESET		99
+#define F2SSDRAM1_RESET		100
+#define F2SSDRAM2_RESET		101
+#define DDRSCH_RESET		102
+
+/* SYSMODRST*/
+#define ROM_RESET		128
+#define OCRAM_RESET		129
+/* 130 is reserved */
+#define FPGAMGR_RESET		131
+#define S2F_RESET		132
+#define SYSDBG_RESET		133
+#define OCRAM_OCP_RESET		134
+
+/* COLDMODRST */
+#define CLKMGRCOLD_RESET	160
+/* 161-162 is reserved */
+#define S2FCOLD_RESET		163
+#define TIMESTAMPCOLD_RESET	164
+#define TAPCOLD_RESET		165
+#define HMCCOLD_RESET		166
+#define IOMGRCOLD_RESET		167
+
+/* NRSTMODRST */
+#define NRSTPINOE_RESET		192
+
+/* DBGMODRST */
+#define DBG_RESET		224
+#endif
-- 
1.8.2.3

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 08/20] arm: socfpga: Add clock driver for Arria 10
  2017-03-09  0:26 [U-Boot] [PATCH v2 00/20] Add Intel Arria 10 SoC support Ley Foon Tan
                   ` (6 preceding siblings ...)
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 07/20] arm: socfpga: Add reset driver support for Arria 10 Ley Foon Tan
@ 2017-03-09  0:26 ` Ley Foon Tan
  2017-03-10  1:47   ` Marek Vasut
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 09/20] arm: socfpga: Add system manager " Ley Foon Tan
                   ` (13 subsequent siblings)
  21 siblings, 1 reply; 60+ messages in thread
From: Ley Foon Tan @ 2017-03-09  0:26 UTC (permalink / raw)
  To: u-boot

Add clock driver support for Arria 10.

Signed-off-by: Tien Fong Chee <tien.fong.chee@intel.com>
Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
---
 arch/arm/mach-socfpga/Makefile                     |    3 +-
 arch/arm/mach-socfpga/clock_manager.c              |   18 +-
 arch/arm/mach-socfpga/clock_manager_arria10.c      | 1104 ++++++++++++++++++++
 arch/arm/mach-socfpga/include/mach/clock_manager.h |    6 +
 .../include/mach/clock_manager_arria10.h           |  222 ++++
 5 files changed, 1350 insertions(+), 3 deletions(-)
 create mode 100644 arch/arm/mach-socfpga/clock_manager_arria10.c
 create mode 100644 arch/arm/mach-socfpga/include/mach/clock_manager_arria10.h

diff --git a/arch/arm/mach-socfpga/Makefile b/arch/arm/mach-socfpga/Makefile
index d81f003..c494930 100644
--- a/arch/arm/mach-socfpga/Makefile
+++ b/arch/arm/mach-socfpga/Makefile
@@ -10,7 +10,8 @@
 obj-y	+= misc.o timer.o reset_manager.o clock_manager.o \
 	   fpga_manager.o board.o
 
-obj-$(CONFIG_TARGET_SOCFPGA_ARRIA10) += reset_manager_arria10.o
+obj-$(CONFIG_TARGET_SOCFPGA_ARRIA10) += clock_manager_arria10.o \
+					reset_manager_arria10.o
 
 obj-$(CONFIG_SPL_BUILD) += spl.o freeze_controller.o
 
diff --git a/arch/arm/mach-socfpga/clock_manager.c b/arch/arm/mach-socfpga/clock_manager.c
index c2af6f3..ad602c8 100644
--- a/arch/arm/mach-socfpga/clock_manager.c
+++ b/arch/arm/mach-socfpga/clock_manager.c
@@ -5,6 +5,8 @@
  */
 
 #include <common.h>
+#include <fdtdec.h>
+#include <wait_bit.h>
 #include <asm/io.h>
 #include <asm/arch/clock_manager.h>
 
@@ -18,7 +20,12 @@ void cm_wait_for_lock(u32 mask)
 	u32 inter_val;
 	u32 retry = 0;
 	do {
+#if defined(CONFIG_TARGET_SOCFPGA_GEN5)
 		inter_val = readl(&clock_manager_base->inter) & mask;
+#elif defined(CONFIG_TARGET_SOCFPGA_ARRIA10)
+		inter_val = readl(&clock_manager_base->stat) & mask;
+#endif
+		/* Wait for stable lock */
 		if (inter_val == mask)
 			retry++;
 		else
@@ -31,8 +38,10 @@ void cm_wait_for_lock(u32 mask)
 /* function to poll in the fsm busy bit */
 void cm_wait_for_fsm(void)
 {
-	while (readl(&clock_manager_base->stat) & CLKMGR_STAT_BUSY)
-		;
+	wait_for_bit(__func__, (const u32 *)&clock_manager_base->stat,
+		     CLKMGR_CLKMGR_STAT_BUSY_SET_MSK,
+		     false, 20000, false);
+
 }
 
 int set_cpu_clk_info(void)
@@ -43,7 +52,12 @@ int set_cpu_clk_info(void)
 
 	gd->bd->bi_arm_freq = cm_get_mpu_clk_hz() / 1000000;
 	gd->bd->bi_dsp_freq = 0;
+
+#if defined(CONFIG_TARGET_SOCFPGA_GEN5)
 	gd->bd->bi_ddr_freq = cm_get_sdram_clk_hz() / 1000000;
+#elif defined(CONFIG_TARGET_SOCFPGA_ARRIA10)
+	gd->bd->bi_ddr_freq = 0;
+#endif
 
 	return 0;
 }
diff --git a/arch/arm/mach-socfpga/clock_manager_arria10.c b/arch/arm/mach-socfpga/clock_manager_arria10.c
new file mode 100644
index 0000000..67b3e58
--- /dev/null
+++ b/arch/arm/mach-socfpga/clock_manager_arria10.c
@@ -0,0 +1,1104 @@
+/*
+ * Copyright (C) 2016-2017 Intel Corporation
+ *
+ * SPDX-License-Identifier:    GPL-2.0
+ */
+
+#include <common.h>
+#include <fdtdec.h>
+#include <asm/io.h>
+#include <asm/arch/clock_manager.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static u32 eosc1_hz;
+static u32 cb_intosc_hz;
+static u32 f2s_free_hz;
+static u32 cm_l4_main_clk_hz;
+static u32 cm_l4_sp_clk_hz;
+static u32 cm_l4_mp_clk_hz;
+static u32 cm_l4_sys_free_clk_hz;
+
+struct mainpll_cfg {
+	u32 vco0_psrc;
+	u32 vco1_denom;
+	u32 vco1_numer;
+	u32 mpuclk;
+	u32 mpuclk_cnt;
+	u32 mpuclk_src;
+	u32 nocclk;
+	u32 nocclk_cnt;
+	u32 nocclk_src;
+	u32 cntr2clk_cnt;
+	u32 cntr3clk_cnt;
+	u32 cntr4clk_cnt;
+	u32 cntr5clk_cnt;
+	u32 cntr6clk_cnt;
+	u32 cntr7clk_cnt;
+	u32 cntr7clk_src;
+	u32 cntr8clk_cnt;
+	u32 cntr9clk_cnt;
+	u32 cntr9clk_src;
+	u32 cntr15clk_cnt;
+	u32 nocdiv_l4mainclk;
+	u32 nocdiv_l4mpclk;
+	u32 nocdiv_l4spclk;
+	u32 nocdiv_csatclk;
+	u32 nocdiv_cstraceclk;
+	u32 nocdiv_cspdbclk;
+};
+
+struct perpll_cfg {
+	u32 vco0_psrc;
+	u32 vco1_denom;
+	u32 vco1_numer;
+	u32 cntr2clk_cnt;
+	u32 cntr2clk_src;
+	u32 cntr3clk_cnt;
+	u32 cntr3clk_src;
+	u32 cntr4clk_cnt;
+	u32 cntr4clk_src;
+	u32 cntr5clk_cnt;
+	u32 cntr5clk_src;
+	u32 cntr6clk_cnt;
+	u32 cntr6clk_src;
+	u32 cntr7clk_cnt;
+	u32 cntr8clk_cnt;
+	u32 cntr8clk_src;
+	u32 cntr9clk_cnt;
+	u32 emacctl_emac0sel;
+	u32 emacctl_emac1sel;
+	u32 emacctl_emac2sel;
+	u32 gpiodiv_gpiodbclk;
+};
+
+struct alteragrp_cfg {
+	u32 nocclk;
+	u32 mpuclk;
+};
+
+static const struct socfpga_clock_manager *clock_manager_base =
+	(struct socfpga_clock_manager *)SOCFPGA_CLKMGR_ADDRESS;
+
+static int of_to_struct(const void *blob, int node, int cfg_len, void *cfg)
+{
+	if (fdtdec_get_int_array(blob, node, "altr,of_reg_value",
+				 (u32 *)cfg, cfg_len)) {
+		/* could not find required property */
+		return -EINVAL;
+	}
+
+	return 0;
+}
+
+static int of_get_input_clks(const void *blob, int node, u32 *val)
+{
+	*val = fdtdec_get_uint(blob, node, "clock-frequency", 0);
+	if (!*val)
+		return -EINVAL;
+
+	return 0;
+}
+
+static int of_get_clk_cfg(const void *blob, struct mainpll_cfg *main_cfg,
+			  struct perpll_cfg *per_cfg,
+			  struct alteragrp_cfg *altrgrp_cfg)
+{
+	int node, child, len;
+	const char *node_name;
+
+	node = fdtdec_next_compatible(blob, 0, COMPAT_ALTERA_SOCFPGA_CLK);
+	if (node < 0)
+		return -EINVAL;
+
+	child = fdt_first_subnode(blob, node);
+	if (child < 0)
+		return -EINVAL;
+
+	child = fdt_first_subnode(blob, child);
+	if (child < 0)
+		return -EINVAL;
+
+	node_name = fdt_get_name(blob, child, &len);
+
+	while (node_name) {
+		if (!strcmp(node_name, "osc1")) {
+			if (of_get_input_clks(blob, child, &eosc1_hz))
+				return -EINVAL;
+		} else if (!strcmp(node_name, "cb_intosc_ls_clk")) {
+			if (of_get_input_clks(blob, child, &cb_intosc_hz))
+				return -EINVAL;
+		} else if (!strcmp(node_name, "f2s_free_clk")) {
+			if (of_get_input_clks(blob, child, &f2s_free_hz))
+				return -EINVAL;
+		} else if (!strcmp(node_name, "main_pll")) {
+			if (of_to_struct(blob, child,
+					 sizeof(*main_cfg)/sizeof(u32),
+					 main_cfg))
+				return -EINVAL;
+		} else if (!strcmp(node_name, "periph_pll")) {
+			if (of_to_struct(blob, child,
+					 sizeof(*per_cfg)/sizeof(u32),
+					 per_cfg))
+				return -EINVAL;
+		} else if (!strcmp(node_name, "altera")) {
+			if (of_to_struct(blob, child,
+					 sizeof(*altrgrp_cfg)/sizeof(u32),
+					 altrgrp_cfg))
+				return -EINVAL;
+
+			main_cfg->mpuclk = altrgrp_cfg->mpuclk;
+			main_cfg->nocclk = altrgrp_cfg->nocclk;
+		}
+		child = fdt_next_subnode(blob, child);
+
+		if (child < 0)
+			break;
+
+		node_name = fdt_get_name(blob, child, &len);
+	}
+
+	return 0;
+}
+
+/* calculate the intended main VCO frequency based on handoff */
+static unsigned int cm_calc_handoff_main_vco_clk_hz
+					(struct mainpll_cfg *main_cfg)
+{
+	unsigned int clk_hz;
+
+	/* Check main VCO clock source: eosc, intosc or f2s? */
+	switch (main_cfg->vco0_psrc) {
+	case CLKMGR_MAINPLL_VCO0_PSRC_EOSC:
+		clk_hz = eosc1_hz;
+		break;
+	case CLKMGR_MAINPLL_VCO0_PSRC_E_INTOSC:
+		clk_hz = cb_intosc_hz;
+		break;
+	case CLKMGR_MAINPLL_VCO0_PSRC_F2S:
+		clk_hz = f2s_free_hz;
+		break;
+	default:
+		return 0;
+	}
+
+	/* calculate the VCO frequency */
+	clk_hz /= (1 + main_cfg->vco1_denom);
+	clk_hz *= (1 + main_cfg->vco1_numer);
+
+	return clk_hz;
+}
+
+/* calculate the intended periph VCO frequency based on handoff */
+static unsigned int cm_calc_handoff_periph_vco_clk_hz(
+		struct mainpll_cfg *main_cfg, struct perpll_cfg *per_cfg)
+{
+	unsigned int clk_hz;
+
+	/* Check periph VCO clock source: eosc, intosc, f2s or mainpll? */
+	switch (per_cfg->vco0_psrc) {
+	case CLKMGR_PERPLL_VCO0_PSRC_EOSC:
+		clk_hz = eosc1_hz;
+		break;
+	case CLKMGR_PERPLL_VCO0_PSRC_E_INTOSC:
+		clk_hz = cb_intosc_hz;
+		break;
+	case CLKMGR_PERPLL_VCO0_PSRC_F2S:
+		clk_hz = f2s_free_hz;
+		break;
+	case CLKMGR_PERPLL_VCO0_PSRC_MAIN:
+		clk_hz = cm_calc_handoff_main_vco_clk_hz(main_cfg);
+		clk_hz /= main_cfg->cntr15clk_cnt;
+		break;
+	default:
+		return 0;
+	}
+
+	/* calculate the VCO frequency */
+	clk_hz /= (1 + per_cfg->vco1_denom);
+	clk_hz *= (1 + per_cfg->vco1_numer);
+
+	return clk_hz;
+}
+
+/* calculate the intended MPU clock frequency based on handoff */
+static unsigned int cm_calc_handoff_mpu_clk_hz(struct mainpll_cfg *main_cfg,
+					       struct perpll_cfg *per_cfg)
+{
+	unsigned int clk_hz;
+
+	/* Check MPU clock source: main, periph, osc1, intosc or f2s? */
+	switch (main_cfg->mpuclk_src) {
+	case CLKMGR_MAINPLL_MPUCLK_SRC_MAIN:
+		clk_hz = cm_calc_handoff_main_vco_clk_hz(main_cfg);
+		clk_hz /= ((main_cfg->mpuclk & CLKMGR_MAINPLL_MPUCLK_CNT_MSK)
+			   + 1);
+		break;
+	case CLKMGR_MAINPLL_MPUCLK_SRC_PERI:
+		clk_hz = cm_calc_handoff_periph_vco_clk_hz(main_cfg, per_cfg);
+		clk_hz /= (((main_cfg->mpuclk >>
+			   CLKMGR_MAINPLL_MPUCLK_PERICNT_LSB) &
+			   CLKMGR_MAINPLL_MPUCLK_CNT_MSK) + 1);
+		break;
+	case CLKMGR_MAINPLL_MPUCLK_SRC_OSC1:
+		clk_hz = eosc1_hz;
+		break;
+	case CLKMGR_MAINPLL_MPUCLK_SRC_INTOSC:
+		clk_hz = cb_intosc_hz;
+		break;
+	case CLKMGR_MAINPLL_MPUCLK_SRC_FPGA:
+		clk_hz = f2s_free_hz;
+		break;
+	default:
+		return 0;
+	}
+
+	clk_hz /= (main_cfg->mpuclk_cnt + 1);
+	return clk_hz;
+}
+
+/* calculate the intended NOC clock frequency based on handoff */
+static unsigned int cm_calc_handoff_noc_clk_hz(struct mainpll_cfg *main_cfg,
+					       struct perpll_cfg *per_cfg)
+{
+	unsigned int clk_hz;
+
+	/* Check MPU clock source: main, periph, osc1, intosc or f2s? */
+	switch (main_cfg->nocclk_src) {
+	case CLKMGR_MAINPLL_NOCCLK_SRC_MAIN:
+		clk_hz = cm_calc_handoff_main_vco_clk_hz(main_cfg);
+		clk_hz /= ((main_cfg->nocclk & CLKMGR_MAINPLL_NOCCLK_CNT_MSK)
+			   + 1);
+		break;
+	case CLKMGR_MAINPLL_NOCCLK_SRC_PERI:
+		clk_hz = cm_calc_handoff_periph_vco_clk_hz(main_cfg, per_cfg);
+		clk_hz /= (((main_cfg->nocclk >>
+			   CLKMGR_MAINPLL_NOCCLK_PERICNT_LSB) &
+			   CLKMGR_MAINPLL_NOCCLK_CNT_MSK) + 1);
+		break;
+	case CLKMGR_MAINPLL_NOCCLK_SRC_OSC1:
+		clk_hz = eosc1_hz;
+		break;
+	case CLKMGR_MAINPLL_NOCCLK_SRC_INTOSC:
+		clk_hz = cb_intosc_hz;
+		break;
+	case CLKMGR_MAINPLL_NOCCLK_SRC_FPGA:
+		clk_hz = f2s_free_hz;
+		break;
+	default:
+		return 0;
+	}
+
+	clk_hz /= (main_cfg->nocclk_cnt + 1);
+	return clk_hz;
+}
+
+/* return 1 if PLL ramp is required */
+static int cm_is_pll_ramp_required(int main0periph1,
+				   struct mainpll_cfg *main_cfg,
+				   struct perpll_cfg *per_cfg)
+{
+	/* Check for main PLL */
+	if (main0periph1 == 0) {
+		/*
+		 * PLL ramp is not required if both MPU clock and NOC clock are
+		 * not sourced from main PLL
+		 */
+		if (main_cfg->mpuclk_src != CLKMGR_MAINPLL_MPUCLK_SRC_MAIN &&
+		    main_cfg->nocclk_src != CLKMGR_MAINPLL_NOCCLK_SRC_MAIN)
+			return 0;
+
+		/*
+		 * PLL ramp is required if MPU clock is sourced from main PLL
+		 * and MPU clock is over 900MHz (as advised by HW team)
+		 */
+		if (main_cfg->mpuclk_src == CLKMGR_MAINPLL_MPUCLK_SRC_MAIN &&
+		    (cm_calc_handoff_mpu_clk_hz(main_cfg, per_cfg) >
+		     CLKMGR_PLL_RAMP_MPUCLK_THRESHOLD_HZ))
+			return 1;
+
+		/*
+		 * PLL ramp is required if NOC clock is sourced from main PLL
+		 * and NOC clock is over 300MHz (as advised by HW team)
+		 */
+		if (main_cfg->nocclk_src == CLKMGR_MAINPLL_NOCCLK_SRC_MAIN &&
+		    (cm_calc_handoff_noc_clk_hz(main_cfg, per_cfg) >
+		     CLKMGR_PLL_RAMP_NOCCLK_THRESHOLD_HZ))
+			return 2;
+
+	} else if (main0periph1 == 1) {
+		/*
+		 * PLL ramp is not required if both MPU clock and NOC clock are
+		 * not sourced from periph PLL
+		 */
+		if (main_cfg->mpuclk_src != CLKMGR_MAINPLL_MPUCLK_SRC_PERI &&
+		    main_cfg->nocclk_src != CLKMGR_MAINPLL_NOCCLK_SRC_PERI)
+			return 0;
+
+		/*
+		 * PLL ramp is required if MPU clock are source from periph PLL
+		 * and MPU clock is over 900MHz (as advised by HW team)
+		 */
+		if (main_cfg->mpuclk_src == CLKMGR_MAINPLL_MPUCLK_SRC_PERI &&
+		    (cm_calc_handoff_mpu_clk_hz(main_cfg, per_cfg) >
+		     CLKMGR_PLL_RAMP_MPUCLK_THRESHOLD_HZ))
+			return 1;
+
+		/*
+		 * PLL ramp is required if NOC clock are source from periph PLL
+		 * and NOC clock is over 300MHz (as advised by HW team)
+		 */
+		if (main_cfg->nocclk_src == CLKMGR_MAINPLL_NOCCLK_SRC_PERI &&
+		    (cm_calc_handoff_noc_clk_hz(main_cfg, per_cfg) >
+		     CLKMGR_PLL_RAMP_NOCCLK_THRESHOLD_HZ))
+			return 2;
+	}
+
+	return 0;
+}
+
+/*
+ * Calculate the new PLL numerator which is based on existing DTS hand off and
+ * intended safe frequency (safe_hz). Note that PLL ramp is only modifying the
+ * numerator while maintaining denominator as denominator will influence the
+ * jitter condition. Please refer A10 HPS TRM for the jitter guide. Note final
+ * value for numerator is minus with 1 to cater our register value
+ * representation.
+ */
+static unsigned int cm_calc_safe_pll_numer(int main0periph1,
+					   struct mainpll_cfg *main_cfg,
+					   struct perpll_cfg *per_cfg,
+					   unsigned int safe_hz)
+{
+	unsigned int clk_hz = 0;
+
+	/* Check for main PLL */
+	if (main0periph1 == 0) {
+		/* Check main VCO clock source: eosc, intosc or f2s? */
+		switch (main_cfg->vco0_psrc) {
+		case CLKMGR_MAINPLL_VCO0_PSRC_EOSC:
+			clk_hz = eosc1_hz;
+			break;
+		case CLKMGR_MAINPLL_VCO0_PSRC_E_INTOSC:
+			clk_hz = cb_intosc_hz;
+			break;
+		case CLKMGR_MAINPLL_VCO0_PSRC_F2S:
+			clk_hz = f2s_free_hz;
+			break;
+		default:
+			return 0;
+		}
+
+		/* Applicable if MPU clock is from main PLL */
+		if (main_cfg->mpuclk_src == CLKMGR_MAINPLL_MPUCLK_SRC_MAIN) {
+			/* calculate the safe numer value */
+			clk_hz = (safe_hz / clk_hz) *
+				(main_cfg->mpuclk_cnt + 1) *
+				((main_cfg->mpuclk &
+				  CLKMGR_MAINPLL_MPUCLK_CNT_MSK) + 1) *
+				(1 + main_cfg->vco1_denom) - 1;
+		}
+		/* Reach here if MPU clk not from main PLL but NOC clk is */
+		else if (main_cfg->nocclk_src ==
+			 CLKMGR_MAINPLL_NOCCLK_SRC_MAIN) {
+			/* calculate the safe numer value */
+			clk_hz = (safe_hz / clk_hz) *
+				(main_cfg->nocclk_cnt + 1) *
+				((main_cfg->nocclk &
+				  CLKMGR_MAINPLL_NOCCLK_CNT_MSK) + 1) *
+				(1 + main_cfg->vco1_denom) - 1;
+		} else
+			clk_hz = 0;
+
+	} else if (main0periph1 == 1) {
+		/* Check periph VCO clock source: eosc, intosc, f2s, mainpll */
+		switch (per_cfg->vco0_psrc) {
+		case CLKMGR_PERPLL_VCO0_PSRC_EOSC:
+			clk_hz = eosc1_hz;
+			break;
+		case CLKMGR_PERPLL_VCO0_PSRC_E_INTOSC:
+			clk_hz = cb_intosc_hz;
+			break;
+		case CLKMGR_PERPLL_VCO0_PSRC_F2S:
+			clk_hz = f2s_free_hz;
+			break;
+		case CLKMGR_PERPLL_VCO0_PSRC_MAIN:
+			clk_hz = cm_calc_handoff_main_vco_clk_hz(
+				 main_cfg);
+			clk_hz /= main_cfg->cntr15clk_cnt;
+			break;
+		default:
+			return 0;
+		}
+		/* Applicable if MPU clock is from periph PLL */
+		if (main_cfg->mpuclk_src == CLKMGR_MAINPLL_MPUCLK_SRC_PERI) {
+			/* calculate the safe numer value */
+			clk_hz = (safe_hz / clk_hz) *
+				(main_cfg->mpuclk_cnt + 1) *
+				(((main_cfg->mpuclk >>
+				  CLKMGR_MAINPLL_MPUCLK_PERICNT_LSB) &
+				  CLKMGR_MAINPLL_MPUCLK_CNT_MSK) + 1) *
+				(1 + per_cfg->vco1_denom) - 1;
+		}
+		/* Reach here if MPU clk not from periph PLL but NOC clk is */
+		else if (main_cfg->nocclk_src ==
+			 CLKMGR_MAINPLL_NOCCLK_SRC_PERI) {
+			/* calculate the safe numer value */
+			clk_hz = (safe_hz / clk_hz) *
+				(main_cfg->nocclk_cnt + 1) *
+				(((main_cfg->nocclk >>
+				  CLKMGR_MAINPLL_NOCCLK_PERICNT_LSB) &
+				  CLKMGR_MAINPLL_NOCCLK_CNT_MSK) + 1) *
+				(1 + per_cfg->vco1_denom) - 1;
+		} else
+			clk_hz = 0;
+	}
+	return clk_hz;
+}
+
+/* ramping the main PLL to final value */
+static void cm_pll_ramp_main(struct mainpll_cfg *main_cfg,
+			     struct perpll_cfg *per_cfg,
+			     unsigned int pll_ramp_main_hz)
+{
+	unsigned int clk_hz = 0, clk_incr_hz = 0, clk_final_hz = 0;
+
+	/* find out the increment value */
+	if (main_cfg->mpuclk_src == CLKMGR_MAINPLL_MPUCLK_SRC_MAIN) {
+		clk_incr_hz = CLKMGR_PLL_RAMP_MPUCLK_INCREMENT_HZ;
+		clk_final_hz = cm_calc_handoff_mpu_clk_hz(main_cfg, per_cfg);
+	} else if (main_cfg->nocclk_src == CLKMGR_MAINPLL_NOCCLK_SRC_MAIN) {
+		clk_incr_hz = CLKMGR_PLL_RAMP_NOCCLK_INCREMENT_HZ;
+		clk_final_hz = cm_calc_handoff_noc_clk_hz(main_cfg, per_cfg);
+	}
+
+	/* execute the ramping here */
+	for (clk_hz = pll_ramp_main_hz + clk_incr_hz;
+	     clk_hz < clk_final_hz; clk_hz += clk_incr_hz) {
+		writel((main_cfg->vco1_denom <<
+			CLKMGR_MAINPLL_VCO1_DENOM_LSB) |
+			cm_calc_safe_pll_numer(0, main_cfg, per_cfg, clk_hz),
+			&clock_manager_base->main_pll.vco1);
+		mdelay(1);
+		cm_wait_for_lock(LOCKED_MASK);
+	}
+	writel((main_cfg->vco1_denom << CLKMGR_MAINPLL_VCO1_DENOM_LSB) |
+		main_cfg->vco1_numer,
+			&clock_manager_base->main_pll.vco1);
+	mdelay(1);
+	cm_wait_for_lock(LOCKED_MASK);
+}
+
+/* ramping the periph PLL to final value */
+static void cm_pll_ramp_periph(struct mainpll_cfg *main_cfg,
+			       struct perpll_cfg *per_cfg,
+			       unsigned int pll_ramp_periph_hz)
+{
+	unsigned int clk_hz = 0, clk_incr_hz = 0, clk_final_hz = 0;
+
+	/* find out the increment value */
+	if (main_cfg->mpuclk_src == CLKMGR_MAINPLL_MPUCLK_SRC_PERI) {
+		clk_incr_hz = CLKMGR_PLL_RAMP_MPUCLK_INCREMENT_HZ;
+		clk_final_hz = cm_calc_handoff_mpu_clk_hz(main_cfg, per_cfg);
+	} else if (main_cfg->nocclk_src == CLKMGR_MAINPLL_NOCCLK_SRC_PERI) {
+		clk_incr_hz = CLKMGR_PLL_RAMP_NOCCLK_INCREMENT_HZ;
+		clk_final_hz = cm_calc_handoff_noc_clk_hz(main_cfg, per_cfg);
+	}
+	/* execute the ramping here */
+	for (clk_hz = pll_ramp_periph_hz + clk_incr_hz;
+	     clk_hz < clk_final_hz; clk_hz += clk_incr_hz) {
+		writel((per_cfg->vco1_denom << CLKMGR_PERPLL_VCO1_DENOM_LSB) |
+			cm_calc_safe_pll_numer(1, main_cfg, per_cfg, clk_hz),
+			&clock_manager_base->per_pll.vco1);
+		mdelay(1);
+		cm_wait_for_lock(LOCKED_MASK);
+	}
+	writel((per_cfg->vco1_denom << CLKMGR_PERPLL_VCO1_DENOM_LSB) |
+		per_cfg->vco1_numer,
+		&clock_manager_base->per_pll.vco1);
+	mdelay(1);
+	cm_wait_for_lock(LOCKED_MASK);
+}
+
+/*
+ * Setup clocks while making no assumptions of the
+ * previous state of the clocks.
+ *
+ * Start by being paranoid and gate all sw managed clocks
+ *
+ * Put all plls in bypass
+ *
+ * Put all plls VCO registers back to reset value (bgpwr dwn).
+ *
+ * Put peripheral and main pll src to reset value to avoid glitch.
+ *
+ * Delay 5 us.
+ *
+ * Deassert bg pwr dn and set numerator and denominator
+ *
+ * Start 7 us timer.
+ *
+ * set internal dividers
+ *
+ * Wait for 7 us timer.
+ *
+ * Enable plls
+ *
+ * Set external dividers while plls are locking
+ *
+ * Wait for pll lock
+ *
+ * Assert/deassert outreset all.
+ *
+ * Take all pll's out of bypass
+ *
+ * Clear safe mode
+ *
+ * set source main and peripheral clocks
+ *
+ * Ungate clocks
+ */
+
+static int cm_full_cfg(struct mainpll_cfg *main_cfg, struct perpll_cfg *per_cfg)
+{
+	unsigned int pll_ramp_main_hz = 0, pll_ramp_periph_hz = 0,
+		ramp_required;
+
+	/* gate off all mainpll clock excpet HW managed clock */
+	writel(CLKMGR_MAINPLL_EN_S2FUSER0CLKEN_SET_MSK |
+		CLKMGR_MAINPLL_EN_HMCPLLREFCLKEN_SET_MSK,
+		&clock_manager_base->main_pll.enr);
+
+	/* now we can gate off the rest of the peripheral clocks */
+	writel(0, &clock_manager_base->per_pll.en);
+
+	/* Put all plls in external bypass */
+	writel(CLKMGR_MAINPLL_BYPASS_RESET,
+	       &clock_manager_base->main_pll.bypasss);
+	writel(CLKMGR_PERPLL_BYPASS_RESET,
+	       &clock_manager_base->per_pll.bypasss);
+
+	/*
+	 * Put all plls VCO registers back to reset value.
+	 * Some code might have messed with them. At same time set the
+	 * desired clock source
+	 */
+	writel(CLKMGR_MAINPLL_VCO0_RESET |
+	       CLKMGR_MAINPLL_VCO0_REGEXTSEL_SET_MSK |
+	       (main_cfg->vco0_psrc << CLKMGR_MAINPLL_VCO0_PSRC_LSB),
+	       &clock_manager_base->main_pll.vco0);
+
+	writel(CLKMGR_PERPLL_VCO0_RESET |
+	       CLKMGR_PERPLL_VCO0_REGEXTSEL_SET_MSK |
+	       (per_cfg->vco0_psrc << CLKMGR_PERPLL_VCO0_PSRC_LSB),
+	       &clock_manager_base->per_pll.vco0);
+
+	writel(CLKMGR_MAINPLL_VCO1_RESET, &clock_manager_base->main_pll.vco1);
+	writel(CLKMGR_PERPLL_VCO1_RESET, &clock_manager_base->per_pll.vco1);
+
+	/* clear the interrupt register status register */
+	writel(CLKMGR_CLKMGR_INTR_MAINPLLLOST_SET_MSK |
+		CLKMGR_CLKMGR_INTR_PERPLLLOST_SET_MSK |
+		CLKMGR_CLKMGR_INTR_MAINPLLRFSLIP_SET_MSK |
+		CLKMGR_CLKMGR_INTR_PERPLLRFSLIP_SET_MSK |
+		CLKMGR_CLKMGR_INTR_MAINPLLFBSLIP_SET_MSK |
+		CLKMGR_CLKMGR_INTR_PERPLLFBSLIP_SET_MSK |
+		CLKMGR_CLKMGR_INTR_MAINPLLACHIEVED_SET_MSK |
+		CLKMGR_CLKMGR_INTR_PERPLLACHIEVED_SET_MSK,
+		&clock_manager_base->intr);
+
+	/* Program VCO Numerator and Denominator for main PLL */
+	ramp_required = cm_is_pll_ramp_required(0, main_cfg, per_cfg);
+	if (ramp_required) {
+		/* set main PLL to safe starting threshold frequency */
+		if (ramp_required == 1)
+			pll_ramp_main_hz = CLKMGR_PLL_RAMP_MPUCLK_THRESHOLD_HZ;
+		else if (ramp_required == 2)
+			pll_ramp_main_hz = CLKMGR_PLL_RAMP_NOCCLK_THRESHOLD_HZ;
+
+		writel((main_cfg->vco1_denom << CLKMGR_MAINPLL_VCO1_DENOM_LSB) |
+			cm_calc_safe_pll_numer(0, main_cfg, per_cfg,
+					       pll_ramp_main_hz),
+			&clock_manager_base->main_pll.vco1);
+	} else
+		writel((main_cfg->vco1_denom << CLKMGR_MAINPLL_VCO1_DENOM_LSB) |
+			main_cfg->vco1_numer,
+			&clock_manager_base->main_pll.vco1);
+
+	/* Program VCO Numerator and Denominator for periph PLL */
+	ramp_required = cm_is_pll_ramp_required(1, main_cfg, per_cfg);
+	if (ramp_required) {
+		/* set periph PLL to safe starting threshold frequency */
+		if (ramp_required == 1)
+			pll_ramp_periph_hz =
+				CLKMGR_PLL_RAMP_MPUCLK_THRESHOLD_HZ;
+		else if (ramp_required == 2)
+			pll_ramp_periph_hz =
+				CLKMGR_PLL_RAMP_NOCCLK_THRESHOLD_HZ;
+
+		writel((per_cfg->vco1_denom << CLKMGR_PERPLL_VCO1_DENOM_LSB) |
+			cm_calc_safe_pll_numer(1, main_cfg, per_cfg,
+					       pll_ramp_periph_hz),
+			&clock_manager_base->per_pll.vco1);
+	} else
+		writel((per_cfg->vco1_denom << CLKMGR_PERPLL_VCO1_DENOM_LSB) |
+			per_cfg->vco1_numer,
+			&clock_manager_base->per_pll.vco1);
+
+	/* Wait for at least 5 us */
+	udelay(5);
+
+	/* Now deassert BGPWRDN and PWRDN */
+	clrbits_le32(&clock_manager_base->main_pll.vco0,
+		     CLKMGR_MAINPLL_VCO0_BGPWRDN_SET_MSK |
+		     CLKMGR_MAINPLL_VCO0_PWRDN_SET_MSK);
+	clrbits_le32(&clock_manager_base->per_pll.vco0,
+		     CLKMGR_PERPLL_VCO0_BGPWRDN_SET_MSK |
+		     CLKMGR_PERPLL_VCO0_PWRDN_SET_MSK);
+
+	/* Wait for at least 7 us */
+	udelay(7);
+
+	/* enable the VCO and disable the external regulator to PLL */
+	writel((readl(&clock_manager_base->main_pll.vco0) &
+		~CLKMGR_MAINPLL_VCO0_REGEXTSEL_SET_MSK) |
+		CLKMGR_MAINPLL_VCO0_EN_SET_MSK,
+		&clock_manager_base->main_pll.vco0);
+	writel((readl(&clock_manager_base->per_pll.vco0) &
+		~CLKMGR_PERPLL_VCO0_REGEXTSEL_SET_MSK) |
+		CLKMGR_PERPLL_VCO0_EN_SET_MSK,
+		&clock_manager_base->per_pll.vco0);
+
+	/* setup all the main PLL counter and clock source */
+	writel(main_cfg->nocclk,
+	       SOCFPGA_CLKMGR_ADDRESS + CLKMGR_MAINPLL_NOC_CLK_OFFSET);
+	writel(main_cfg->mpuclk,
+	       SOCFPGA_CLKMGR_ADDRESS + CLKMGR_ALTERAGRP_MPU_CLK_OFFSET);
+
+	/* main_emaca_clk divider */
+	writel(main_cfg->cntr2clk_cnt, &clock_manager_base->main_pll.cntr2clk);
+	/* main_emacb_clk divider */
+	writel(main_cfg->cntr3clk_cnt, &clock_manager_base->main_pll.cntr3clk);
+	/* main_emac_ptp_clk divider */
+	writel(main_cfg->cntr4clk_cnt, &clock_manager_base->main_pll.cntr4clk);
+	/* main_gpio_db_clk divider */
+	writel(main_cfg->cntr5clk_cnt, &clock_manager_base->main_pll.cntr5clk);
+	/* main_sdmmc_clk divider */
+	writel(main_cfg->cntr6clk_cnt, &clock_manager_base->main_pll.cntr6clk);
+	/* main_s2f_user0_clk divider */
+	writel(main_cfg->cntr7clk_cnt |
+	       (main_cfg->cntr7clk_src << CLKMGR_MAINPLL_CNTR7CLK_SRC_LSB),
+	       &clock_manager_base->main_pll.cntr7clk);
+	/* main_s2f_user1_clk divider */
+	writel(main_cfg->cntr8clk_cnt, &clock_manager_base->main_pll.cntr8clk);
+	/* main_hmc_pll_clk divider */
+	writel(main_cfg->cntr9clk_cnt |
+	       (main_cfg->cntr9clk_src << CLKMGR_MAINPLL_CNTR9CLK_SRC_LSB),
+	       &clock_manager_base->main_pll.cntr9clk);
+	/* main_periph_ref_clk divider */
+	writel(main_cfg->cntr15clk_cnt,
+	       &clock_manager_base->main_pll.cntr15clk);
+
+	/* setup all the peripheral PLL counter and clock source */
+	/* peri_emaca_clk divider */
+	writel(per_cfg->cntr2clk_cnt |
+	       (per_cfg->cntr2clk_src << CLKMGR_PERPLL_CNTR2CLK_SRC_LSB),
+	       &clock_manager_base->per_pll.cntr2clk);
+	/* peri_emacb_clk divider */
+	writel(per_cfg->cntr3clk_cnt |
+	       (per_cfg->cntr3clk_src << CLKMGR_PERPLL_CNTR3CLK_SRC_LSB),
+	       &clock_manager_base->per_pll.cntr3clk);
+	/* peri_emac_ptp_clk divider */
+	writel(per_cfg->cntr4clk_cnt |
+	       (per_cfg->cntr4clk_src << CLKMGR_PERPLL_CNTR4CLK_SRC_LSB),
+	       &clock_manager_base->per_pll.cntr4clk);
+	/* peri_gpio_db_clk divider */
+	writel(per_cfg->cntr5clk_cnt |
+	       (per_cfg->cntr5clk_src << CLKMGR_PERPLL_CNTR5CLK_SRC_LSB),
+	       &clock_manager_base->per_pll.cntr5clk);
+	/* peri_sdmmc_clk divider */
+	writel(per_cfg->cntr6clk_cnt |
+	       (per_cfg->cntr6clk_src << CLKMGR_PERPLL_CNTR6CLK_SRC_LSB),
+	       &clock_manager_base->per_pll.cntr6clk);
+	/* peri_s2f_user0_clk divider */
+	writel(per_cfg->cntr7clk_cnt, &clock_manager_base->per_pll.cntr7clk);
+	/* peri_s2f_user1_clk divider */
+	writel(per_cfg->cntr8clk_cnt |
+	       (per_cfg->cntr8clk_src << CLKMGR_PERPLL_CNTR8CLK_SRC_LSB),
+	       &clock_manager_base->per_pll.cntr8clk);
+	/* peri_hmc_pll_clk divider */
+	writel(per_cfg->cntr9clk_cnt, &clock_manager_base->per_pll.cntr9clk);
+
+	/* setup all the external PLL counter */
+	/* mpu wrapper / external divider */
+	writel(main_cfg->mpuclk_cnt |
+	       (main_cfg->mpuclk_src << CLKMGR_MAINPLL_MPUCLK_SRC_LSB),
+	       &clock_manager_base->main_pll.mpuclk);
+	/* NOC wrapper / external divider */
+	writel(main_cfg->nocclk_cnt |
+	       (main_cfg->nocclk_src << CLKMGR_MAINPLL_NOCCLK_SRC_LSB),
+	       &clock_manager_base->main_pll.nocclk);
+	/* NOC subclock divider such as l4 */
+	writel(main_cfg->nocdiv_l4mainclk |
+	       (main_cfg->nocdiv_l4mpclk <<
+		CLKMGR_MAINPLL_NOCDIV_L4MPCLK_LSB) |
+	       (main_cfg->nocdiv_l4spclk <<
+		CLKMGR_MAINPLL_NOCDIV_L4SPCLK_LSB) |
+	       (main_cfg->nocdiv_csatclk <<
+		CLKMGR_MAINPLL_NOCDIV_CSATCLK_LSB) |
+	       (main_cfg->nocdiv_cstraceclk <<
+		CLKMGR_MAINPLL_NOCDIV_CSTRACECLK_LSB) |
+	       (main_cfg->nocdiv_cspdbclk <<
+		CLKMGR_MAINPLL_NOCDIV_CSPDBGCLK_LSB),
+		&clock_manager_base->main_pll.nocdiv);
+	/* gpio_db external divider */
+	writel(per_cfg->gpiodiv_gpiodbclk,
+	       &clock_manager_base->per_pll.gpiodiv);
+
+	/* setup the EMAC clock mux select */
+	writel((per_cfg->emacctl_emac0sel <<
+		CLKMGR_PERPLL_EMACCTL_EMAC0SEL_LSB) |
+	       (per_cfg->emacctl_emac1sel <<
+		CLKMGR_PERPLL_EMACCTL_EMAC1SEL_LSB) |
+	       (per_cfg->emacctl_emac2sel <<
+		CLKMGR_PERPLL_EMACCTL_EMAC2SEL_LSB),
+	       &clock_manager_base->per_pll.emacctl);
+
+	/* at this stage, check for PLL lock status */
+	cm_wait_for_lock(LOCKED_MASK);
+
+	/*
+	 * after locking, but before taking out of bypass,
+	 * assert/deassert outresetall
+	 */
+	/* assert mainpll outresetall */
+	setbits_le32(&clock_manager_base->main_pll.vco0,
+		     CLKMGR_MAINPLL_VCO0_OUTRSTALL_SET_MSK);
+	/* assert perpll outresetall */
+	setbits_le32(&clock_manager_base->per_pll.vco0,
+		     CLKMGR_PERPLL_VCO0_OUTRSTALL_SET_MSK);
+	/* de-assert mainpll outresetall */
+	clrbits_le32(&clock_manager_base->main_pll.vco0,
+		     CLKMGR_MAINPLL_VCO0_OUTRSTALL_SET_MSK);
+	/* de-assert perpll outresetall */
+	clrbits_le32(&clock_manager_base->per_pll.vco0,
+		     CLKMGR_PERPLL_VCO0_OUTRSTALL_SET_MSK);
+
+	/* Take all PLLs out of bypass when boot mode is cleared. */
+	/* release mainpll from bypass */
+	writel(CLKMGR_MAINPLL_BYPASS_RESET,
+	       &clock_manager_base->main_pll.bypassr);
+	/* wait till Clock Manager is not busy */
+	cm_wait_for_fsm();
+
+	/* release perpll from bypass */
+	writel(CLKMGR_PERPLL_BYPASS_RESET,
+	       &clock_manager_base->per_pll.bypassr);
+	/* wait till Clock Manager is not busy */
+	cm_wait_for_fsm();
+
+	/* clear boot mode */
+	clrbits_le32(&clock_manager_base->ctrl,
+		     CLKMGR_CLKMGR_CTL_BOOTMOD_SET_MSK);
+	/* wait till Clock Manager is not busy */
+	cm_wait_for_fsm();
+
+	/* At here, we need to ramp to final value if needed */
+	if (pll_ramp_main_hz != 0)
+		cm_pll_ramp_main(main_cfg, per_cfg, pll_ramp_main_hz);
+	if (pll_ramp_periph_hz != 0)
+		cm_pll_ramp_periph(main_cfg, per_cfg, pll_ramp_periph_hz);
+
+	/* Now ungate non-hw-managed clocks */
+	writel(CLKMGR_MAINPLL_EN_S2FUSER0CLKEN_SET_MSK |
+		CLKMGR_MAINPLL_EN_HMCPLLREFCLKEN_SET_MSK,
+		&clock_manager_base->main_pll.ens);
+	writel(CLKMGR_PERPLL_EN_RESET, &clock_manager_base->per_pll.ens);
+
+	/* Clear the loss lock and slip bits as they might set during
+	clock reconfiguration */
+	writel(CLKMGR_CLKMGR_INTR_MAINPLLLOST_SET_MSK |
+	       CLKMGR_CLKMGR_INTR_PERPLLLOST_SET_MSK |
+	       CLKMGR_CLKMGR_INTR_MAINPLLRFSLIP_SET_MSK |
+	       CLKMGR_CLKMGR_INTR_PERPLLRFSLIP_SET_MSK |
+	       CLKMGR_CLKMGR_INTR_MAINPLLFBSLIP_SET_MSK |
+	       CLKMGR_CLKMGR_INTR_PERPLLFBSLIP_SET_MSK,
+	       &clock_manager_base->intr);
+
+	return 0;
+}
+
+void cm_use_intosc(void)
+{
+	setbits_le32(&clock_manager_base->ctrl,
+		     CLKMGR_CLKMGR_CTL_BOOTCLK_INTOSC_SET_MSK);
+}
+
+unsigned int cm_get_noc_clk_hz(void)
+{
+	unsigned int clk_src, divisor, nocclk, src_hz;
+
+	nocclk = readl(&clock_manager_base->main_pll.nocclk);
+	clk_src = (nocclk >> CLKMGR_MAINPLL_NOCCLK_SRC_LSB) &
+		CLKMGR_MAINPLL_NOCCLK_SRC_MSK;
+
+	divisor = 1 + (nocclk & CLKMGR_MAINPLL_NOCDIV_MSK);
+
+	if (clk_src == CLKMGR_PERPLLGRP_SRC_MAIN) {
+		src_hz = cm_get_main_vco_clk_hz();
+		src_hz /= 1 +
+		(readl(SOCFPGA_CLKMGR_ADDRESS+CLKMGR_MAINPLL_NOC_CLK_OFFSET)&
+		CLKMGR_MAINPLL_NOCCLK_CNT_MSK);
+	} else if (clk_src == CLKMGR_PERPLLGRP_SRC_PERI) {
+		src_hz = cm_get_per_vco_clk_hz();
+		src_hz /= 1 +
+		((readl(SOCFPGA_CLKMGR_ADDRESS+CLKMGR_MAINPLL_NOC_CLK_OFFSET)>>
+			CLKMGR_MAINPLL_NOCCLK_PERICNT_LSB)&
+			CLKMGR_MAINPLL_NOCCLK_CNT_MSK);
+	} else if (clk_src == CLKMGR_PERPLLGRP_SRC_OSC1) {
+		src_hz = eosc1_hz;
+	} else if (clk_src == CLKMGR_PERPLLGRP_SRC_INTOSC) {
+		src_hz = cb_intosc_hz;
+	} else if (clk_src == CLKMGR_PERPLLGRP_SRC_FPGA) {
+		src_hz = f2s_free_hz;
+	} else {
+		src_hz = 0;
+	}
+
+	return src_hz / divisor;
+}
+
+unsigned int cm_get_l4_noc_hz(unsigned int nocdivshift)
+{
+	unsigned int divisor2 = 1 <<
+		((readl(&clock_manager_base->main_pll.nocdiv) >>
+			nocdivshift) & CLKMGR_MAINPLL_NOCDIV_MSK);
+
+	return cm_get_noc_clk_hz() / divisor2;
+}
+
+int cm_basic_init(const void *blob)
+{
+	struct mainpll_cfg main_cfg;
+	struct perpll_cfg per_cfg;
+	struct alteragrp_cfg altrgrp_cfg;
+	int rval;
+
+	/* initialize to zero for use case of optional node */
+	memset(&main_cfg, 0, sizeof(main_cfg));
+	memset(&per_cfg, 0, sizeof(per_cfg));
+	memset(&altrgrp_cfg, 0, sizeof(altrgrp_cfg));
+
+	rval = of_get_clk_cfg(blob, &main_cfg, &per_cfg, &altrgrp_cfg);
+	if (rval)
+		return rval;
+
+	rval =  cm_full_cfg(&main_cfg, &per_cfg);
+
+	cm_l4_main_clk_hz =
+		cm_get_l4_noc_hz(CLKMGR_MAINPLL_NOCDIV_L4MAINCLK_LSB);
+
+	cm_l4_mp_clk_hz = cm_get_l4_noc_hz(CLKMGR_MAINPLL_NOCDIV_L4MPCLK_LSB);
+
+	cm_l4_sp_clk_hz = cm_get_l4_sp_clk_hz();
+
+	cm_l4_sys_free_clk_hz = cm_get_noc_clk_hz() / 4;
+
+	return rval;
+}
+
+unsigned long cm_get_mpu_clk_hz(void)
+{
+	u32 reg, clk_hz;
+	u32 clk_src, mainmpuclk_reg;
+
+	mainmpuclk_reg = readl(&clock_manager_base->main_pll.mpuclk);
+
+	clk_src = (mainmpuclk_reg >> CLKMGR_MAINPLL_MPUCLK_SRC_LSB) &
+		CLKMGR_MAINPLL_MPUCLK_SRC_MSK;
+
+	reg = readl(&clock_manager_base->altera.mpuclk);
+	/* Check MPU clock source: main, periph, osc1, intosc or f2s? */
+	switch (clk_src) {
+	case CLKMGR_MAINPLL_MPUCLK_SRC_MAIN:
+		clk_hz = cm_get_main_vco_clk_hz();
+		clk_hz /= ((reg & CLKMGR_MAINPLL_MPUCLK_CNT_MSK)
+			   + 1);
+		break;
+	case CLKMGR_MAINPLL_MPUCLK_SRC_PERI:
+		clk_hz = cm_get_per_vco_clk_hz();
+		clk_hz /= (((reg >> CLKMGR_MAINPLL_MPUCLK_PERICNT_LSB) &
+			   CLKMGR_MAINPLL_MPUCLK_CNT_MSK) + 1);
+		break;
+	case CLKMGR_MAINPLL_MPUCLK_SRC_OSC1:
+		clk_hz = eosc1_hz;
+		break;
+	case CLKMGR_MAINPLL_MPUCLK_SRC_INTOSC:
+		clk_hz = cb_intosc_hz;
+		break;
+	case CLKMGR_MAINPLL_MPUCLK_SRC_FPGA:
+		clk_hz = f2s_free_hz;
+		break;
+	default:
+		printf("cm_get_mpu_clk_hz invalid clk_src %d\n", clk_src);
+		return 0;
+	}
+
+	clk_hz /= ((mainmpuclk_reg & CLKMGR_MAINPLL_MPUCLK_CNT_MSK) + 1);
+
+	return clk_hz;
+}
+
+unsigned int cm_get_per_vco_clk_hz(void)
+{
+	u32 src_hz = 0;
+	u32 clk_src = 0;
+	u32 numer = 0;
+	u32 denom = 0;
+	u32 vco = 0;
+
+	clk_src = readl(&clock_manager_base->per_pll.vco0);
+
+	clk_src = (clk_src >> CLKMGR_PERPLL_VCO0_PSRC_LSB) &
+		CLKMGR_PERPLL_VCO0_PSRC_MSK;
+
+	if (clk_src == CLKMGR_PERPLL_VCO0_PSRC_EOSC) {
+		src_hz = eosc1_hz;
+	} else if (clk_src == CLKMGR_PERPLL_VCO0_PSRC_E_INTOSC) {
+		src_hz = cb_intosc_hz;
+	} else if (clk_src == CLKMGR_PERPLL_VCO0_PSRC_F2S) {
+		src_hz = f2s_free_hz;
+	} else if (clk_src == CLKMGR_PERPLL_VCO0_PSRC_MAIN) {
+		src_hz = cm_get_main_vco_clk_hz();
+		src_hz /= (readl
+			(&clock_manager_base->main_pll.cntr15clk) &
+			CLKMGR_MAINPLL_CNTRCLK_MSK) + 1;
+	} else {
+		printf("cm_get_per_vco_clk_hz invalid clk_src %d\n", clk_src);
+		return 0;
+	}
+
+	vco = readl(&clock_manager_base->per_pll.vco1);
+
+	numer = vco & CLKMGR_PERPLL_VCO1_NUMER_MSK;
+
+	denom = (vco >> CLKMGR_PERPLL_VCO1_DENOM_LSB) &
+			CLKMGR_PERPLL_VCO1_DENOM_MSK;
+
+	vco = src_hz;
+	vco /= (1 + denom);
+	vco *= (1 + numer);
+
+	return vco;
+}
+
+unsigned int cm_get_main_vco_clk_hz(void)
+{
+	u32 src_hz, numer, denom, vco;
+
+	u32 clk_src = readl(&clock_manager_base->main_pll.vco0);
+
+	clk_src = (clk_src >> CLKMGR_MAINPLL_VCO0_PSRC_LSB) &
+		CLKMGR_MAINPLL_VCO0_PSRC_MSK;
+
+	if (clk_src == CLKMGR_MAINPLL_VCO0_PSRC_EOSC) {
+		src_hz = eosc1_hz;
+	} else if (clk_src == CLKMGR_MAINPLL_VCO0_PSRC_E_INTOSC) {
+		src_hz = cb_intosc_hz;
+	} else if (clk_src == CLKMGR_MAINPLL_VCO0_PSRC_F2S) {
+		src_hz = f2s_free_hz;
+	} else {
+		printf("cm_get_main_vco_clk_hz invalid clk_src %d\n", clk_src);
+		return 0;
+	}
+
+	vco = readl(&clock_manager_base->main_pll.vco1);
+
+	numer = vco & CLKMGR_MAINPLL_VCO1_NUMER_MSK;
+
+	denom = (vco >> CLKMGR_MAINPLL_VCO1_DENOM_LSB) &
+			CLKMGR_MAINPLL_VCO1_DENOM_MSK;
+
+	vco = src_hz;
+	vco /= (1 + denom);
+	vco *= (1 + numer);
+
+	return vco;
+}
+
+unsigned int cm_get_l4_sp_clk_hz(void)
+{
+	return cm_get_l4_noc_hz(CLKMGR_MAINPLL_NOCDIV_L4SPCLK_LSB);
+}
+
+unsigned int cm_get_mmc_controller_clk_hz(void)
+{
+	u32 clk_hz = 0;
+	u32 clk_input = 0;
+
+	clk_input = readl(&clock_manager_base->per_pll.cntr6clk);
+	clk_input = (clk_input >> CLKMGR_PERPLL_CNTR6CLK_SRC_LSB) &
+		CLKMGR_PERPLLGRP_SRC_MSK;
+
+	switch (clk_input) {
+	case CLKMGR_PERPLLGRP_SRC_MAIN:
+		clk_hz = cm_get_main_vco_clk_hz();
+		clk_hz /= 1 +
+			(readl
+			(&clock_manager_base->main_pll.cntr6clk) &
+			CLKMGR_MAINPLL_CNTRCLK_MSK);
+		break;
+
+	case CLKMGR_PERPLLGRP_SRC_PERI:
+		clk_hz = cm_get_per_vco_clk_hz();
+		clk_hz /= 1 + (readl
+			(&clock_manager_base->per_pll.cntr6clk) &
+			CLKMGR_PERPLL_CNTRCLK_MSK);
+		break;
+
+	case CLKMGR_PERPLLGRP_SRC_OSC1:
+		clk_hz = eosc1_hz;
+		break;
+
+	case CLKMGR_PERPLLGRP_SRC_INTOSC:
+		clk_hz = cb_intosc_hz;
+		break;
+
+	case CLKMGR_PERPLLGRP_SRC_FPGA:
+		clk_hz = f2s_free_hz;
+		break;
+	}
+
+	return clk_hz / 4;
+}
+
+unsigned int cm_get_spi_controller_clk_hz(void)
+{
+	return cm_get_l4_noc_hz(CLKMGR_MAINPLL_NOCDIV_L4MPCLK_LSB);
+}
+
+unsigned int cm_get_qspi_controller_clk_hz(void)
+{
+	return  cm_get_l4_noc_hz(CLKMGR_MAINPLL_NOCDIV_L4MAINCLK_LSB);
+}
+
+void cm_print_clock_quick_summary(void)
+{
+	printf("MPU       %10ld kHz\n", cm_get_mpu_clk_hz() / 1000);
+	printf("MMC         %8d kHz\n", cm_get_mmc_controller_clk_hz() / 1000);
+	printf("QSPI        %8d kHz\n",
+	       cm_get_qspi_controller_clk_hz() / 1000);
+	printf("SPI         %8d kHz\n", cm_get_spi_controller_clk_hz() / 1000);
+	printf("EOSC1       %8d kHz\n", eosc1_hz / 1000);
+	printf("cb_intosc   %8d kHz\n", cb_intosc_hz / 1000);
+	printf("f2s_free    %8d kHz\n", f2s_free_hz / 1000);
+	printf("Main VCO    %8d kHz\n", cm_get_main_vco_clk_hz() / 1000);
+	printf("NOC         %8d kHz\n", cm_get_noc_clk_hz() / 1000);
+	printf("L4 Main	    %8d kHz\n",
+	       cm_get_l4_noc_hz(CLKMGR_MAINPLL_NOCDIV_L4MAINCLK_LSB) / 1000);
+	printf("L4 MP       %8d kHz\n",
+	       cm_get_l4_noc_hz(CLKMGR_MAINPLL_NOCDIV_L4MPCLK_LSB) / 1000);
+	printf("L4 SP       %8d kHz\n",
+	       cm_get_l4_sp_clk_hz() / 1000);
+	printf("L4 sys free %8d kHz\n", cm_l4_sys_free_clk_hz / 1000);
+}
diff --git a/arch/arm/mach-socfpga/include/mach/clock_manager.h b/arch/arm/mach-socfpga/include/mach/clock_manager.h
index d0d0487..ec067ae 100644
--- a/arch/arm/mach-socfpga/include/mach/clock_manager.h
+++ b/arch/arm/mach-socfpga/include/mach/clock_manager.h
@@ -13,7 +13,13 @@ void cm_wait_for_fsm(void);
 void cm_print_clock_quick_summary(void);
 #endif
 
+/* Common mask */
+#define CLKMGR_CLKMGR_STAT_BUSY_SET_MSK			0x00000001
+
 #if defined(CONFIG_TARGET_SOCFPGA_GEN5)
 #include <asm/arch/clock_manager_gen5.h>
+#elif defined(CONFIG_TARGET_SOCFPGA_ARRIA10)
+#include <asm/arch/clock_manager_arria10.h>
 #endif
+
 #endif /* _CLOCK_MANAGER_H_ */
diff --git a/arch/arm/mach-socfpga/include/mach/clock_manager_arria10.h b/arch/arm/mach-socfpga/include/mach/clock_manager_arria10.h
new file mode 100644
index 0000000..fec0ffd
--- /dev/null
+++ b/arch/arm/mach-socfpga/include/mach/clock_manager_arria10.h
@@ -0,0 +1,222 @@
+/*
+ * Copyright (C) 2016-2017 Intel Corporation
+ *
+ * SPDX-License-Identifier:	GPL-2.0
+ */
+
+#ifndef CLOCK_MANAGER_ARRIA10
+#define CLOCK_MANAGER_ARRIA10
+
+#ifndef __ASSEMBLER__
+
+struct socfpga_clock_manager_main_pll {
+	u32  vco0;
+	u32  vco1;
+	u32  en;
+	u32  ens;
+	u32  enr;
+	u32  bypass;
+	u32  bypasss;
+	u32  bypassr;
+	u32  mpuclk;
+	u32  nocclk;
+	u32  cntr2clk;
+	u32  cntr3clk;
+	u32  cntr4clk;
+	u32  cntr5clk;
+	u32  cntr6clk;
+	u32  cntr7clk;
+	u32  cntr8clk;
+	u32  cntr9clk;
+	u32  pad_0x48_0x5b[5];
+	u32  cntr15clk;
+	u32  outrst;
+	u32  outrststat;
+	u32  nocdiv;
+	u32  pad_0x6c_0x80[5];
+};
+
+struct socfpga_clock_manager_per_pll {
+	u32  vco0;
+	u32  vco1;
+	u32  en;
+	u32  ens;
+	u32  enr;
+	u32  bypass;
+	u32  bypasss;
+	u32  bypassr;
+	u32  pad_0x20_0x27[2];
+	u32  cntr2clk;
+	u32  cntr3clk;
+	u32  cntr4clk;
+	u32  cntr5clk;
+	u32  cntr6clk;
+	u32  cntr7clk;
+	u32  cntr8clk;
+	u32  cntr9clk;
+	u32  pad_0x48_0x5f[6];
+	u32  outrst;
+	u32  outrststat;
+	u32  emacctl;
+	u32  gpiodiv;
+	u32  pad_0x70_0x80[4];
+};
+
+struct socfpga_clock_manager_altera {
+	u32	mpuclk;
+	u32	nocclk;
+	u32	mainmisc0;
+	u32	mainmisc1;
+	u32	perimisc0;
+	u32	perimisc1;
+};
+
+struct socfpga_clock_manager {
+	/* clkmgr */
+	u32  ctrl;
+	u32  intr;
+	u32  intrs;
+	u32  intrr;
+	u32  intren;
+	u32  intrens;
+	u32  intrenr;
+	u32  stat;
+	u32  testioctrl;
+	u32  _pad_0x24_0x40[7];
+	/* mainpllgrp */
+	struct socfpga_clock_manager_main_pll main_pll;
+	/* perpllgrp */
+	struct socfpga_clock_manager_per_pll per_pll;
+	struct socfpga_clock_manager_altera altera;
+};
+
+void cm_use_intosc(void);
+unsigned int cm_get_noc_clk_hz(void);
+unsigned int cm_get_l4_noc_hz(unsigned int nocdivshift);
+int cm_basic_init(const void *blob);
+
+unsigned int cm_get_l4_sp_clk_hz(void);
+unsigned int cm_get_main_vco_clk_hz(void);
+unsigned int cm_get_per_vco_clk_hz(void);
+unsigned long cm_get_mpu_clk_hz(void);
+
+unsigned int cm_get_qspi_controller_clk_hz(void);
+unsigned int cm_get_mmc_controller_clk_hz(void);
+unsigned int cm_get_spi_controller_clk_hz(void);
+
+#endif /* __ASSEMBLER__ */
+
+#define CLKMGR_ALTERAGRP_MPU_CLK_OFFSET			0x140
+#define CLKMGR_MAINPLL_NOC_CLK_OFFSET			0x144
+#define LOCKED_MASK	(CLKMGR_CLKMGR_STAT_MAINPLLLOCKED_SET_MSK  | \
+			 CLKMGR_CLKMGR_STAT_PERPLLLOCKED_SET_MSK)
+
+/* value */
+#define CLKMGR_MAINPLL_BYPASS_RESET			0x0000003f
+#define CLKMGR_PERPLL_BYPASS_RESET			0x000000ff
+#define CLKMGR_MAINPLL_VCO0_RESET			0x00010053
+#define CLKMGR_MAINPLL_VCO1_RESET			0x00010001
+#define CLKMGR_PERPLL_VCO0_RESET			0x00010053
+#define CLKMGR_PERPLL_VCO1_RESET			0x00010001
+#define CLKMGR_MAINPLL_VCO0_PSRC_EOSC			0x0
+#define CLKMGR_MAINPLL_VCO0_PSRC_E_INTOSC		0x1
+#define CLKMGR_MAINPLL_VCO0_PSRC_F2S			0x2
+#define CLKMGR_PERPLL_VCO0_PSRC_EOSC			0x0
+#define CLKMGR_PERPLL_VCO0_PSRC_E_INTOSC		0x1
+#define CLKMGR_PERPLL_VCO0_PSRC_F2S			0x2
+#define CLKMGR_PERPLL_VCO0_PSRC_MAIN			0x3
+
+/* mask */
+#define CLKMGR_MAINPLL_EN_S2FUSER0CLKEN_SET_MSK		0x00000040
+#define CLKMGR_MAINPLL_EN_HMCPLLREFCLKEN_SET_MSK	0x00000080
+#define CLKMGR_CLKMGR_STAT_MAINPLLLOCKED_SET_MSK	0x00000100
+#define CLKMGR_CLKMGR_STAT_PERPLLLOCKED_SET_MSK		0x00000200
+#define CLKMGR_CLKMGR_STAT_BOOTCLKSRC_SET_MSK		0x00020000
+#define CLKMGR_MAINPLL_VCO0_BGPWRDN_SET_MSK		0x00000001
+#define CLKMGR_MAINPLL_VCO0_PWRDN_SET_MSK		0x00000002
+#define CLKMGR_MAINPLL_VCO0_EN_SET_MSK			0x00000004
+#define CLKMGR_MAINPLL_VCO0_OUTRSTALL_SET_MSK		0x00000008
+#define CLKMGR_MAINPLL_VCO0_REGEXTSEL_SET_MSK		0x00000010
+#define CLKMGR_PERPLL_VCO0_BGPWRDN_SET_MSK		0x00000001
+#define CLKMGR_PERPLL_VCO0_PWRDN_SET_MSK		0x00000002
+#define CLKMGR_PERPLL_VCO0_EN_SET_MSK			0x00000004
+#define CLKMGR_PERPLL_VCO0_OUTRSTALL_SET_MSK		0x00000008
+#define CLKMGR_PERPLL_VCO0_REGEXTSEL_SET_MSK		0x00000010
+#define CLKMGR_CLKMGR_INTR_PERPLLFBSLIP_SET_MSK		0x00000800
+#define CLKMGR_CLKMGR_INTR_MAINPLLFBSLIP_SET_MSK	0x00000400
+#define CLKMGR_CLKMGR_INTR_PERPLLRFSLIP_SET_MSK		0x00000200
+#define CLKMGR_CLKMGR_INTR_MAINPLLRFSLIP_SET_MSK	0x00000100
+#define CLKMGR_CLKMGR_INTR_PERPLLLOST_SET_MSK		0x00000008
+#define CLKMGR_CLKMGR_INTR_MAINPLLLOST_SET_MSK		0x00000004
+#define CLKMGR_CLKMGR_INTR_MAINPLLACHIEVED_SET_MSK	0x00000001
+#define CLKMGR_CLKMGR_INTR_PERPLLACHIEVED_SET_MSK	0x00000002
+#define CLKMGR_CLKMGR_CTL_BOOTMOD_SET_MSK		0x00000001
+#define CLKMGR_CLKMGR_CTL_BOOTCLK_INTOSC_SET_MSK	0x00000300
+#define CLKMGR_PERPLL_EN_RESET				0x00000f7f
+#define CLKMGR_PERPLLGRP_EN_SDMMCCLK_MASK		0x00000020
+#define CLKMGR_MAINPLL_VCO0_PSRC_MSK			0x00000003
+#define CLKMGR_MAINPLL_VCO1_NUMER_MSK			0x00001fff
+#define CLKMGR_MAINPLL_VCO1_DENOM_MSK			0x0000003f
+#define CLKMGR_MAINPLL_CNTRCLK_MSK			0x000003ff
+#define CLKMGR_PERPLL_VCO0_PSRC_MSK			0x00000003
+#define CLKMGR_PERPLL_VCO1_NUMER_MSK			0x00001fff
+#define CLKMGR_PERPLL_VCO1_DENOM_MSK			0x0000003f
+#define CLKMGR_PERPLL_CNTRCLK_MSK			0x000003ff
+#define CLKMGR_MAINPLL_MPUCLK_SRC_MSK			0x00000007
+#define CLKMGR_MAINPLL_MPUCLK_CNT_MSK			0x000003ff
+#define CLKMGR_MAINPLL_MPUCLK_SRC_MAIN			0
+#define CLKMGR_MAINPLL_MPUCLK_SRC_PERI			1
+#define CLKMGR_MAINPLL_MPUCLK_SRC_OSC1			2
+#define CLKMGR_MAINPLL_MPUCLK_SRC_INTOSC		3
+#define CLKMGR_MAINPLL_MPUCLK_SRC_FPGA			4
+#define CLKMGR_MAINPLL_NOCDIV_MSK			0x00000003
+#define CLKMGR_MAINPLL_NOCCLK_CNT_MSK			0x000003ff
+#define CLKMGR_MAINPLL_NOCCLK_SRC_MSK			0x00000007
+#define CLKMGR_MAINPLL_NOCCLK_SRC_MAIN			0
+#define CLKMGR_MAINPLL_NOCCLK_SRC_PERI			1
+#define CLKMGR_MAINPLL_NOCCLK_SRC_OSC1			2
+#define CLKMGR_MAINPLL_NOCCLK_SRC_INTOSC		3
+#define CLKMGR_MAINPLL_NOCCLK_SRC_FPGA			4
+
+#define CLKMGR_PERPLLGRP_SRC_MSK			0x00000007
+#define CLKMGR_PERPLLGRP_SRC_MAIN			0
+#define CLKMGR_PERPLLGRP_SRC_PERI			1
+#define CLKMGR_PERPLLGRP_SRC_OSC1			2
+#define CLKMGR_PERPLLGRP_SRC_INTOSC			3
+#define CLKMGR_PERPLLGRP_SRC_FPGA			4
+
+/* bit shifting macro */
+#define CLKMGR_MAINPLL_VCO0_PSRC_LSB		8
+#define CLKMGR_PERPLL_VCO0_PSRC_LSB		8
+#define CLKMGR_MAINPLL_VCO1_DENOM_LSB		16
+#define CLKMGR_PERPLL_VCO1_DENOM_LSB		16
+#define CLKMGR_MAINPLL_NOCCLK_PERICNT_LSB	16
+#define CLKMGR_MAINPLL_NOCCLK_SRC_LSB		16
+#define CLKMGR_MAINPLL_NOCDIV_L4MAINCLK_LSB	0
+#define CLKMGR_MAINPLL_NOCDIV_L4MPCLK_LSB	8
+#define CLKMGR_MAINPLL_NOCDIV_L4SPCLK_LSB	16
+#define CLKMGR_MAINPLL_NOCDIV_CSATCLK_LSB	24
+#define CLKMGR_MAINPLL_NOCDIV_CSTRACECLK_LSB	26
+#define CLKMGR_MAINPLL_NOCDIV_CSPDBGCLK_LSB	28
+#define CLKMGR_MAINPLL_MPUCLK_SRC_LSB		16
+#define CLKMGR_MAINPLL_MPUCLK_PERICNT_LSB	16
+#define CLKMGR_MAINPLL_NOCCLK_SRC_LSB		16
+#define CLKMGR_MAINPLL_CNTR7CLK_SRC_LSB		16
+#define CLKMGR_MAINPLL_CNTR9CLK_SRC_LSB		16
+#define CLKMGR_PERPLL_CNTR2CLK_SRC_LSB		16
+#define CLKMGR_PERPLL_CNTR3CLK_SRC_LSB		16
+#define CLKMGR_PERPLL_CNTR4CLK_SRC_LSB		16
+#define CLKMGR_PERPLL_CNTR5CLK_SRC_LSB		16
+#define CLKMGR_PERPLL_CNTR6CLK_SRC_LSB		16
+#define CLKMGR_PERPLL_CNTR8CLK_SRC_LSB		16
+#define CLKMGR_PERPLL_EMACCTL_EMAC0SEL_LSB	26
+#define CLKMGR_PERPLL_EMACCTL_EMAC1SEL_LSB	27
+#define CLKMGR_PERPLL_EMACCTL_EMAC2SEL_LSB	28
+
+/* PLL ramping work around */
+#define CLKMGR_PLL_RAMP_MPUCLK_THRESHOLD_HZ	900000000
+#define CLKMGR_PLL_RAMP_NOCCLK_THRESHOLD_HZ	300000000
+#define CLKMGR_PLL_RAMP_MPUCLK_INCREMENT_HZ	100000000
+#define CLKMGR_PLL_RAMP_NOCCLK_INCREMENT_HZ	33000000
+
+#endif /* CLOCK_MANAGER_ARRIA10 */
-- 
1.8.2.3

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 09/20] arm: socfpga: Add system manager for Arria 10
  2017-03-09  0:26 [U-Boot] [PATCH v2 00/20] Add Intel Arria 10 SoC support Ley Foon Tan
                   ` (7 preceding siblings ...)
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 08/20] arm: socfpga: Add clock driver " Ley Foon Tan
@ 2017-03-09  0:26 ` Ley Foon Tan
  2017-03-10  1:47   ` Marek Vasut
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 10/20] arm: socfpga: Add sdram header file " Ley Foon Tan
                   ` (12 subsequent siblings)
  21 siblings, 1 reply; 60+ messages in thread
From: Ley Foon Tan @ 2017-03-09  0:26 UTC (permalink / raw)
  To: u-boot

Add system manager register struct and defines for Arria 10.

Signed-off-by: Tien Fong Chee <tien.fong.chee@intel.com>
Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
---
 .../arm/mach-socfpga/include/mach/system_manager.h | 52 ++++++++++++++
 .../include/mach/system_manager_arria10.h          | 81 ++++++++++++++++++++++
 .../include/mach/system_manager_gen5.h             |  1 +
 3 files changed, 134 insertions(+)
 create mode 100644 arch/arm/mach-socfpga/include/mach/system_manager_arria10.h

diff --git a/arch/arm/mach-socfpga/include/mach/system_manager.h b/arch/arm/mach-socfpga/include/mach/system_manager.h
index 53ced81..54078ce 100644
--- a/arch/arm/mach-socfpga/include/mach/system_manager.h
+++ b/arch/arm/mach-socfpga/include/mach/system_manager.h
@@ -31,8 +31,60 @@
 #define SYSMGR_EMACGRP_CTRL_PHYSEL1_LSB			2
 #define SYSMGR_EMACGRP_CTRL_PHYSEL_MASK			0x3
 
+/* For dedicated IO configuration */
+/* Voltage select enums */
+#define VOLTAGE_SEL_3V		0x0
+#define VOLTAGE_SEL_1P8V	0x1
+#define VOLTAGE_SEL_2P5V	0x2
+
+/* Input buffer enable */
+#define INPUT_BUF_DISABLE	0
+#define INPUT_BUF_1P8V		1
+#define INPUT_BUF_2P5V3V	2
+
+/* Weak pull up enable */
+#define WK_PU_DISABLE		0
+#define WK_PU_ENABLE		1
+
+/* Pull up slew rate control */
+#define PU_SLW_RT_SLOW		0
+#define PU_SLW_RT_FAST		1
+#define PU_SLW_RT_DEFAULT	PU_SLW_RT_SLOW
+
+/* Pull down slew rate control */
+#define PD_SLW_RT_SLOW		0
+#define PD_SLW_RT_FAST		1
+#define PD_SLW_RT_DEFAULT	PD_SLW_RT_SLOW
+
+/* Drive strength control */
+#define PU_DRV_STRG_DEFAULT	0x10
+#define PD_DRV_STRG_DEFAULT	0x10
+
+/* bit position */
+#define PD_DRV_STRG_LSB		0
+#define PD_SLW_RT_LSB		5
+#define PU_DRV_STRG_LSB		8
+#define PU_SLW_RT_LSB		13
+#define WK_PU_LSB		16
+#define INPUT_BUF_LSB		17
+#define BIAS_TRIM_LSB		19
+#define VOLTAGE_SEL_LSB		0
+
+#define ALT_SYSMGR_NOC_H2F_SET_MSK	0x00000001
+#define ALT_SYSMGR_NOC_LWH2F_SET_MSK	0x00000010
+#define ALT_SYSMGR_NOC_F2H_SET_MSK	0x00000100
+#define ALT_SYSMGR_NOC_F2SDR0_SET_MSK	0x00010000
+#define ALT_SYSMGR_NOC_F2SDR1_SET_MSK	0x00100000
+#define ALT_SYSMGR_NOC_F2SDR2_SET_MSK	0x01000000
+#define ALT_SYSMGR_NOC_TMO_EN_SET_MSK	0x00000001
+
+#define ALT_SYSMGR_ECC_INTSTAT_SERR_OCRAM_SET_MSK	0x00000002
+#define ALT_SYSMGR_ECC_INTSTAT_DERR_OCRAM_SET_MSK	0x00000002
+
 #if defined(CONFIG_TARGET_SOCFPGA_GEN5)
 #include <asm/arch/system_manager_gen5.h>
+#elif defined(CONFIG_TARGET_SOCFPGA_ARRIA10)
+#include <asm/arch/system_manager_arria10.h>
 #endif
 
 #endif /* _SYSTEM_MANAGER_H_ */
diff --git a/arch/arm/mach-socfpga/include/mach/system_manager_arria10.h b/arch/arm/mach-socfpga/include/mach/system_manager_arria10.h
new file mode 100644
index 0000000..f235aba
--- /dev/null
+++ b/arch/arm/mach-socfpga/include/mach/system_manager_arria10.h
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2016-2017 Intel Corporation <www.intel.com>
+ *
+ * SPDX-License-Identifier:	GPL-2.0
+ */
+
+#ifndef _SYSTEM_MANAGER_ARRIA10_H_
+#define _SYSTEM_MANAGER_ARRIA10_H_
+
+struct socfpga_system_manager {
+	u32  siliconid1;
+	u32  siliconid2;
+	u32  wddbg;
+	u32  bootinfo;
+	u32  mpu_ctrl_l2_ecc;
+	u32  _pad_0x14_0x1f[3];
+	u32  dma;
+	u32  dma_periph;
+	u32  sdmmcgrp_ctrl;
+	u32  sdmmc_l3master;
+	u32  nand_bootstrap;
+	u32  nand_l3master;
+	u32  usb0_l3master;
+	u32  usb1_l3master;
+	u32  emac_global;
+	u32  emac[3];
+	u32  _pad_0x50_0x5f[4];
+	u32  fpgaintf_en_global;
+	u32  fpgaintf_en_0;
+	u32  fpgaintf_en_1;
+	u32  fpgaintf_en_2;
+	u32  fpgaintf_en_3;
+	u32  _pad_0x74_0x7f[3];
+	u32  noc_addr_remap_value;
+	u32  noc_addr_remap_set;
+	u32  noc_addr_remap_clear;
+	u32  _pad_0x8c_0x8f;
+	u32  ecc_intmask_value;
+	u32  ecc_intmask_set;
+	u32  ecc_intmask_clr;
+	u32  ecc_intstatus_serr;
+	u32  ecc_intstatus_derr;
+	u32  mpu_status_l2_ecc;
+	u32  mpu_clear_l2_ecc;
+	u32  mpu_status_l1_parity;
+	u32  mpu_clear_l1_parity;
+	u32  mpu_set_l1_parity;
+	u32  _pad_0xb8_0xbf[2];
+	u32  noc_timeout;
+	u32  noc_idlereq_set;
+	u32  noc_idlereq_clr;
+	u32  noc_idlereq_value;
+	u32  noc_idleack;
+	u32  noc_idlestatus;
+	u32  fpga2soc_ctrl;
+	u32  _pad_0xdc_0xff[9];
+	u32  tsmc_tsel_0;
+	u32  tsmc_tsel_1;
+	u32  tsmc_tsel_2;
+	u32  tsmc_tsel_3;
+	u32  _pad_0x110_0x200[60];
+	u32  romhw_ctrl;
+	u32  romcode_ctrl;
+	u32  romcode_cpu1startaddr;
+	u32  romcode_initswstate;
+	u32  romcode_initswlastld;
+	u32  _pad_0x214_0x217;
+	u32  warmram_enable;
+	u32  warmram_datastart;
+	u32  warmram_length;
+	u32  warmram_execution;
+	u32  warmram_crc;
+	u32  _pad_0x22c_0x22f;
+	u32  isw_handoff[8];
+	u32  romcode_bootromswstate[8];
+};
+
+#define SYSMGR_SDMMC_SMPLSEL_SHIFT	4
+#define SYSMGR_BOOTINFO_BSEL_SHIFT	12
+
+#endif /* _SYSTEM_MANAGER_ARRIA10_H_ */
diff --git a/arch/arm/mach-socfpga/include/mach/system_manager_gen5.h b/arch/arm/mach-socfpga/include/mach/system_manager_gen5.h
index 3ad4ca1..285c1a2 100644
--- a/arch/arm/mach-socfpga/include/mach/system_manager_gen5.h
+++ b/arch/arm/mach-socfpga/include/mach/system_manager_gen5.h
@@ -117,5 +117,6 @@ struct socfpga_system_manager {
 #endif
 
 #define SYSMGR_SDMMC_SMPLSEL_SHIFT	3
+#define SYSMGR_BOOTINFO_BSEL_SHIFT	0
 
 #endif /* _SYSTEM_MANAGER_GEN5_H_ */
-- 
1.8.2.3

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 10/20] arm: socfpga: Add sdram header file for Arria 10
  2017-03-09  0:26 [U-Boot] [PATCH v2 00/20] Add Intel Arria 10 SoC support Ley Foon Tan
                   ` (8 preceding siblings ...)
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 09/20] arm: socfpga: Add system manager " Ley Foon Tan
@ 2017-03-09  0:26 ` Ley Foon Tan
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 11/20] arm: socfpga: Add misc support " Ley Foon Tan
                   ` (11 subsequent siblings)
  21 siblings, 0 replies; 60+ messages in thread
From: Ley Foon Tan @ 2017-03-09  0:26 UTC (permalink / raw)
  To: u-boot

Add sdram header file for Arria 10.

Signed-off-by: Tien Fong Chee <tien.fong.chee@intel.com>
Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
---
 arch/arm/mach-socfpga/include/mach/sdram_arria10.h | 380 +++++++++++++++++++++
 1 file changed, 380 insertions(+)
 create mode 100644 arch/arm/mach-socfpga/include/mach/sdram_arria10.h

diff --git a/arch/arm/mach-socfpga/include/mach/sdram_arria10.h b/arch/arm/mach-socfpga/include/mach/sdram_arria10.h
new file mode 100644
index 0000000..1d7b7c1
--- /dev/null
+++ b/arch/arm/mach-socfpga/include/mach/sdram_arria10.h
@@ -0,0 +1,380 @@
+/*
+ * Copyright (C) 2015-2017 Intel Corporation <www.intel.com>
+ *
+ * SPDX-License-Identifier:	GPL-2.0
+ */
+
+#ifndef _SOCFPGA_SDRAM_ARRIA10_H_
+#define _SOCFPGA_SDRAM_ARRIA10_H_
+
+#ifndef __ASSEMBLY__
+
+struct socfpga_ecc_hmc {
+	u32 ip_rev_id;
+	u32 _pad_0x4_0x7;
+	u32 ddrioctrl;
+	u32 ddrcalstat;
+	u32 mpr_0beat1;
+	u32 mpr_1beat1;
+	u32 mpr_2beat1;
+	u32 mpr_3beat1;
+	u32 mpr_4beat1;
+	u32 mpr_5beat1;
+	u32 mpr_6beat1;
+	u32 mpr_7beat1;
+	u32 mpr_8beat1;
+	u32 mpr_0beat2;
+	u32 mpr_1beat2;
+	u32 mpr_2beat2;
+	u32 mpr_3beat2;
+	u32 mpr_4beat2;
+	u32 mpr_5beat2;
+	u32 mpr_6beat2;
+	u32 mpr_7beat2;
+	u32 mpr_8beat2;
+	u32 _pad_0x58_0x5f[2];
+	u32 auto_precharge;
+	u32 _pad_0x64_0xff[39];
+	u32 eccctrl;
+	u32 eccctrl2;
+	u32 _pad_0x108_0x10f[2];
+	u32 errinten;
+	u32 errintens;
+	u32 errintenr;
+	u32 intmode;
+	u32 intstat;
+	u32 diaginttest;
+	u32 modstat;
+	u32 derraddra;
+	u32 serraddra;
+	u32 _pad_0x134_0x137;
+	u32 autowb_corraddr;
+	u32 serrcntreg;
+	u32 autowb_drop_cntreg;
+	u32 _pad_0x144_0x147;
+	u32 ecc_reg2wreccdatabus;
+	u32 ecc_rdeccdata2regbus;
+	u32 ecc_reg2rdeccdatabus;
+	u32 _pad_0x154_0x15f[3];
+	u32 ecc_diagon;
+	u32 ecc_decstat;
+	u32 _pad_0x168_0x16f[2];
+	u32 ecc_errgenaddr_0;
+	u32 ecc_errgenaddr_1;
+	u32 ecc_errgenaddr_2;
+	u32 ecc_errgenaddr_3;
+};
+
+struct socfpga_noc_ddr_scheduler {
+	u32 ddr_t_main_scheduler_id_coreid;
+	u32 ddr_t_main_scheduler_id_revisionid;
+	u32 ddr_t_main_scheduler_ddrconf;
+	u32 ddr_t_main_scheduler_ddrtiming;
+	u32 ddr_t_main_scheduler_ddrmode;
+	u32 ddr_t_main_scheduler_readlatency;
+	u32 _pad_0x20_0x34[8];
+	u32 ddr_t_main_scheduler_activate;
+	u32 ddr_t_main_scheduler_devtodev;
+};
+
+/*
+ * OCRAM firewall
+ */
+struct socfpga_noc_fw_ocram {
+	u32 enable;
+	u32 enable_set;
+	u32 enable_clear;
+	u32 region0;
+	u32 region1;
+	u32 region2;
+	u32 region3;
+	u32 region4;
+	u32 region5;
+};
+
+/* for master such as MPU and FPGA */
+struct socfpga_noc_fw_ddr_mpu_fpga2sdram {
+	u32 enable;
+	u32 enable_set;
+	u32 enable_clear;
+	u32 _pad_0xc_0xf;
+	u32 mpuregion0addr;
+	u32 mpuregion1addr;
+	u32 mpuregion2addr;
+	u32 mpuregion3addr;
+	u32 fpga2sdram0region0addr;
+	u32 fpga2sdram0region1addr;
+	u32 fpga2sdram0region2addr;
+	u32 fpga2sdram0region3addr;
+	u32 fpga2sdram1region0addr;
+	u32 fpga2sdram1region1addr;
+	u32 fpga2sdram1region2addr;
+	u32 fpga2sdram1region3addr;
+	u32 fpga2sdram2region0addr;
+	u32 fpga2sdram2region1addr;
+	u32 fpga2sdram2region2addr;
+	u32 fpga2sdram2region3addr;
+};
+
+/* for L3 master */
+struct socfpga_noc_fw_ddr_l3 {
+	u32 enable;
+	u32 enable_set;
+	u32 enable_clear;
+	u32 hpsregion0addr;
+	u32 hpsregion1addr;
+	u32 hpsregion2addr;
+	u32 hpsregion3addr;
+	u32 hpsregion4addr;
+	u32 hpsregion5addr;
+	u32 hpsregion6addr;
+	u32 hpsregion7addr;
+};
+
+struct socfpga_io48_mmr {
+	u32 dbgcfg0;
+	u32 dbgcfg1;
+	u32 dbgcfg2;
+	u32 dbgcfg3;
+	u32 dbgcfg4;
+	u32 dbgcfg5;
+	u32 dbgcfg6;
+	u32 reserve0;
+	u32 reserve1;
+	u32 reserve2;
+	u32 ctrlcfg0;
+	u32 ctrlcfg1;
+	u32 ctrlcfg2;
+	u32 ctrlcfg3;
+	u32 ctrlcfg4;
+	u32 ctrlcfg5;
+	u32 ctrlcfg6;
+	u32 ctrlcfg7;
+	u32 ctrlcfg8;
+	u32 ctrlcfg9;
+	u32 dramtiming0;
+	u32 dramodt0;
+	u32 dramodt1;
+	u32 sbcfg0;
+	u32 sbcfg1;
+	u32 sbcfg2;
+	u32 sbcfg3;
+	u32 sbcfg4;
+	u32 sbcfg5;
+	u32 sbcfg6;
+	u32 sbcfg7;
+	u32 caltiming0;
+	u32 caltiming1;
+	u32 caltiming2;
+	u32 caltiming3;
+	u32 caltiming4;
+	u32 caltiming5;
+	u32 caltiming6;
+	u32 caltiming7;
+	u32 caltiming8;
+	u32 caltiming9;
+	u32 caltiming10;
+	u32 dramaddrw;
+	u32 sideband0;
+	u32 sideband1;
+	u32 sideband2;
+	u32 sideband3;
+	u32 sideband4;
+	u32 sideband5;
+	u32 sideband6;
+	u32 sideband7;
+	u32 sideband8;
+	u32 sideband9;
+	u32 sideband10;
+	u32 sideband11;
+	u32 sideband12;
+	u32 sideband13;
+	u32 sideband14;
+	u32 sideband15;
+	u32 dramsts;
+	u32 dbgdone;
+	u32 dbgsignals;
+	u32 dbgreset;
+	u32 dbgmatch;
+	u32 counter0mask;
+	u32 counter1mask;
+	u32 counter0match;
+	u32 counter1match;
+	u32 niosreserve0;
+	u32 niosreserve1;
+	u32 niosreserve2;
+};
+#endif /*__ASSEMBLY__*/
+
+#define IO48_MMR_CTRLCFG0_DB2_BURST_LENGTH_MASK		0x1F000000
+#define IO48_MMR_CTRLCFG0_DB2_BURST_LENGTH_SHIFT	24
+#define IO48_MMR_CTRLCFG0_DB1_BURST_LENGTH_MASK		0x00F80000
+#define IO48_MMR_CTRLCFG0_DB1_BURST_LENGTH_SHIFT	19
+#define IO48_MMR_CTRLCFG0_DB0_BURST_LENGTH_MASK		0x0007C000
+#define IO48_MMR_CTRLCFG0_DB0_BURST_LENGTH_SHIFT	14
+#define IO48_MMR_CTRLCFG0_CTRL_BURST_LENGTH_MASK	0x00003E00
+#define IO48_MMR_CTRLCFG0_CTRL_BURST_LENGTH_SHIFT	9
+#define IO48_MMR_CTRLCFG0_AC_POS_MASK			0x00000180
+#define IO48_MMR_CTRLCFG0_AC_POS_SHIFT			7
+#define IO48_MMR_CTRLCFG0_DIMM_TYPE_MASK		0x00000070
+#define IO48_MMR_CTRLCFG0_DIM_TYPE_SHIFT		4
+#define IO48_MMR_CTRLCFG0_MEM_TYPE_MASK			0x0000000F
+#define IO48_MMR_CTRLCFG0_MEM_TYPE_SHIFT		0
+
+#define IO48_MMR_CTRLCFG1_DBC3_ENABLE_DM		BIT(30)
+#define IO48_MMR_CTRLCFG1_DBC2_ENABLE_DM		BIT(29)
+#define IO48_MMR_CTRLCFG1_DBC1_ENABLE_DM		BIT(28)
+#define IO48_MMR_CTRLCFG1_DBC0_ENABLE_DM		BIT(27)
+#define IO48_MMR_CTRLCFG1_CTRL_ENABLE_DM		BIT(26)
+#define IO48_MMR_CTRLCFG1_DQSTRK_EN			BIT(25)
+#define IO48_MMR_CTRLCFG1_STARVE_LIMIT_MASK		0x01F80000
+#define IO48_MMR_CTRLCFG1_STARVE_LIMIT_SHIFT		19
+#define IO48_MMR_CTRLCFG1_REORDER_READ			BIT(18)
+#define IO48_MMR_CTRLCFG1_DBC3_REORDER_RDATA		BIT(17)
+#define IO48_MMR_CTRLCFG1_DBC2_REORDER_RDATA		BIT(16)
+#define IO48_MMR_CTRLCFG1_DBC1_REORDER_RDATA		BIT(15)
+#define IO48_MMR_CTRLCFG1_DBC0_REORDER_RDATA		BIT(14)
+#define IO48_MMR_CTRLCFG1_CTRL_REORDER_RDATA		BIT(13)
+#define IO48_MMR_CTRLCFG1_REORDER_DATA			BIT(12)
+#define IO48_MMR_CTRLCFG1_DBC3_ENABLE_ECC		BIT(11)
+#define IO48_MMR_CTRLCFG1_DBC2_ENABLE_ECC		BIT(10)
+#define IO48_MMR_CTRLCFG1_DBC1_ENABLE_ECC		BIT(9)
+#define IO48_MMR_CTRLCFG1_DBC0_ENABLE_ECC		BIT(8)
+#define IO48_MMR_CTRLCFG1_CTRL_ENABLE_ECC		BIT(7)
+#define IO48_MMR_CTRLCFG1_ADDR_ORDER_MASK		0x00000060
+#define IO48_MMR_CTRLCFG1_ADDR_ORDER_SHIFT		5
+#define IO48_MMR_CTRLCFG1_DBC3_BURST_LENGTH_MASK	0x0000001F
+#define IO48_MMR_CTRLCFG1_DBC3_BURST_LENGTH_SHIFT	0
+
+#define IO48_MMR_CALTIMING0_CFG_ACT_TO_ACT_DIFF_BG_MASK		0x3F000000
+#define IO48_MMR_CALTIMING0_CFG_ACT_TO_ACT_DIFF_BG_SHIFT	24
+#define IO48_MMR_CALTIMING0_CFG_ACT_TO_ACT_DIFF_BANK_MASK	0x00FC0000
+#define IO48_MMR_CALTIMING0_CFG_ACT_TO_ACT_DIFF_BANK_SHIFT	18
+#define IO48_MMR_CALTIMING0_CFG_ACT_TO_ACT_MASK			0x0003F000
+#define IO48_MMR_CALTIMING0_CFG_ACT_TO_ACT_SHIFT		12
+#define IO48_MMR_CALTIMING0_CFG_ACT_TO_PCH_MASK			0x00000FC0
+#define IO48_MMR_CALTIMING0_CFG_ACT_TO_PCH_SHIFT		6
+#define IO48_MMR_CALTIMING0_CFG_ACT_TO_RDWR_MASK		0x0000003F
+#define IO48_MMR_CALTIMING0_CFG_ACT_TO_RDWR_SHIFT		0
+
+#define IO48_MMR_CALTIMING1_CFG_RD_TO_WR_DIFF_CHIP_MASK		0x3F000000
+#define IO48_MMR_CALTIMING1_CFG_RD_TO_WR_DIFF_CHIP_SHIFT	24
+#define IO48_MMR_CALTIMING1_CFG_RD_TO_WR_MASK			0x00FC0000
+#define IO48_MMR_CALTIMING1_CFG_RD_TO_WR_SHIFT			18
+#define IO48_MMR_CALTIMING1_CFG_RD_TO_RD_DB_MASK		0x0003F000
+#define IO48_MMR_CALTIMING1_CFG_RD_TO_RD_DB_SHIFT		12
+#define IO48_MMR_CALTIMING1_CFG_RD_TO_RD_DC_MASK		0x00000FC0
+#define IO48_MMR_CALTIMING1_CFG_RD_TO_RD_DC_SHIFT		6
+#define IO48_MMR_CALTIMING1_CFG_RD_TO_RD_MASK			0x0000003F
+#define IO48_MMR_CALTIMING1_CFG_RD_TO_RD_SHIFT			0
+
+#define IO48_MMR_CALTIMING2_CFG_WR_TO_WR_DIFF_CHIP_MASK		0x3F000000
+#define IO48_MMR_CALTIMING2_CFG_WR_TO_WR_DIFF_CHIP_SHIFT	24
+#define IO48_MMR_CALTIMING2_CFG_WR_TO_WR_MASK			0x00FC0000
+#define IO48_MMR_CALTIMING2_CFG_WR_TO_WR_SHIFT			18
+#define IO48_MMR_CALTIMING2_CFG_RD_TO_AP_VALID_MASK		0x0003F000
+#define IO48_MMR_CALTIMING2_CFG_RD_TO_AP_VALID_SHIFT		12
+#define IO48_MMR_CALTIMING2_CFG_RD_TO_PCH_MASK			0x00000FC0
+#define IO48_MMR_CALTIMING2_CFG_RD_TO_PCH_SHIFT			6
+#define IO48_MMR_CALTIMING2_CFG_RD_TO_WR_DIFF_BG_MASK		0x0000003F
+#define IO48_MMR_CALTIMING2_CFG_RD_TO_WR_DIFF_BG_SHIFT		0
+
+#define IO48_MMR_CALTIMING3_CFG_WR_TO_PCH_MASK			0x3F000000
+#define IO48_MMR_CALTIMING3_CFG_WR_TO_PCH_SHIFT			24
+#define IO48_MMR_CALTIMING3_CFG_WR_TO_RD_DIFF_BG_MASK		0x00FC0000
+#define IO48_MMR_CALTIMING3_CFG_WR_TO_RD_DIFF_BG_SHIFT		18
+#define IO48_MMR_CALTIMING3_CFG_WR_TO_RD_DIFF_CHIP_MASK		0x0003F000
+#define IO48_MMR_CALTIMING3_CFG_WR_TO_RD_DIFF_CHIP_SHIFT	12
+#define IO48_MMR_CALTIMING3_CFG_WR_TO_RD_MASK			0x00000FC0
+#define IO48_MMR_CALTIMING3_CFG_WR_TO_RD_SHIFT			6
+#define IO48_MMR_CALTIMING3_CFG_WR_TO_WR_DIFF_BG_MASK		0x0000003F
+#define IO48_MMR_CALTIMING3_CFG_WR_TO_WR_DIFF_BG_SHIFT		0
+
+#define IO48_MMR_CALTIMING4_CFG_PDN_TO_VALID_MASK		0xFC000000
+#define IO48_MMR_CALTIMING4_CFG_PDN_TO_VALID_SHIFT		26
+#define IO48_MMR_CALTIMING4_CFG_ARF_TO_VALID_MASK		0x03FC0000
+#define IO48_MMR_CALTIMING4_CFG_ARF_TO_VALID_SHIFT		18
+#define IO48_MMR_CALTIMING4_CFG_PCH_ALL_TO_VALID_MASK		0x0003F000
+#define IO48_MMR_CALTIMING4_CFG_PCH_ALL_TO_VALID_SHIFT		12
+#define IO48_MMR_CALTIMING4_CFG_PCH_TO_VALID_MASK		0x00000FC0
+#define IO48_MMR_CALTIMING4_CFG_PCH_TO_VALID_SHIFT		6
+#define IO48_MMR_CALTIMING4_CFG_WR_AP_TO_VALID_MASK		0x0000003F
+#define IO48_MMR_CALTIMING4_CFG_WR_AP_TO_VALID_SHIFT		0
+
+#define IO48_MMR_CALTIMING9_CFG_WR_4_ACT_TO_ACT_MASK		0x000000FF
+#define IO48_MMR_CALTIMING9_CFG_WR_4_ACT_TO_ACT_SHIFT		0
+
+#define IO48_MMR_DRAMADDRW_CFG_CS_ADDR_WIDTH_MASK		0x00070000
+#define IO48_MMR_DRAMADDRW_CFG_CS_ADDR_WIDTH_SHIFT		16
+#define IO48_MMR_DRAMADDRW_CFG_BANK_GROUP_ADDR_WIDTH_MASK	0x0000C000
+#define IO48_MMR_DRAMADDRW_CFG_BANK_GROUP_ADDR_WIDTH_SHIFT	14
+#define IO48_MMR_DRAMADDRW_CFG_BANK_ADDR_WIDTH_MASK		0x00003C00
+#define IO48_MMR_DRAMADDRW_CFG_BANK_ADDR_WIDTH_SHIFT		10
+#define IO48_MMR_DRAMADDRW_CFG_ROW_ADDR_WIDTH_MASK		0x000003E0
+#define IO48_MMR_DRAMADDRW_CFG_ROW_ADDR_WIDTH_SHIFT		5
+#define IO48_MMR_DRAMADDRW_CFG_COL_ADDR_WIDTH_MASK		0x0000001F
+#define IO48_MMR_DRAMADDRW_CFG_COL_ADDR_WIDTH_SHIFT		0
+
+#define ALT_ECC_HMC_OCP_DDRIOCTRL_IO_SIZE_MSK		0x00000003
+
+#define ALT_ECC_HMC_OCP_INTSTAT_SERRPENA_SET_MSK	BIT(0)
+#define ALT_ECC_HMC_OCP_INTSTAT_DERRPENA_SET_MSK	BIT(1)
+#define ALT_ECC_HMC_OCP_ERRINTEN_SERRINTEN_SET_MSK	BIT(0)
+#define ALT_ECC_HMC_OCP_ERRINTEN_DERRINTEN_SET_MSK	BIT(1)
+#define ALT_ECC_HMC_OCP_INTMOD_INTONCMP_SET_MSK		BIT(16)
+#define ALT_ECC_HMC_OCP_ECCCTL_AWB_CNT_RST_SET_MSK	BIT(16)
+#define ALT_ECC_HMC_OCP_ECCCTL_CNT_RST_SET_MSK		BIT(8)
+#define ALT_ECC_HMC_OCP_ECCCTL_ECC_EN_SET_MSK		BIT(0)
+#define ALT_ECC_HMC_OCP_ECCCTL2_RMW_EN_SET_MSK		BIT(8)
+#define ALT_ECC_HMC_OCP_ECCCTL2_AWB_EN_SET_MSK		BIT(0)
+
+#define ALT_ECC_HMC_OCP_SERRCNTREG_VALUE		8
+
+#define ALT_NOC_MPU_DDR_T_SCHED_DDRTIMING_ACTTOACT_LSB	0
+#define ALT_NOC_MPU_DDR_T_SCHED_DDRTIMING_RDTOMISS_LSB	6
+#define ALT_NOC_MPU_DDR_T_SCHED_DDRTIMING_WRTOMISS_LSB	12
+#define ALT_NOC_MPU_DDR_T_SCHED_DDRTIMING_BURSTLEN_LSB	18
+#define ALT_NOC_MPU_DDR_T_SCHED_DDRTIMING_RDTOWR_LSB	21
+#define ALT_NOC_MPU_DDR_T_SCHED_DDRTIMING_WRTORD_LSB	26
+#define ALT_NOC_MPU_DDR_T_SCHED_DDRTIMING_BWRATIO_LSB	31
+
+#define ALT_NOC_MPU_DDR_T_SCHED_DDRMOD_AUTOPRECHARGE_LSB	0
+#define ALT_NOC_MPU_DDR_T_SCHED_DDRMOD_BWRATIOEXTENDED_LSB	1
+
+#define ALT_NOC_MPU_DDR_T_SCHED_ACTIVATE_RRD_LSB	0
+#define ALT_NOC_MPU_DDR_T_SCHED_ACTIVATE_FAW_LSB	4
+#define ALT_NOC_MPU_DDR_T_SCHED_ACTIVATE_FAWBANK_LSB	10
+
+#define ALT_NOC_MPU_DDR_T_SCHED_DEVTODEV_BUSRDTORD_LSB	0
+#define ALT_NOC_MPU_DDR_T_SCHED_DEVTODEV_BUSRDTOWR_LSB	2
+#define ALT_NOC_MPU_DDR_T_SCHED_DEVTODEV_BUSWRTORD_LSB	4
+
+#define ALT_NOC_FW_DDR_END_ADDR_LSB	16
+#define ALT_NOC_FW_DDR_ADDR_MASK	0xFFFF
+#define ALT_NOC_FW_DDR_SCR_EN_HPSREG0EN_SET_MSK		BIT(0)
+#define ALT_NOC_FW_DDR_SCR_EN_HPSREG1EN_SET_MSK		BIT(1)
+#define ALT_NOC_FW_DDR_SCR_EN_HPSREG2EN_SET_MSK		BIT(2)
+#define ALT_NOC_FW_DDR_SCR_EN_HPSREG3EN_SET_MSK		BIT(3)
+#define ALT_NOC_FW_DDR_SCR_EN_HPSREG4EN_SET_MSK		BIT(4)
+#define ALT_NOC_FW_DDR_SCR_EN_HPSREG5EN_SET_MSK		BIT(5)
+#define ALT_NOC_FW_DDR_SCR_EN_HPSREG6EN_SET_MSK		BIT(6)
+#define ALT_NOC_FW_DDR_SCR_EN_HPSREG7EN_SET_MSK		BIT(7)
+#define ALT_NOC_FW_DDR_SCR_EN_MPUREG0EN_SET_MSK		BIT(0)
+#define ALT_NOC_FW_DDR_SCR_EN_MPUREG1EN_SET_MSK		BIT(1)
+#define ALT_NOC_FW_DDR_SCR_EN_MPUREG2EN_SET_MSK		BIT(2)
+#define ALT_NOC_FW_DDR_SCR_EN_MPUREG3EN_SET_MSK		BIT(3)
+#define ALT_NOC_FW_DDR_SCR_EN_F2SDR0REG0EN_SET_MSK	BIT(4)
+#define ALT_NOC_FW_DDR_SCR_EN_F2SDR0REG1EN_SET_MSK	BIT(5)
+#define ALT_NOC_FW_DDR_SCR_EN_F2SDR0REG2EN_SET_MSK	BIT(6)
+#define ALT_NOC_FW_DDR_SCR_EN_F2SDR0REG3EN_SET_MSK	BIT(7)
+#define ALT_NOC_FW_DDR_SCR_EN_F2SDR1REG0EN_SET_MSK	BIT(8)
+#define ALT_NOC_FW_DDR_SCR_EN_F2SDR1REG1EN_SET_MSK	BIT(9)
+#define ALT_NOC_FW_DDR_SCR_EN_F2SDR1REG2EN_SET_MSK	BIT(10)
+#define ALT_NOC_FW_DDR_SCR_EN_F2SDR1REG3EN_SET_MSK	BIT(11)
+#define ALT_NOC_FW_DDR_SCR_EN_F2SDR2REG0EN_SET_MSK	BIT(12)
+#define ALT_NOC_FW_DDR_SCR_EN_F2SDR2REG1EN_SET_MSK	BIT(13)
+#define ALT_NOC_FW_DDR_SCR_EN_F2SDR2REG2EN_SET_MSK	BIT(14)
+#define ALT_NOC_FW_DDR_SCR_EN_F2SDR2REG3EN_SET_MSK	BIT(15)
+
+#define ALT_IO48_DRAMTIME_MEM_READ_LATENCY_MASK		0x0000003F
+#endif /* _SOCFPGA_SDRAM_ARRIA10_H_ */
-- 
1.8.2.3

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 11/20] arm: socfpga: Add misc support for Arria 10
  2017-03-09  0:26 [U-Boot] [PATCH v2 00/20] Add Intel Arria 10 SoC support Ley Foon Tan
                   ` (9 preceding siblings ...)
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 10/20] arm: socfpga: Add sdram header file " Ley Foon Tan
@ 2017-03-09  0:26 ` Ley Foon Tan
  2017-03-10  1:49   ` Marek Vasut
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 12/20] arm: socfpga: Add pinmux " Ley Foon Tan
                   ` (10 subsequent siblings)
  21 siblings, 1 reply; 60+ messages in thread
From: Ley Foon Tan @ 2017-03-09  0:26 UTC (permalink / raw)
  To: u-boot

Add misc support for Arria 10 and minor fix on misc Gen5.

Signed-off-by: Tien Fong Chee <tien.fong.chee@intel.com>
Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
---
 arch/arm/mach-socfpga/Makefile            |   1 +
 arch/arm/mach-socfpga/include/mach/misc.h |   6 +
 arch/arm/mach-socfpga/misc_arria10.c      | 254 ++++++++++++++++++++++++++++++
 arch/arm/mach-socfpga/misc_gen5.c         |   3 +-
 4 files changed, 263 insertions(+), 1 deletion(-)
 create mode 100644 arch/arm/mach-socfpga/misc_arria10.c

diff --git a/arch/arm/mach-socfpga/Makefile b/arch/arm/mach-socfpga/Makefile
index c494930..9c4617f 100644
--- a/arch/arm/mach-socfpga/Makefile
+++ b/arch/arm/mach-socfpga/Makefile
@@ -11,6 +11,7 @@ obj-y	+= misc.o timer.o reset_manager.o clock_manager.o \
 	   fpga_manager.o board.o
 
 obj-$(CONFIG_TARGET_SOCFPGA_ARRIA10) += clock_manager_arria10.o \
+					misc_arria10.o		\
 					reset_manager_arria10.o
 
 obj-$(CONFIG_SPL_BUILD) += spl.o freeze_controller.o
diff --git a/arch/arm/mach-socfpga/include/mach/misc.h b/arch/arm/mach-socfpga/include/mach/misc.h
index 64f9b86..446ee0f 100644
--- a/arch/arm/mach-socfpga/include/mach/misc.h
+++ b/arch/arm/mach-socfpga/include/mach/misc.h
@@ -23,4 +23,10 @@ void socfpga_fpga_add(void);
 inline void socfpga_fpga_add(void) {}
 #endif
 
+#if defined(CONFIG_TARGET_SOCFPGA_ARRIA10)
+unsigned int dedicated_uart_com_port(const void *blob);
+unsigned int shared_uart_com_port(const void *blob);
+unsigned int uart_com_port(const void *blob);
+#endif
+
 #endif /* _MISC_H_ */
diff --git a/arch/arm/mach-socfpga/misc_arria10.c b/arch/arm/mach-socfpga/misc_arria10.c
new file mode 100644
index 0000000..d2bad13
--- /dev/null
+++ b/arch/arm/mach-socfpga/misc_arria10.c
@@ -0,0 +1,254 @@
+/*
+ * Copyright (C) 2016-2017 Intel Corporation
+ *
+ * SPDX-License-Identifier:    GPL-2.0
+ */
+
+#include <altera.h>
+#include <common.h>
+#include <errno.h>
+#include <fdtdec.h>
+#include <miiphy.h>
+#include <netdev.h>
+#include <ns16550.h>
+#include <watchdog.h>
+#include <asm/arch/misc.h>
+#include <asm/arch/reset_manager.h>
+#include <asm/arch/sdram_arria10.h>
+#include <asm/arch/system_manager.h>
+#include <asm/arch/nic301.h>
+#include <asm/io.h>
+#include <asm/pl310.h>
+
+#define PINMUX_UART0_TX_SHARED_IO_OFFSET_Q1_3	0x08
+#define PINMUX_UART0_TX_SHARED_IO_OFFSET_Q2_11	0x58
+#define PINMUX_UART0_TX_SHARED_IO_OFFSET_Q3_3	0x68
+#define PINMUX_UART1_TX_SHARED_IO_OFFSET_Q1_7	0x18
+#define PINMUX_UART1_TX_SHARED_IO_OFFSET_Q3_7	0x78
+#define PINMUX_UART1_TX_SHARED_IO_OFFSET_Q4_3	0x98
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static struct pl310_regs *const pl310 =
+	(struct pl310_regs *)CONFIG_SYS_PL310_BASE;
+static struct socfpga_system_manager *sysmgr_regs =
+	(struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS;
+static const struct socfpga_noc_fw_ocram *noc_fw_ocram_base =
+	(void *)SOCFPGA_SDR_FIREWALL_OCRAM_ADDRESS;
+static const struct socfpga_noc_fw_ddr_l3 *noc_fw_ddr_l3_base =
+	(void *)SOCFPGA_SDR_FIREWALL_L3_ADDRESS;
+
+/*
+ * DesignWare Ethernet initialization
+ */
+#ifdef CONFIG_ETH_DESIGNWARE
+void dwmac_deassert_reset(const unsigned int of_reset_id,
+				 const u32 phymode)
+{
+	u32 reset;
+
+	if (of_reset_id == EMAC0_RESET) {
+		reset = SOCFPGA_RESET(EMAC0);
+	} else if (of_reset_id == EMAC1_RESET) {
+		reset = SOCFPGA_RESET(EMAC1);
+	} else if (of_reset_id == EMAC2_RESET) {
+		reset = SOCFPGA_RESET(EMAC2);
+	} else {
+		printf("GMAC: Invalid reset ID (%i)!\n", of_reset_id);
+		return;
+	}
+
+	clrsetbits_le32(&sysmgr_regs->emac[of_reset_id - EMAC0_RESET],
+			SYSMGR_EMACGRP_CTRL_PHYSEL_MASK,
+			phymode);
+
+	/* Release the EMAC controller from reset */
+	socfpga_per_reset(reset, 0);
+}
+#endif
+
+/*
++ * This function initializes security policies to be consistent across
++ * all logic units in the Arria 10.
++ *
++ * The idea is to set all security policies to be normal, nonsecure
++ * for all units.
++ */
+static void initialize_security_policies(void)
+{
+	/* Put OCRAM in non-secure */
+	writel(0x003f0000, &noc_fw_ocram_base->region0);
+	writel(0x1, &noc_fw_ocram_base->enable);
+
+	/* Put DDR in non-secure */
+	writel(0xffff0000, &noc_fw_ddr_l3_base->hpsregion0addr);
+	writel(0x1, &noc_fw_ddr_l3_base->enable);
+}
+
+int arch_early_init_r(void)
+{
+	initialize_security_policies();
+
+	/* Configure the L2 controller to make SDRAM start at 0 */
+	writel(0x1, &pl310->pl310_addr_filter_start);
+
+	/* assert reset to all except L4WD0 and L4TIMER0 */
+	socfpga_per_reset_all();
+
+	/* configuring the clock based on handoff */
+	/* TODO: Add call to cm_basic_init() */
+
+	/* Add device descriptor to FPGA device table */
+	socfpga_fpga_add();
+	return 0;
+}
+
+/*
+ * This function looking the 1st encounter UART peripheral,
+ * and then return its offset of the dedicated/shared IO pin
+ * mux. offset value (zero and above).
+ */
+static int find_peripheral_uart(const void *blob,
+	int child, const char *node_name)
+{
+	int len;
+	fdt_addr_t base_addr = 0;
+	fdt_size_t size;
+	const u32 *cell;
+	u32 value, offset = 0;
+
+	base_addr = fdtdec_get_addr_size(blob, child, "reg", &size);
+	if (base_addr != FDT_ADDR_T_NONE) {
+		cell = fdt_getprop(blob, child, "pinctrl-single,pins",
+			&len);
+		if (cell != NULL) {
+			for (; len > 0; len -= (2 * sizeof(u32))) {
+				offset = fdt32_to_cpu(*cell++);
+				value = fdt32_to_cpu(*cell++);
+				/* Found UART peripheral */
+				if (value == 0x0D)
+					return offset;
+			}
+		}
+	}
+	return -EINVAL;
+}
+
+/*
+ * This function looks up the 1st encounter UART peripheral,
+ * and then return its offset of the dedicated/shared IO pin
+ * mux. UART peripheral is found if the offset is not in negative
+ * value.
+ */
+static int is_peripheral_uart_true(const void *blob,
+	int node, const char *child_name)
+{
+	int child, len;
+	const char *node_name;
+
+	child = fdt_first_subnode(blob, node);
+
+	if (child < 0)
+		return -EINVAL;
+
+	node_name = fdt_get_name(blob, child, &len);
+
+	while (node_name) {
+		if (!strcmp(child_name, node_name))
+			return find_peripheral_uart(blob, child, node_name);
+
+		child = fdt_next_subnode(blob, child);
+		if (child < 0)
+			break;
+
+		node_name = fdt_get_name(blob, child, &len);
+	}
+
+	return -1;
+}
+
+/*
+ * This function looking the 1st encounter UART dedicated IO peripheral,
+ * and then return based address of the 1st encounter UART dedicated
+ * IO peripheral.
+ */
+unsigned int dedicated_uart_com_port(const void *blob)
+{
+	int node;
+
+	node = fdtdec_next_compatible(blob, 0,
+		 COMPAT_ALTERA_SOCFPGA_PINCTRL_SINGLE);
+	if (node < 0)
+		return 0;
+
+	if (is_peripheral_uart_true(blob, node, "dedicated") >= 0)
+		return SOCFPGA_UART1_ADDRESS;
+
+	return 0;
+}
+
+/*
+ * This function looking the 1st encounter UART shared IO peripheral, and then
+ * return based address of the 1st encounter UART shared IO peripheral.
+ */
+unsigned int shared_uart_com_port(const void *blob)
+{
+	int node, ret;
+
+	node = fdtdec_next_compatible(blob, 0,
+		 COMPAT_ALTERA_SOCFPGA_PINCTRL_SINGLE);
+	if (node < 0)
+		return 0;
+
+	ret = is_peripheral_uart_true(blob, node, "shared");
+
+	if (ret == PINMUX_UART0_TX_SHARED_IO_OFFSET_Q1_3 ||
+	    ret == PINMUX_UART0_TX_SHARED_IO_OFFSET_Q2_11 ||
+	    ret == PINMUX_UART0_TX_SHARED_IO_OFFSET_Q3_3)
+		return SOCFPGA_UART0_ADDRESS;
+	else if (ret == PINMUX_UART1_TX_SHARED_IO_OFFSET_Q1_7 ||
+		ret == PINMUX_UART1_TX_SHARED_IO_OFFSET_Q3_7 ||
+		ret == PINMUX_UART1_TX_SHARED_IO_OFFSET_Q4_3)
+		return SOCFPGA_UART1_ADDRESS;
+
+	return 0;
+}
+
+/*
+ * This function looking the 1st encounter UART peripheral, and then return
+ * base address of the 1st encounter UART peripheral.
+ */
+unsigned int uart_com_port(const void *blob)
+{
+	unsigned int ret;
+
+	ret = dedicated_uart_com_port(blob);
+
+	if (ret)
+		return ret;
+
+	return shared_uart_com_port(blob);
+}
+
+/*
+ * Print CPU information
+ */
+#if defined(CONFIG_DISPLAY_CPUINFO)
+int print_cpuinfo(void)
+{
+	const u32 bsel = (readl(&sysmgr_regs->bootinfo) >>
+			  SYSMGR_BOOTINFO_BSEL_SHIFT) & 0x7;
+
+	puts("CPU:   Altera SoCFPGA Arria 10\n");
+
+	printf("BOOT:  %s\n", bsel_str[bsel].name);
+	return 0;
+}
+#endif
+
+#ifdef CONFIG_ARCH_MISC_INIT
+int arch_misc_init(void)
+{
+	return 0;
+}
+#endif
diff --git a/arch/arm/mach-socfpga/misc_gen5.c b/arch/arm/mach-socfpga/misc_gen5.c
index f870e1f..3b8ce11 100644
--- a/arch/arm/mach-socfpga/misc_gen5.c
+++ b/arch/arm/mach-socfpga/misc_gen5.c
@@ -200,7 +200,8 @@ static int socfpga_fpga_id(const bool print_id)
 #if defined(CONFIG_DISPLAY_CPUINFO)
 int print_cpuinfo(void)
 {
-	const u32 bsel = readl(&sysmgr_regs->bootinfo) & 0x7;
+	const u32 bsel = (readl(&sysmgr_regs->bootinfo) >>
+			  SYSMGR_BOOTINFO_BSEL_SHIFT) & 0x7;
 
 	puts("CPU:   Altera SoCFPGA Platform\n");
 	socfpga_fpga_id(1);
-- 
1.8.2.3

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 12/20] arm: socfpga: Add pinmux for Arria 10
  2017-03-09  0:26 [U-Boot] [PATCH v2 00/20] Add Intel Arria 10 SoC support Ley Foon Tan
                   ` (10 preceding siblings ...)
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 11/20] arm: socfpga: Add misc support " Ley Foon Tan
@ 2017-03-09  0:26 ` Ley Foon Tan
  2017-03-10  1:50   ` Marek Vasut
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 13/20] fdt: Add compatible strings " Ley Foon Tan
                   ` (9 subsequent siblings)
  21 siblings, 1 reply; 60+ messages in thread
From: Ley Foon Tan @ 2017-03-09  0:26 UTC (permalink / raw)
  To: u-boot

Add pinmux support for Arria 10.

Signed-off-by: Tien Fong Chee <tien.fong.chee@intel.com>
Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
---
 arch/arm/mach-socfpga/Makefile              |  1 +
 arch/arm/mach-socfpga/include/mach/pinmux.h | 15 +++++
 arch/arm/mach-socfpga/pinmux_arria10.c      | 96 +++++++++++++++++++++++++++++
 3 files changed, 112 insertions(+)
 create mode 100644 arch/arm/mach-socfpga/include/mach/pinmux.h
 create mode 100644 arch/arm/mach-socfpga/pinmux_arria10.c

diff --git a/arch/arm/mach-socfpga/Makefile b/arch/arm/mach-socfpga/Makefile
index 9c4617f..68d55e4 100644
--- a/arch/arm/mach-socfpga/Makefile
+++ b/arch/arm/mach-socfpga/Makefile
@@ -12,6 +12,7 @@ obj-y	+= misc.o timer.o reset_manager.o clock_manager.o \
 
 obj-$(CONFIG_TARGET_SOCFPGA_ARRIA10) += clock_manager_arria10.o \
 					misc_arria10.o		\
+					pinmux_arria10.o	\
 					reset_manager_arria10.o
 
 obj-$(CONFIG_SPL_BUILD) += spl.o freeze_controller.o
diff --git a/arch/arm/mach-socfpga/include/mach/pinmux.h b/arch/arm/mach-socfpga/include/mach/pinmux.h
new file mode 100644
index 0000000..c5d5dd6
--- /dev/null
+++ b/arch/arm/mach-socfpga/include/mach/pinmux.h
@@ -0,0 +1,15 @@
+/*
+ * Copyright (C) 2016-2017 Intel Corporation <www.intel.com>
+ *
+ * SPDX-License-Identifier:	GPL-2.0
+ */
+
+#ifndef	_PINMUX_H_
+#define	_PINMUX_H_
+
+#ifndef __ASSEMBLY__
+int config_dedicated_pins(const void *blob);
+int config_pins(const void *blob, const char *pin_grp);
+#endif
+
+#endif /* _PINMUX_H_ */
diff --git a/arch/arm/mach-socfpga/pinmux_arria10.c b/arch/arm/mach-socfpga/pinmux_arria10.c
new file mode 100644
index 0000000..47339ea
--- /dev/null
+++ b/arch/arm/mach-socfpga/pinmux_arria10.c
@@ -0,0 +1,96 @@
+/*
+ *  Copyright (C) 2016-2017 Intel Corporation <www.intel.com>
+ *
+ * SPDX-License-Identifier:	GPL-2.0
+ */
+
+#include <asm/arch/pinmux.h>
+#include <asm/io.h>
+#include <common.h>
+#include <fdtdec.h>
+
+static int do_pinctr_pin(const void *blob, int child, const char *node_name)
+{
+	int len;
+	fdt_addr_t base_addr;
+	fdt_size_t size;
+	const u32 *cell;
+	u32 offset, value;
+
+	base_addr = fdtdec_get_addr_size(blob, child, "reg", &size);
+	if (base_addr != FDT_ADDR_T_NONE) {
+		cell = fdt_getprop(blob, child, "pinctrl-single,pins",
+			&len);
+		if (cell != NULL && len > 0) {
+			debug("%p %d\n", cell, len);
+			for (; len > 0; len -= (2 * sizeof(u32))) {
+				offset = fdt32_to_cpu(*cell++);
+				value = fdt32_to_cpu(*cell++);
+				debug("<0x%x 0x%x>\n", offset, value);
+				writel(value, base_addr + offset);
+			}
+			return 0;
+		}
+	}
+	return -EFAULT;
+}
+
+static int do_pinctrl_pins(const void *blob, int node, const char *child_name)
+{
+	int child, len;
+	const char *node_name;
+
+	child = fdt_first_subnode(blob, node);
+
+	if (child < 0)
+		return -EINVAL;
+
+	node_name = fdt_get_name(blob, child, &len);
+
+	while (node_name) {
+		if (!strcmp(child_name, node_name))
+			return do_pinctr_pin(blob, child, node_name);
+
+		child = fdt_next_subnode(blob, child);
+
+		if (child < 0)
+			break;
+
+		node_name = fdt_get_name(blob, child, &len);
+	}
+
+	return -EFAULT;
+}
+
+int config_dedicated_pins(const void *blob)
+{
+	int node;
+
+	node = fdtdec_next_compatible(blob, 0,
+			COMPAT_ALTERA_SOCFPGA_PINCTRL_SINGLE);
+	if (node < 0)
+		return -EINVAL;
+
+	if (do_pinctrl_pins(blob, node, "dedicated_cfg"))
+		return -EFAULT;
+
+	if (do_pinctrl_pins(blob, node, "dedicated"))
+		return -EFAULT;
+
+	return 0;
+}
+
+int config_pins(const void *blob, const char *pin_grp)
+{
+	int node;
+
+	node = fdtdec_next_compatible(blob, 0,
+			COMPAT_ALTERA_SOCFPGA_PINCTRL_SINGLE);
+	if (node < 0)
+		return -EINVAL;
+
+	if (do_pinctrl_pins(blob, node, pin_grp))
+		return -EFAULT;
+
+	return 0;
+}
-- 
1.8.2.3

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 13/20] fdt: Add compatible strings for Arria 10
  2017-03-09  0:26 [U-Boot] [PATCH v2 00/20] Add Intel Arria 10 SoC support Ley Foon Tan
                   ` (11 preceding siblings ...)
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 12/20] arm: socfpga: Add pinmux " Ley Foon Tan
@ 2017-03-09  0:26 ` Ley Foon Tan
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 14/20] arm: dts: Add dts and dtsi " Ley Foon Tan
                   ` (8 subsequent siblings)
  21 siblings, 0 replies; 60+ messages in thread
From: Ley Foon Tan @ 2017-03-09  0:26 UTC (permalink / raw)
  To: u-boot

Add compatible strings for Intel Arria 10 SoCFPGA device.

Signed-off-by: Tien Fong Chee <tien.fong.chee@intel.com>
Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
---
 include/fdtdec.h | 8 ++++++++
 lib/fdtdec.c     | 8 ++++++++
 2 files changed, 16 insertions(+)

diff --git a/include/fdtdec.h b/include/fdtdec.h
index d074478..2134701 100644
--- a/include/fdtdec.h
+++ b/include/fdtdec.h
@@ -155,6 +155,14 @@ enum fdt_compat_id {
 	COMPAT_INTEL_BAYTRAIL_FSP_MDP,	/* Intel FSP memory-down params */
 	COMPAT_INTEL_IVYBRIDGE_FSP,	/* Intel Ivy Bridge FSP */
 	COMPAT_SUNXI_NAND,		/* SUNXI NAND controller */
+	COMPAT_ALTERA_SOCFPGA_CLK,	/* SoCFPGA Clock initialization */
+	COMPAT_ALTERA_SOCFPGA_PINCTRL_SINGLE,	/* SoCFPGA pinctrl-single */
+	COMPAT_ALTERA_SOCFPGA_H2F_BRG,          /* SoCFPGA hps2fpga bridge */
+	COMPAT_ALTERA_SOCFPGA_LWH2F_BRG,        /* SoCFPGA lwhps2fpga bridge */
+	COMPAT_ALTERA_SOCFPGA_F2H_BRG,          /* SoCFPGA fpga2hps bridge */
+	COMPAT_ALTERA_SOCFPGA_F2SDR0,           /* SoCFPGA fpga2SDRAM0 bridge */
+	COMPAT_ALTERA_SOCFPGA_F2SDR1,           /* SoCFPGA fpga2SDRAM1 bridge */
+	COMPAT_ALTERA_SOCFPGA_F2SDR2,           /* SoCFPGA fpga2SDRAM2 bridge */
 
 	COMPAT_COUNT,
 };
diff --git a/lib/fdtdec.c b/lib/fdtdec.c
index 81f47ef..ebe4a9a 100644
--- a/lib/fdtdec.c
+++ b/lib/fdtdec.c
@@ -66,6 +66,14 @@ static const char * const compat_names[COMPAT_COUNT] = {
 	COMPAT(INTEL_BAYTRAIL_FSP_MDP, "intel,baytrail-fsp-mdp"),
 	COMPAT(INTEL_IVYBRIDGE_FSP, "intel,ivybridge-fsp"),
 	COMPAT(COMPAT_SUNXI_NAND, "allwinner,sun4i-a10-nand"),
+	COMPAT(ALTERA_SOCFPGA_CLK, "altr,clk-mgr"),
+	COMPAT(ALTERA_SOCFPGA_PINCTRL_SINGLE, "pinctrl-single"),
+	COMPAT(ALTERA_SOCFPGA_H2F_BRG, "altr,socfpga-hps2fpga-bridge"),
+	COMPAT(ALTERA_SOCFPGA_LWH2F_BRG, "altr,socfpga-lwhps2fpga-bridge"),
+	COMPAT(ALTERA_SOCFPGA_F2H_BRG, "altr,socfpga-fpga2hps-bridge"),
+	COMPAT(ALTERA_SOCFPGA_F2SDR0, "altr,socfpga-fpga2sdram0-bridge"),
+	COMPAT(ALTERA_SOCFPGA_F2SDR1, "altr,socfpga-fpga2sdram1-bridge"),
+	COMPAT(ALTERA_SOCFPGA_F2SDR2, "altr,socfpga-fpga2sdram2-bridge"),
 };
 
 const char *fdtdec_get_compatible(enum fdt_compat_id id)
-- 
1.8.2.3

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 14/20] arm: dts: Add dts and dtsi for Arria 10
  2017-03-09  0:26 [U-Boot] [PATCH v2 00/20] Add Intel Arria 10 SoC support Ley Foon Tan
                   ` (12 preceding siblings ...)
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 13/20] fdt: Add compatible strings " Ley Foon Tan
@ 2017-03-09  0:26 ` Ley Foon Tan
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 15/20] arm: socfpga: Add SPL support " Ley Foon Tan
                   ` (7 subsequent siblings)
  21 siblings, 0 replies; 60+ messages in thread
From: Ley Foon Tan @ 2017-03-09  0:26 UTC (permalink / raw)
  To: u-boot

Device tree files for Arria 10

Signed-off-by: Tien Fong Chee <tien.fong.chee@intel.com>
Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
---
 arch/arm/dts/Makefile                              |   1 +
 arch/arm/dts/socfpga_arria10.dtsi                  | 859 +++++++++++++++++++++
 arch/arm/dts/socfpga_arria10_socdk_sdmmc.dts       |  30 +
 .../dts/socfpga_arria10_socdk_sdmmc_handoff.dtsi   | 479 ++++++++++++
 4 files changed, 1369 insertions(+)
 create mode 100644 arch/arm/dts/socfpga_arria10.dtsi
 create mode 100644 arch/arm/dts/socfpga_arria10_socdk_sdmmc.dts
 create mode 100644 arch/arm/dts/socfpga_arria10_socdk_sdmmc_handoff.dtsi

diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile
index eb68c20..25e08eb 100644
--- a/arch/arm/dts/Makefile
+++ b/arch/arm/dts/Makefile
@@ -139,6 +139,7 @@ dtb-$(CONFIG_AM43XX) += am437x-gp-evm.dtb am437x-sk-evm.dtb	\
 dtb-$(CONFIG_THUNDERX) += thunderx-88xx.dtb
 
 dtb-$(CONFIG_ARCH_SOCFPGA) +=				\
+	socfpga_arria10_socdk_sdmmc.dtb			\
 	socfpga_arria5_socdk.dtb			\
 	socfpga_cyclone5_is1.dtb			\
 	socfpga_cyclone5_mcvevk.dtb			\
diff --git a/arch/arm/dts/socfpga_arria10.dtsi b/arch/arm/dts/socfpga_arria10.dtsi
new file mode 100644
index 0000000..52ab7fe
--- /dev/null
+++ b/arch/arm/dts/socfpga_arria10.dtsi
@@ -0,0 +1,859 @@
+/*
+ * Copyright (C) 2016-2017 Intel Corporation
+ *
+ * SPDX-License-Identifier:	GPL-2.0        X11
+ */
+
+#include "skeleton.dtsi"
+#include <dt-bindings/interrupt-controller/arm-gic.h>
+#include <dt-bindings/reset/altr,rst-mgr-a10.h>
+
+/ {
+	#address-cells = <1>;
+	#size-cells = <1>;
+
+	aliases {
+		ethernet0 = &gmac0;
+		ethernet1 = &gmac1;
+		ethernet2 = &gmac2;
+		serial0 = &uart0;
+		serial1 = &uart1;
+		timer0 = &timer0;
+		timer1 = &timer1;
+		timer2 = &timer2;
+		timer3 = &timer3;
+		spi0 = &spi0;
+		spi1 = &spi1;
+	};
+
+	memory {
+		name = "memory";
+		device_type = "memory";
+		reg = <0x0 0x40000000>; /* 1GB */
+	};
+
+	cpus {
+		#address-cells = <1>;
+		#size-cells = <0>;
+
+		cpu at 0 {
+			compatible = "arm,cortex-a9";
+			device_type = "cpu";
+			reg = <0>;
+			next-level-cache = <&L2>;
+		};
+		cpu at 1 {
+			compatible = "arm,cortex-a9";
+			device_type = "cpu";
+			reg = <1>;
+			next-level-cache = <&L2>;
+		};
+	};
+
+	intc: intc at ffffd000 {
+		compatible = "arm,cortex-a9-gic";
+		#interrupt-cells = <3>;
+		interrupt-controller;
+		reg = <0xffffd000 0x1000>,
+		      <0xffffc100 0x100>;
+	};
+
+	soc {
+		#address-cells = <1>;
+		#size-cells = <1>;
+		compatible = "simple-bus";
+		device_type = "soc";
+		interrupt-parent = <&intc>;
+		ranges;
+
+		amba {
+			compatible = "simple-bus";
+			#address-cells = <1>;
+			#size-cells = <1>;
+			ranges;
+
+			pdma: pdma at ffda1000 {
+				compatible = "arm,pl330", "arm,primecell";
+				reg = <0xffda1000 0x1000>;
+				interrupts = <0 83 IRQ_TYPE_LEVEL_HIGH>,
+					     <0 84 IRQ_TYPE_LEVEL_HIGH>,
+					     <0 85 IRQ_TYPE_LEVEL_HIGH>,
+					     <0 86 IRQ_TYPE_LEVEL_HIGH>,
+					     <0 87 IRQ_TYPE_LEVEL_HIGH>,
+					     <0 88 IRQ_TYPE_LEVEL_HIGH>,
+					     <0 89 IRQ_TYPE_LEVEL_HIGH>,
+					     <0 90 IRQ_TYPE_LEVEL_HIGH>,
+					     <0 91 IRQ_TYPE_LEVEL_HIGH>;
+				#dma-cells = <1>;
+				#dma-channels = <8>;
+				#dma-requests = <32>;
+				clocks = <&l4_main_clk>;
+				clock-names = "apb_pclk";
+			};
+		};
+
+		clkmgr at ffd04000 {
+			compatible = "altr,clk-mgr";
+			reg = <0xffd04000 0x1000>;
+			reg-names = "soc_clock_manager_OCP_SLV";
+
+			clocks {
+				#address-cells = <1>;
+				#size-cells = <0>;
+
+				cb_intosc_hs_div2_clk: cb_intosc_hs_div2_clk {
+					#clock-cells = <0>;
+					compatible = "fixed-clock";
+				};
+
+				cb_intosc_ls_clk: cb_intosc_ls_clk {
+					#clock-cells = <0>;
+					compatible = "fixed-clock";
+				};
+
+				f2s_free_clk: f2s_free_clk {
+					#clock-cells = <0>;
+					compatible = "fixed-clock";
+				};
+
+				osc1: osc1 {
+					#clock-cells = <0>;
+					compatible = "fixed-clock";
+				};
+
+				main_pll: main_pll {
+					#address-cells = <1>;
+					#size-cells = <0>;
+					#clock-cells = <0>;
+					compatible = "altr,socfpga-a10-pll-clock";
+					clocks = <&osc1>, <&cb_intosc_ls_clk>,
+							 <&f2s_free_clk>;
+					reg = <0x40>;
+
+					main_mpu_base_clk: main_mpu_base_clk {
+						#clock-cells = <0>;
+						compatible = "altr,socfpga-a10-perip-clk";
+						clocks = <&main_pll>;
+						div-reg = <0x140 0 11>;
+					};
+
+					main_noc_base_clk: main_noc_base_clk {
+						#clock-cells = <0>;
+						compatible = "altr,socfpga-a10-perip-clk";
+						clocks = <&main_pll>;
+						div-reg = <0x144 0 11>;
+					};
+
+					main_emaca_clk: main_emaca_clk {
+						#clock-cells = <0>;
+						compatible = "altr,socfpga-a10-perip-clk";
+						clocks = <&main_pll>;
+						reg = <0x68>;
+					};
+
+					main_emacb_clk: main_emacb_clk {
+						#clock-cells = <0>;
+						compatible = "altr,socfpga-a10-perip-clk";
+						clocks = <&main_pll>;
+						reg = <0x6C>;
+					};
+
+					main_emac_ptp_clk: main_emac_ptp_clk {
+						#clock-cells = <0>;
+						compatible = "altr,socfpga-a10-perip-clk";
+						clocks = <&main_pll>;
+						reg = <0x70>;
+					};
+
+					main_gpio_db_clk: main_gpio_db_clk {
+						#clock-cells = <0>;
+						compatible = "altr,socfpga-a10-perip-clk";
+						clocks = <&main_pll>;
+						reg = <0x74>;
+					};
+
+					main_sdmmc_clk: main_sdmmc_clk {
+						#clock-cells = <0>;
+						compatible = "altr,socfpga-a10-perip-clk";
+						clocks = <&main_pll>;
+						reg = <0x78>;
+					};
+
+					main_s2f_usr0_clk: main_s2f_usr0_clk {
+						#clock-cells = <0>;
+						compatible = "altr,socfpga-a10-perip-clk";
+						clocks = <&main_pll>;
+						reg = <0x7C>;
+					};
+
+					main_s2f_usr1_clk: main_s2f_usr1_clk {
+						#clock-cells = <0>;
+						compatible = "altr,socfpga-a10-perip-clk";
+						clocks = <&main_pll>;
+						reg = <0x80>;
+					};
+
+					main_hmc_pll_ref_clk: main_hmc_pll_ref_clk {
+						#clock-cells = <0>;
+						compatible = "altr,socfpga-a10-perip-clk";
+						clocks = <&main_pll>;
+						reg = <0x84>;
+					};
+
+					main_periph_ref_clk: main_periph_ref_clk {
+						#clock-cells = <0>;
+						compatible = "altr,socfpga-a10-perip-clk";
+						clocks = <&main_pll>;
+						reg = <0x9C>;
+					};
+				};
+
+				periph_pll: periph_pll {
+					#address-cells = <1>;
+					#size-cells = <0>;
+					#clock-cells = <0>;
+					compatible = "altr,socfpga-a10-pll-clock";
+					clocks = <&osc1>, <&cb_intosc_ls_clk>,
+							 <&f2s_free_clk>, <&main_periph_ref_clk>;
+					reg = <0xC0>;
+
+					peri_mpu_base_clk: peri_mpu_base_clk {
+						#clock-cells = <0>;
+						compatible = "altr,socfpga-a10-perip-clk";
+						clocks = <&periph_pll>;
+						div-reg = <0x140 16 11>;
+					};
+
+					peri_noc_base_clk: peri_noc_base_clk {
+						#clock-cells = <0>;
+						compatible = "altr,socfpga-a10-perip-clk";
+						clocks = <&periph_pll>;
+						div-reg = <0x144 16 11>;
+					};
+
+					peri_emaca_clk: peri_emaca_clk {
+						#clock-cells = <0>;
+						compatible = "altr,socfpga-a10-perip-clk";
+						clocks = <&periph_pll>;
+						reg = <0xE8>;
+					};
+
+					peri_emacb_clk: peri_emacb_clk {
+						#clock-cells = <0>;
+						compatible = "altr,socfpga-a10-perip-clk";
+						clocks = <&periph_pll>;
+						reg = <0xEC>;
+					};
+
+					peri_emac_ptp_clk: peri_emac_ptp_clk {
+						#clock-cells = <0>;
+						compatible = "altr,socfpga-a10-perip-clk";
+						clocks = <&periph_pll>;
+						reg = <0xF0>;
+					};
+
+					peri_gpio_db_clk: peri_gpio_db_clk {
+						#clock-cells = <0>;
+						compatible = "altr,socfpga-a10-perip-clk";
+						clocks = <&periph_pll>;
+						reg = <0xF4>;
+					};
+
+					peri_sdmmc_clk: peri_sdmmc_clk {
+						#clock-cells = <0>;
+						compatible = "altr,socfpga-a10-perip-clk";
+						clocks = <&periph_pll>;
+						reg = <0xF8>;
+					};
+
+					peri_s2f_usr0_clk: peri_s2f_usr0_clk {
+						#clock-cells = <0>;
+						compatible = "altr,socfpga-a10-perip-clk";
+						clocks = <&periph_pll>;
+						reg = <0xFC>;
+					};
+
+					peri_s2f_usr1_clk: peri_s2f_usr1_clk {
+						#clock-cells = <0>;
+						compatible = "altr,socfpga-a10-perip-clk";
+						clocks = <&periph_pll>;
+						reg = <0x100>;
+					};
+
+					peri_hmc_pll_ref_clk: peri_hmc_pll_ref_clk {
+						#clock-cells = <0>;
+						compatible = "altr,socfpga-a10-perip-clk";
+						clocks = <&periph_pll>;
+						reg = <0x104>;
+					};
+				};
+
+				mpu_free_clk: mpu_free_clk {
+					#clock-cells = <0>;
+					compatible = "altr,socfpga-a10-perip-clk";
+					clocks = <&main_mpu_base_clk>, <&peri_mpu_base_clk>,
+							 <&osc1>, <&cb_intosc_hs_div2_clk>,
+							 <&f2s_free_clk>;
+					reg = <0x60>;
+				};
+
+				noc_free_clk: noc_free_clk {
+					#clock-cells = <0>;
+					compatible = "altr,socfpga-a10-perip-clk";
+					clocks = <&main_noc_base_clk>, <&peri_noc_base_clk>,
+							 <&osc1>, <&cb_intosc_hs_div2_clk>,
+							 <&f2s_free_clk>;
+					reg = <0x64>;
+				};
+
+				s2f_user1_free_clk: s2f_user1_free_clk {
+					#clock-cells = <0>;
+					compatible = "altr,socfpga-a10-perip-clk";
+					clocks = <&main_s2f_usr1_clk>, <&peri_s2f_usr1_clk>,
+							 <&osc1>, <&cb_intosc_hs_div2_clk>,
+							 <&f2s_free_clk>;
+					reg = <0x104>;
+				};
+
+				sdmmc_free_clk: sdmmc_free_clk {
+					#clock-cells = <0>;
+					compatible = "altr,socfpga-a10-perip-clk";
+					clocks = <&main_sdmmc_clk>, <&peri_sdmmc_clk>,
+							 <&osc1>, <&cb_intosc_hs_div2_clk>,
+							 <&f2s_free_clk>;
+					fixed-divider = <4>;
+					reg = <0xF8>;
+				};
+
+				l4_sys_free_clk: l4_sys_free_clk {
+					#clock-cells = <0>;
+					compatible = "altr,socfpga-a10-perip-clk";
+					clocks = <&noc_free_clk>;
+					fixed-divider = <4>;
+				};
+
+				l4_main_clk: l4_main_clk {
+					#clock-cells = <0>;
+					compatible = "altr,socfpga-a10-gate-clk";
+					clocks = <&noc_free_clk>;
+					div-reg = <0xA8 0 2>;
+					clk-gate = <0x48 1>;
+				};
+
+				l4_mp_clk: l4_mp_clk {
+					#clock-cells = <0>;
+					compatible = "altr,socfpga-a10-gate-clk";
+					clocks = <&noc_free_clk>;
+					div-reg = <0xA8 8 2>;
+					clk-gate = <0x48 2>;
+				};
+
+				l4_sp_clk: l4_sp_clk {
+					#clock-cells = <0>;
+					compatible = "altr,socfpga-a10-gate-clk";
+					clocks = <&noc_free_clk>;
+					div-reg = <0xA8 16 2>;
+					clk-gate = <0x48 3>;
+				};
+
+				mpu_periph_clk: mpu_periph_clk {
+					#clock-cells = <0>;
+					compatible = "altr,socfpga-a10-gate-clk";
+					clocks = <&mpu_free_clk>;
+					fixed-divider = <4>;
+					clk-gate = <0x48 0>;
+				};
+
+				sdmmc_clk: sdmmc_clk {
+					#clock-cells = <0>;
+					compatible = "altr,socfpga-a10-gate-clk";
+					clocks = <&sdmmc_free_clk>;
+					clk-gate = <0xC8 5>;
+					clk-phase = <0 135>;
+				};
+
+				qspi_clk: qspi_clk {
+					#clock-cells = <0>;
+					compatible = "altr,socfpga-a10-gate-clk";
+					clocks = <&l4_main_clk>;
+					clk-gate = <0xC8 11>;
+				};
+
+				nand_clk: nand_clk {
+					#clock-cells = <0>;
+					compatible = "altr,socfpga-a10-gate-clk";
+					clocks = <&l4_mp_clk>;
+					clk-gate = <0xC8 10>;
+				};
+
+				spi_m_clk: spi_m_clk {
+					#clock-cells = <0>;
+					compatible = "altr,socfpga-a10-gate-clk";
+					clocks = <&l4_main_clk>;
+					clk-gate = <0xC8 9>;
+				};
+
+				usb_clk: usb_clk {
+					#clock-cells = <0>;
+					compatible = "altr,socfpga-a10-gate-clk";
+					clocks = <&l4_mp_clk>;
+					clk-gate = <0xC8 8>;
+				};
+
+				s2f_usr1_clk: s2f_usr1_clk {
+					#clock-cells = <0>;
+					compatible = "altr,socfpga-a10-gate-clk";
+					clocks = <&peri_s2f_usr1_clk>;
+					clk-gate = <0xC8 6>;
+				};
+			};
+		};
+
+		gmac0: ethernet at ff800000 {
+			compatible = "altr,socfpga-stmmac", "snps,dwmac-3.72a", "snps,dwmac";
+			altr,sysmgr-syscon = <&sysmgr 0x44 0>;
+			reg = <0xff800000 0x2000>;
+			interrupts = <0 92 IRQ_TYPE_LEVEL_HIGH>;
+			interrupt-names = "macirq";
+			/* Filled in by bootloader */
+			mac-address = [00 00 00 00 00 00];
+			snps,multicast-filter-bins = <256>;
+			snps,perfect-filter-entries = <128>;
+			tx-fifo-depth = <4096>;
+			rx-fifo-depth = <16384>;
+			clocks = <&l4_mp_clk>;
+			clock-names = "stmmaceth";
+			resets = <&rst EMAC0_RESET>;
+			reset-names = "stmmaceth";
+			status = "disabled";
+		};
+
+		gmac1: ethernet at ff802000 {
+			compatible = "altr,socfpga-stmmac", "snps,dwmac-3.72a", "snps,dwmac";
+			altr,sysmgr-syscon = <&sysmgr 0x48 0>;
+		        reg = <0xff802000 0x2000>;
+			interrupts = <0 93 IRQ_TYPE_LEVEL_HIGH>;
+			interrupt-names = "macirq";
+			/* Filled in by bootloader */
+			mac-address = [00 00 00 00 00 00];
+			snps,multicast-filter-bins = <256>;
+			snps,perfect-filter-entries = <128>;
+			tx-fifo-depth = <4096>;
+			rx-fifo-depth = <16384>;
+			clocks = <&l4_mp_clk>;
+			clock-names = "stmmaceth";
+			resets = <&rst EMAC1_RESET>;
+			reset-names = "stmmaceth";
+			status = "disabled";
+		};
+
+		gmac2: ethernet at ff804000 {
+			compatible = "altr,socfpga-stmmac", "snps,dwmac-3.72a", "snps,dwmac";
+			altr,sysmgr-syscon = <&sysmgr 0x4C 0>;
+			reg = <0xff804000 0x2000>;
+			interrupts = <0 94 IRQ_TYPE_LEVEL_HIGH>;
+			interrupt-names = "macirq";
+			/* Filled in by bootloader */
+			mac-address = [00 00 00 00 00 00];
+			snps,multicast-filter-bins = <256>;
+			snps,perfect-filter-entries = <128>;
+			tx-fifo-depth = <4096>;
+			rx-fifo-depth = <16384>;
+			clocks = <&l4_mp_clk>;
+			clock-names = "stmmaceth";
+			status = "disabled";
+		};
+
+		gpio0: gpio at ffc02900 {
+			#address-cells = <1>;
+			#size-cells = <0>;
+			compatible = "snps,dw-apb-gpio";
+			reg = <0xffc02900 0x100>;
+			status = "disabled";
+
+			porta: gpio-controller at 0 {
+				compatible = "snps,dw-apb-gpio-port";
+				gpio-controller;
+				#gpio-cells = <2>;
+				snps,nr-gpios = <29>;
+				reg = <0>;
+				interrupt-controller;
+				#interrupt-cells = <2>;
+				interrupts = <0 112 IRQ_TYPE_LEVEL_HIGH>;
+			};
+		};
+
+		gpio1: gpio at ffc02a00 {
+			#address-cells = <1>;
+			#size-cells = <0>;
+			compatible = "snps,dw-apb-gpio";
+			reg = <0xffc02a00 0x100>;
+			status = "disabled";
+
+			portb: gpio-controller at 0 {
+				compatible = "snps,dw-apb-gpio-port";
+				gpio-controller;
+				#gpio-cells = <2>;
+				snps,nr-gpios = <29>;
+				reg = <0>;
+				interrupt-controller;
+				#interrupt-cells = <2>;
+				interrupts = <0 113 IRQ_TYPE_LEVEL_HIGH>;
+			};
+		};
+
+		gpio2: gpio at ffc02b00 {
+			#address-cells = <1>;
+			#size-cells = <0>;
+			compatible = "snps,dw-apb-gpio";
+			reg = <0xffc02b00 0x100>;
+			status = "disabled";
+
+			portc: gpio-controller at 0 {
+				compatible = "snps,dw-apb-gpio-port";
+				gpio-controller;
+				#gpio-cells = <2>;
+				snps,nr-gpios = <27>;
+				reg = <0>;
+				interrupt-controller;
+				#interrupt-cells = <2>;
+				interrupts = <0 114 IRQ_TYPE_LEVEL_HIGH>;
+			};
+		};
+
+		fpga_mgr: fpga-mgr at ffd03000 {
+			compatible = "altr,socfpga-a10-fpga-mgr";
+			reg = <0xffd03000 0x100
+			       0xffcfe400 0x20>;
+			clocks = <&l4_mp_clk>;
+			resets = <&rst FPGAMGR_RESET>;
+			reset-names = "fpgamgr";
+		};
+
+		i2c0: i2c at ffc02200 {
+			#address-cells = <1>;
+			#size-cells = <0>;
+			compatible = "snps,designware-i2c";
+			reg = <0xffc02200 0x100>;
+			interrupts = <0 105 IRQ_TYPE_LEVEL_HIGH>;
+			clocks = <&l4_sp_clk>;
+			status = "disabled";
+		};
+
+		i2c1: i2c at ffc02300 {
+			#address-cells = <1>;
+			#size-cells = <0>;
+			compatible = "snps,designware-i2c";
+			reg = <0xffc02300 0x100>;
+			interrupts = <0 106 IRQ_TYPE_LEVEL_HIGH>;
+			clocks = <&l4_sp_clk>;
+			status = "disabled";
+		};
+
+		i2c2: i2c at ffc02400 {
+			#address-cells = <1>;
+			#size-cells = <0>;
+			compatible = "snps,designware-i2c";
+			reg = <0xffc02400 0x100>;
+			interrupts = <0 107 IRQ_TYPE_LEVEL_HIGH>;
+			clocks = <&l4_sp_clk>;
+			status = "disabled";
+		};
+
+		i2c3: i2c at ffc02500 {
+			#address-cells = <1>;
+			#size-cells = <0>;
+			compatible = "snps,designware-i2c";
+			reg = <0xffc02500 0x100>;
+			interrupts = <0 108 IRQ_TYPE_LEVEL_HIGH>;
+			clocks = <&l4_sp_clk>;
+			status = "disabled";
+		};
+
+		i2c4: i2c at ffc02600 {
+			#address-cells = <1>;
+			#size-cells = <0>;
+			compatible = "snps,designware-i2c";
+			reg = <0xffc02600 0x100>;
+			interrupts = <0 109 IRQ_TYPE_LEVEL_HIGH>;
+			clocks = <&l4_sp_clk>;
+			status = "disabled";
+		};
+
+		sdr: sdr at 0xffcfb100 {
+			compatible = "syscon";
+			reg = <0xffcfb100 0x80>;
+		};
+
+		spi0: spi at ffda4000 {
+			compatible = "snps,dw-apb-ssi";
+			#address-cells = <1>;
+			#size-cells = <0>;
+			reg = <0xffda4000 0x100>;
+			interrupts = <0 101 IRQ_TYPE_LEVEL_HIGH>;
+			num-chipselect = <4>;
+			bus-num = <0>;
+			tx-dma-channel = <&pdma 16>;
+			rx-dma-channel = <&pdma 17>;
+			clocks = <&spi_m_clk>;
+			status = "disabled";
+		};
+
+		spi1: spi at ffda5000 {
+			compatible = "snps,dw-apb-ssi";
+			#address-cells = <1>;
+			#size-cells = <0>;
+			reg = <0xffda5000 0x100>;
+			interrupts = <0 102 IRQ_TYPE_LEVEL_HIGH>;
+			num-chipselect = <4>;
+			bus-num = <0>;
+			tx-dma-channel = <&pdma 20>;
+			rx-dma-channel = <&pdma 21>;
+			clocks = <&spi_m_clk>;
+			status = "disabled";
+		};
+
+		L2: l2-cache at fffff000 {
+			compatible = "arm,pl310-cache";
+			reg = <0xfffff000 0x1000>;
+			interrupts = <0 18 IRQ_TYPE_LEVEL_HIGH>;
+			cache-unified;
+			cache-level = <2>;
+		};
+
+		mmc: dwmmc0 at ff808000 {
+			#address-cells = <1>;
+			#size-cells = <0>;
+			compatible = "altr,socfpga-dw-mshc";
+			reg = <0xff808000 0x1000>;
+			interrupts = <0 98 IRQ_TYPE_LEVEL_HIGH>;
+			fifo-depth = <0x400>;
+			bus-width = <4>;
+			clocks = <&l4_mp_clk>, <&sdmmc_clk>;
+			clock-names = "biu", "ciu";
+			status = "disabled";
+		};
+
+		ocram: sram at ffe00000 {
+			compatible = "mmio-sram";
+			reg = <0xffe00000 0x40000>;
+		};
+
+		eccmgr: eccmgr at ffd06000 {
+			compatible = "altr,socfpga-a10-ecc-manager";
+			altr,sysmgr-syscon = <&sysmgr>;
+			#address-cells = <1>;
+			#size-cells = <1>;
+			interrupts = <0 2 IRQ_TYPE_LEVEL_HIGH>,
+				     <0 0 IRQ_TYPE_LEVEL_HIGH>;
+			interrupt-controller;
+			#interrupt-cells = <2>;
+			ranges;
+
+			sdramedac {
+				compatible = "altr,sdram-edac-a10";
+				altr,sdr-syscon = <&sdr>;
+				interrupts = <17 IRQ_TYPE_LEVEL_HIGH>,
+					     <49 IRQ_TYPE_LEVEL_HIGH>;
+			};
+
+			l2-ecc at ffd06010 {
+				compatible = "altr,socfpga-a10-l2-ecc";
+				reg = <0xffd06010 0x4>;
+				interrupts = <0 IRQ_TYPE_LEVEL_HIGH>,
+					     <32 IRQ_TYPE_LEVEL_HIGH>;
+			};
+
+			ocram-ecc at ff8c3000 {
+				compatible = "altr,socfpga-a10-ocram-ecc";
+				reg = <0xff8c3000 0x400>;
+				interrupts = <1 IRQ_TYPE_LEVEL_HIGH>,
+					     <33 IRQ_TYPE_LEVEL_HIGH>;
+			};
+
+			sdmmca-ecc at ff8c2c00 {
+				compatible = "altr,socfpga-sdmmc-ecc";
+				reg = <0xff8c2c00 0x400>;
+				altr,ecc-parent = <&mmc>;
+				interrupts = <15 IRQ_TYPE_LEVEL_HIGH>,
+					<47 IRQ_TYPE_LEVEL_HIGH>,
+					<16 IRQ_TYPE_LEVEL_HIGH>,
+					<48 IRQ_TYPE_LEVEL_HIGH>;
+			};
+
+			emac0-rx-ecc at ff8c0800 {
+				compatible = "altr,socfpga-eth-mac-ecc";
+				reg = <0xff8c0800 0x400>;
+				altr,ecc-parent = <&gmac0>;
+				interrupts = <4 IRQ_TYPE_LEVEL_HIGH>,
+					     <36 IRQ_TYPE_LEVEL_HIGH>;
+			};
+
+			emac0-tx-ecc at ff8c0c00 {
+				compatible = "altr,socfpga-eth-mac-ecc";
+				reg = <0xff8c0c00 0x400>;
+				altr,ecc-parent = <&gmac0>;
+				interrupts = <5 IRQ_TYPE_LEVEL_HIGH>,
+					     <37 IRQ_TYPE_LEVEL_HIGH>;
+			};
+
+			dma-ecc at ff8c8000 {
+				compatible = "altr,socfpga-dma-ecc";
+				reg = <0xff8c8000 0x400>;
+				altr,ecc-parent = <&pdma>;
+				interrupts = <10 IRQ_TYPE_LEVEL_HIGH>,
+					     <42 IRQ_TYPE_LEVEL_HIGH>;
+			};
+
+			usb0-ecc at ff8c8800 {
+				compatible = "altr,socfpga-usb-ecc";
+				reg = <0xff8c8800 0x400>;
+				altr,ecc-parent = <&usb0>;
+				interrupts = <2 IRQ_TYPE_LEVEL_HIGH>,
+					     <34 IRQ_TYPE_LEVEL_HIGH>;
+			};
+		};
+
+		qspi: qspi at ff809000 {
+			#address-cells = <1>;
+			#size-cells = <0>;
+			compatible = "cadence,qspi";
+			reg = <0xff809000 0x100>,
+				<0xffa00000 0x100000>;
+			interrupts = <0 100 IRQ_TYPE_LEVEL_HIGH>;
+			clocks = <&l4_main_clk>;
+			ext-decoder = <0>;  /* external decoder */
+			num-chipselect = <4>;
+			fifo-depth = <128>;
+			sram-size = <512>;
+			bus-num = <2>;
+			status = "disabled";
+		};
+
+		rst: rstmgr at ffd05000 {
+			#reset-cells = <1>;
+			compatible = "altr,rst-mgr";
+			reg = <0xffd05000 0x100>;
+			altr,modrst-offset = <0x20>;
+		};
+
+		scu: snoop-control-unit at ffffc000 {
+			compatible = "arm,cortex-a9-scu";
+			reg = <0xffffc000 0x100>;
+		};
+
+		sysmgr: sysmgr at ffd06000 {
+			compatible = "altr,sys-mgr", "syscon";
+			reg = <0xffd06000 0x300>;
+			cpu1-start-addr = <0xffd06230>;
+		};
+
+		/* Local timer */
+		timer at ffffc600 {
+			compatible = "arm,cortex-a9-twd-timer";
+			reg = <0xffffc600 0x100>;
+			interrupts = <1 13 0xf04>;
+			clocks = <&mpu_periph_clk>;
+		};
+
+		timer0: timer0 at ffc02700 {
+			compatible = "snps,dw-apb-timer";
+			interrupts = <0 115 IRQ_TYPE_LEVEL_HIGH>;
+			reg = <0xffc02700 0x100>;
+			clocks = <&l4_sp_clk>;
+			clock-names = "timer";
+		};
+
+		timer1: timer1 at ffc02800 {
+			compatible = "snps,dw-apb-timer";
+			interrupts = <0 116 IRQ_TYPE_LEVEL_HIGH>;
+			reg = <0xffc02800 0x100>;
+			clocks = <&l4_sp_clk>;
+			clock-names = "timer";
+		};
+
+		timer2: timer2 at ffd00000 {
+			compatible = "snps,dw-apb-timer";
+			interrupts = <0 117 IRQ_TYPE_LEVEL_HIGH>;
+			reg = <0xffd00000 0x100>;
+			clocks = <&l4_sys_free_clk>;
+			clock-names = "timer";
+		};
+
+		timer3: timer3 at ffd00100 {
+			compatible = "snps,dw-apb-timer";
+			interrupts = <0 118 IRQ_TYPE_LEVEL_HIGH>;
+			reg = <0xffd01000 0x100>;
+			clocks = <&l4_sys_free_clk>;
+			clock-names = "timer";
+		};
+
+		uart0: serial0 at ffc02000 {
+			compatible = "snps,dw-apb-uart";
+			reg = <0xffc02000 0x100>;
+			interrupts = <0 110 IRQ_TYPE_LEVEL_HIGH>;
+			reg-shift = <2>;
+			reg-io-width = <4>;
+			clocks = <&l4_sp_clk>;
+			status = "disabled";
+		};
+
+		uart1: serial1 at ffc02100 {
+			compatible = "snps,dw-apb-uart";
+			reg = <0xffc02100 0x100>;
+			interrupts = <0 111 IRQ_TYPE_LEVEL_HIGH>;
+			reg-shift = <2>;
+			reg-io-width = <4>;
+			clocks = <&l4_sp_clk>;
+			status = "disabled";
+		};
+
+		usbphy0: usbphy at 0 {
+			#phy-cells = <0>;
+			compatible = "usb-nop-xceiv";
+			status = "okay";
+		};
+
+		usb0: usb at ffb00000 {
+			compatible = "snps,dwc2";
+			reg = <0xffb00000 0xffff>;
+			interrupts = <0 95 IRQ_TYPE_LEVEL_HIGH>;
+			clocks = <&usb_clk>;
+			clock-names = "otg";
+			resets = <&rst USB0_RESET>;
+			reset-names = "dwc2";
+			phys = <&usbphy0>;
+			phy-names = "usb2-phy";
+			status = "disabled";
+		};
+
+		usb1: usb at ffb40000 {
+			compatible = "snps,dwc2";
+			reg = <0xffb40000 0xffff>;
+			interrupts = <0 96 IRQ_TYPE_LEVEL_HIGH>;
+			clocks = <&usb_clk>;
+			clock-names = "otg";
+			resets = <&rst USB1_RESET>;
+			reset-names = "dwc2";
+			phys = <&usbphy0>;
+			phy-names = "usb2-phy";
+			status = "disabled";
+		};
+
+		watchdog0: watchdog at ffd00200 {
+			compatible = "snps,dw-wdt";
+			reg = <0xffd00200 0x100>;
+			interrupts = <0 119 IRQ_TYPE_LEVEL_HIGH>;
+			clocks = <&l4_sys_free_clk>;
+			status = "disabled";
+		};
+
+		watchdog1: watchdog at ffd00300 {
+			compatible = "snps,dw-wdt";
+			reg = <0xffd00300 0x100>;
+			interrupts = <0 120 IRQ_TYPE_LEVEL_HIGH>;
+			clocks = <&l4_sys_free_clk>;
+			status = "disabled";
+		};
+	};
+};
diff --git a/arch/arm/dts/socfpga_arria10_socdk_sdmmc.dts b/arch/arm/dts/socfpga_arria10_socdk_sdmmc.dts
new file mode 100644
index 0000000..a4215ee
--- /dev/null
+++ b/arch/arm/dts/socfpga_arria10_socdk_sdmmc.dts
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2016-2017 Intel Corporation
+ *
+ * SPDX-License-Identifier:	GPL-2.0        X11
+ */
+
+/dts-v1/;
+#include "socfpga_arria10_socdk_sdmmc_handoff.dtsi"
+
+/ {
+	chosen {
+		bootargs = "console=ttyS0,115200";
+	};
+};
+
+&uart1 {
+	u-boot,dm-pre-reloc;
+	status = "okay";
+};
+
+&mmc {
+	u-boot,dm-pre-reloc;
+	status = "okay";
+	num-slots = <1>;
+	cap-sd-highspeed;
+	broken-cd;
+	bus-width = <4>;
+	altr,dw-mshc-ciu-div = <3>;
+	altr,dw-mshc-sdr-timing = <0 3>;
+};
diff --git a/arch/arm/dts/socfpga_arria10_socdk_sdmmc_handoff.dtsi b/arch/arm/dts/socfpga_arria10_socdk_sdmmc_handoff.dtsi
new file mode 100644
index 0000000..e530f80
--- /dev/null
+++ b/arch/arm/dts/socfpga_arria10_socdk_sdmmc_handoff.dtsi
@@ -0,0 +1,479 @@
+/*
+ * Copyright (C) 2016-2017 Intel Corporation
+ *
+ * SPDX-License-Identifier:	GPL-2.0        X11
+ *
+ *<auto-generated>
+ *	This code was generated by a tool based on
+ *	handoffs from both Qsys and Quartus.
+ *
+ *	Changes to this file may be lost if
+ *	the code is regenerated.
+ *</auto-generated>
+ */
+
+#include "socfpga_arria10.dtsi"
+
+/ {
+	model = "Altera SOCFPGA Arria 10";
+	compatible = "altr,socfpga-arria10", "altr,socfpga";
+
+	chosen {
+		/* Bootloader setting: uboot.rbf_filename */
+		cff-file = "ghrd_10as066n2.periph.rbf";
+		early-release-fpga-config;
+	};
+
+	soc {
+		u-boot,dm-pre-reloc;
+		clkmgr at ffd04000 {
+			u-boot,dm-pre-reloc;
+			clocks {
+				u-boot,dm-pre-reloc;
+				osc1 {
+					u-boot,dm-pre-reloc;
+					clock-frequency = <25000000>;
+					clock-output-names = "altera_arria10_hps_eosc1-clk";
+				};
+
+				cb_intosc_ls_clk {
+					u-boot,dm-pre-reloc;
+					clock-frequency = <60000000>;
+					clock-output-names = "altera_arria10_hps_cb_intosc_ls-clk";
+				};
+
+				f2s_free_clk {
+					u-boot,dm-pre-reloc;
+					clock-frequency = <200000000>;
+					clock-output-names = "altera_arria10_hps_f2h_free-clk";
+				};
+
+				main_pll {
+					u-boot,dm-pre-reloc;
+				/*
+				 * Address Block: soc_clock_manager_OCP_SLV.
+				 * i_clk_mgr_mainpllgrp
+				 */
+					altr,of_reg_value = <
+						0	/* Field: vco0.psrc */
+						1	/* Field: vco1.denom */
+						191	/* Field: vco1.numer */
+						0	/* Field: mpuclk */
+						0	/* Field: mpuclk.cnt */
+						0	/* Field: mpuclk.src */
+						0	/* Field: nocclk */
+						0	/* Field: nocclk.cnt */
+						0	/* Field: nocclk.src */
+						900	/* Field: cntr2clk.cnt */
+						900	/* Field: cntr3clk.cnt */
+						900	/* Field: cntr4clk.cnt */
+						900	/* Field: cntr5clk.cnt */
+						900	/* Field: cntr6clk.cnt */
+						900	/* Field: cntr7clk.cnt */
+						0	/* Field: cntr7clk.src */
+						900	/* Field: cntr8clk.cnt */
+						900	/* Field: cntr9clk.cnt */
+						0	/* Field: cntr9clk.src */
+						900	/* Field: cntr15clk.cnt */
+						0	/* Field: nocdiv.l4mainclk */
+						0	/* Field: nocdiv.l4mpclk */
+						2	/* Field: nocdiv.l4spclk */
+						0	/* Field: nocdiv.csatclk */
+						1	/* Field: nocdiv.cstraceclk */
+						1	/* Field: nocdiv.cspdbgclk */
+					>;
+				};
+
+				periph_pll {
+					u-boot,dm-pre-reloc;
+				/*
+				 * Address Block: soc_clock_manager_OCP_SLV.
+				 * i_clk_mgr_perpllgrp
+				 */
+					altr,of_reg_value = <
+						0	/* Field: vco0.psrc */
+						1	/* Field: vco1.denom */
+						159	/* Field: vco1.numer */
+						7	/* Field: cntr2clk.cnt */
+						1	/* Field: cntr2clk.src */
+						900	/* Field: cntr3clk.cnt */
+						1	/* Field: cntr3clk.src */
+						19	/* Field: cntr4clk.cnt */
+						1	/* Field: cntr4clk.src */
+						499	/* Field: cntr5clk.cnt */
+						1	/* Field: cntr5clk.src */
+						9	/* Field: cntr6clk.cnt */
+						1	/* Field: cntr6clk.src */
+						900	/* Field: cntr7clk.cnt */
+						900	/* Field: cntr8clk.cnt */
+						0	/* Field: cntr8clk.src */
+						900	/* Field: cntr9clk.cnt */
+						0	/* Field: emacctl.emac0sel */
+						0	/* Field: emacctl.emac1sel */
+						0	/* Field: emacctl.emac2sel */
+						32000	/* Field: gpiodiv.gpiodbclk */
+					>;
+				};
+
+				altera {
+					u-boot,dm-pre-reloc;
+				/*
+				 * Address Block: soc_clock_manager_OCP_SLV.
+				 * i_clk_mgr_alteragrp
+				 */
+					altr,of_reg_value = <
+						0x0384000b	/* Register: nocclk */
+						0x03840001	/* Register: mpuclk */
+					>;
+				};
+			};
+		};
+
+		/*
+		 * Driver: altera_arria10_soc_3v_io48_pin_mux_arria10_uboot_driver
+		 * Binding: pinmux
+		 */
+		i_io48_pin_mux: pinmux at 0xffd07000 {
+			u-boot,dm-pre-reloc;
+			#address-cells = <1>;
+			#size-cells = <1>;
+			compatible = "pinctrl-single";
+			reg = <0xffd07000 0x00000800>;
+			reg-names = "soc_3v_io48_pin_mux_OCP_SLV";
+
+			/*
+			 *	Address Block: soc_3v_io48_pin_mux_OCP_SLV.
+			 *					i_io48_pin_mux_shared_3v_io_grp
+			 */
+			shared {
+				u-boot,dm-pre-reloc;
+				reg = <0xffd07000 0x00000200>;
+				pinctrl-single,register-width = <32>;
+				pinctrl-single,function-mask = <0x0000000f>;
+				pinctrl-single,pins =
+					/* Reg: pinmux_shared_io_q1_1 */
+					<0x00000000 0x00000008>,
+					/* Reg: pinmux_shared_io_q1_2 */
+					<0x00000004 0x00000008>,
+					/* Reg: pinmux_shared_io_q1_3 */
+					<0x00000008 0x00000008>,
+					/* Reg: pinmux_shared_io_q1_4 */
+					<0x0000000c 0x00000008>,
+					/* Reg: pinmux_shared_io_q1_5 */
+					<0x00000010 0x00000008>,
+					/* Reg: pinmux_shared_io_q1_6 */
+					<0x00000014 0x00000008>,
+					/* Reg: pinmux_shared_io_q1_7 */
+					<0x00000018 0x00000008>,
+					/* Reg: pinmux_shared_io_q1_8 */
+					<0x0000001c 0x00000008>,
+					/* Reg: pinmux_shared_io_q1_9 */
+					<0x00000020 0x00000008>,
+					/* Reg: pinmux_shared_io_q1_10 */
+					<0x00000024 0x00000008>,
+					/* Reg: pinmux_shared_io_q1_11 */
+					<0x00000028 0x00000008>,
+					/* Reg: pinmux_shared_io_q1_12 */
+					<0x0000002c 0x00000008>,
+					/* Reg: pinmux_shared_io_q2_1 */
+					<0x00000030 0x00000004>,
+					/* Reg: pinmux_shared_io_q2_2 */
+					<0x00000034 0x00000004>,
+					/* Reg: pinmux_shared_io_q2_3 */
+					<0x00000038 0x00000004>,
+					/* Reg: pinmux_shared_io_q2_4 */
+					<0x0000003c 0x00000004>,
+					/* Reg: pinmux_shared_io_q2_5 */
+					<0x00000040 0x00000004>,
+					/* Reg: pinmux_shared_io_q2_6 */
+					<0x00000044 0x00000004>,
+					/* Reg: pinmux_shared_io_q2_7 */
+					<0x00000048 0x00000004>,
+					/* Reg: pinmux_shared_io_q2_8 */
+					<0x0000004c 0x00000004>,
+					/* Reg: pinmux_shared_io_q2_9 */
+					<0x00000050 0x00000004>,
+					/* Reg: pinmux_shared_io_q2_10 */
+					<0x00000054 0x00000004>,
+					/* Reg: pinmux_shared_io_q2_11 */
+					<0x00000058 0x00000004>,
+					/* Reg: pinmux_shared_io_q2_12 */
+					<0x0000005c 0x00000004>,
+					/* Reg: pinmux_shared_io_q3_1 */
+					<0x00000060 0x00000003>,
+					/* Reg: pinmux_shared_io_q3_2 */
+					<0x00000064 0x00000003>,
+					/* Reg: pinmux_shared_io_q3_3 */
+					<0x00000068 0x00000003>,
+					/* Reg: pinmux_shared_io_q3_4 */
+					<0x0000006c 0x00000003>,
+					/* Reg: pinmux_shared_io_q3_5 */
+					<0x00000070 0x00000003>,
+					/* Reg: pinmux_shared_io_q3_6 */
+					<0x00000074 0x0000000f>,
+					/* Reg: pinmux_shared_io_q3_7 */
+					<0x00000078 0x0000000a>,
+					/* Reg: pinmux_shared_io_q3_8 */
+					<0x0000007c 0x0000000a>,
+					/* Reg: pinmux_shared_io_q3_9 */
+					<0x00000080 0x0000000a>,
+					/* Reg: pinmux_shared_io_q3_10 */
+					<0x00000084 0x0000000a>,
+					/* Reg: pinmux_shared_io_q3_11 */
+					<0x00000088 0x00000001>,
+					/* Reg: pinmux_shared_io_q3_12 */
+					<0x0000008c 0x00000001>,
+					/* Reg: pinmux_shared_io_q4_1 */
+					<0x00000090 0x00000000>,
+					/* Reg: pinmux_shared_io_q4_2 */
+					<0x00000094 0x00000000>,
+					/* Reg: pinmux_shared_io_q4_3 */
+					<0x00000098 0x0000000f>,
+					/* Reg: pinmux_shared_io_q4_4 */
+					<0x0000009c 0x0000000c>,
+					/* Reg: pinmux_shared_io_q4_5 */
+					<0x000000a0 0x0000000f>,
+					/* Reg: pinmux_shared_io_q4_6 */
+					<0x000000a4 0x0000000f>,
+					/* Reg: pinmux_shared_io_q4_7 */
+					<0x000000a8 0x0000000a>,
+					/* Reg: pinmux_shared_io_q4_8 */
+					<0x000000ac 0x0000000a>,
+					/* Reg: pinmux_shared_io_q4_9 */
+					<0x000000b0 0x0000000c>,
+					/* Reg: pinmux_shared_io_q4_10 */
+					<0x000000b4 0x0000000c>,
+					/* Reg: pinmux_shared_io_q4_11 */
+					<0x000000b8 0x0000000c>,
+					/* Reg: pinmux_shared_io_q4_12 */
+					<0x000000bc 0x0000000c>;
+			};
+
+			/*
+			 *	Address Block: soc_3v_io48_pin_mux_OCP_SLV.
+			 *	i_io48_pin_mux_dedicated_io_grp
+			 */
+			dedicated {
+				u-boot,dm-pre-reloc;
+				reg = <0xffd07200 0x00000200>;
+				pinctrl-single,register-width = <32>;
+				pinctrl-single,function-mask = <0x0000000f>;
+				pinctrl-single,pins =
+					/* Reg: pinmux_dedicated_io_4 */
+					<0x0000000c 0x00000008>,
+					/* Reg: pinmux_dedicated_io_5 */
+					<0x00000010 0x00000008>,
+					/* Reg: pinmux_dedicated_io_6 */
+					<0x00000014 0x00000008>,
+					/* Regi: pinmux_dedicated_io_7 */
+					<0x00000018 0x00000008>,
+					/* Reg: pinmux_dedicated_io_8 */
+					<0x0000001c 0x00000008>,
+					/* Reg: pinmux_dedicated_io_9 */
+					<0x00000020 0x00000008>,
+					/* Reg: pinmux_dedicated_io_10 */
+					<0x00000024 0x0000000a>,
+					/* Reg: pinmux_dedicated_io_11 */
+					<0x00000028 0x0000000a>,
+					/* Reg: pinmux_dedicated_io_12 */
+					<0x0000002c 0x00000008>,
+					/* Reg: pinmux_dedicated_io_13 */
+					<0x00000030 0x00000008>,
+					/* Reg: pinmux_dedicated_io_14 */
+					<0x00000034 0x00000008>,
+					/* Reg: pinmux_dedicated_io_15 */
+					<0x00000038 0x00000008>,
+					/* Reg: pinmux_dedicated_io_16 */
+					<0x0000003c 0x0000000d>,
+					/* Reg: pinmux_dedicated_io_17 */
+					<0x00000040 0x0000000d>;
+			};
+
+			/*
+			 * Address Block: soc_3v_io48_pin_mux_OCP_SLV.
+			 * i_io48_pin_mux_dedicated_io_grp
+			 */
+			dedicated_cfg {
+				u-boot,dm-pre-reloc;
+				reg = <0xffd07200 0x00000200>;
+				pinctrl-single,register-width = <32>;
+				pinctrl-single,function-mask = <0x003f3f3f>;
+				pinctrl-single,pins =
+					/* Reg: cfg_dedicated_io_bank */
+					<0x00000100 0x00000101>,
+					/* Reg: cfg_dedicated_io_1 */
+					<0x00000104 0x000b080a>,
+					/* Reg: cfg_dedicated_io_2 */
+					<0x00000108 0x000b080a>,
+					/* Reg: cfg_dedicated_io_3 */
+					<0x0000010c 0x000b080a>,
+					/* Reg: cfg_dedicated_io_4 */
+					<0x00000110 0x000a282a>,
+					/* Reg: cfg_dedicated_io_5 */
+					<0x00000114 0x000a282a>,
+					/* Reg: cfg_dedicated_io_6 */
+					<0x00000118 0x0008282a>,
+					/* Reg: cfg_dedicated_io_7 */
+					<0x0000011c 0x000a282a>,
+					/* Reg: cfg_dedicated_io_8 */
+					<0x00000120 0x000a282a>,
+					/* Reg: cfg_dedicated_io_9 */
+					<0x00000124 0x000a282a>,
+					/* Reg: cfg_dedicated_io_10 */
+					<0x00000128 0x00090000>,
+					/* Reg: cfg_dedicated_io_11 */
+					<0x0000012c 0x00090000>,
+					/* Reg: cfg_dedicated_io_12 */
+					<0x00000130 0x000b282a>,
+					/* Reg: cfg_dedicated_io_13 */
+					<0x00000134 0x000b282a>,
+					/* Reg: cfg_dedicated_io_14 */
+					<0x00000138 0x000b282a>,
+					/* Reg: cfg_dedicated_io_15 */
+					<0x0000013c 0x000b282a>,
+					/* Reg: cfg_dedicated_io_16 */
+					<0x00000140 0x0008282a>,
+					/* Reg: cfg_dedicated_io_17 */
+					<0x00000144 0x000a282a>;
+			};
+
+			/*
+			 *	Address Block: soc_3v_io48_pin_mux_OCP_SLV.
+			 *	i_io48_pin_mux_fpga_interface_grp
+			 */
+			fpga {
+				u-boot,dm-pre-reloc;
+				reg = <0xffd07400 0x00000100>;
+				pinctrl-single,register-width = <32>;
+				pinctrl-single,function-mask = <0x00000001>;
+				pinctrl-single,pins =
+					/* Reg: pinmux_emac0_usefpga */
+					<0x00000000 0x00000000>,
+					/* Reg: pinmux_emac1_usefpga */
+					<0x00000004 0x00000000>,
+					/* Reg: pinmux_emac2_usefpga */
+					<0x00000008 0x00000000>,
+					/* Reg: pinmux_i2c0_usefpga */
+					<0x0000000c 0x00000000>,
+					/* Reg: pinmux_i2c1_usefpga */
+					<0x00000010 0x00000000>,
+					/* Reg: pinmux_i2c_emac0_usefpga */
+					<0x00000014 0x00000000>,
+					/* Reg: pinmux_i2c_emac1_usefpga */
+					<0x00000018 0x00000000>,
+					/* Reg: pinmux_i2c_emac2_usefpga */
+					<0x0000001c 0x00000000>,
+					/* Reg: pinmux_nand_usefpga */
+					<0x00000020 0x00000000>,
+					/* Reg: pinmux_qspi_usefpga */
+					<0x00000024 0x00000000>,
+					/* Reg: pinmux_sdmmc_usefpga */
+					<0x00000028 0x00000000>,
+					/* Reg: pinmux_spim0_usefpga */
+					<0x0000002c 0x00000000>,
+					/* Reg: pinmux_spim1_usefpga */
+					<0x00000030 0x00000000>,
+					/* Reg: pinmux_spis0_usefpga */
+					<0x00000034 0x00000000>,
+					/* Reg: pinmux_spis1_usefpga */
+					<0x00000038 0x00000000>,
+					/* Reg: pinmux_uart0_usefpga */
+					<0x0000003c 0x00000000>,
+					/* Reg: pinmux_uart1_usefpga */
+					<0x00000040 0x00000000>;
+			};
+		};
+
+		i_noc: noc at 0xffd10000 {
+			compatible = "altr,socfpga-a10-noc";
+			reg = <0xffd10000 0x00008000>;
+			reg-names = "mpu_m0";
+
+			firewall {
+				/*
+				 * Driver setting: altera_arria10_soc_noc_arria10_uboot_driver.
+				 *					I_NOC.mpu_m0.
+				 *					noc_fw_ddr_mpu_fpga2sdram_ddr_scr.
+				 *					mpuregion0addr.base
+				 * Driver setting: altera_arria10_soc_noc_arria10_uboot_driver.
+				 *					I_NOC.mpu_m0.
+				 *					noc_fw_ddr_mpu_fpga2sdram_ddr_scr.
+				 *					mpuregion0addr.limit
+				 */
+				altr,mpu0 = <0x00000000 0x0000ffff>;
+				/*
+				 * Driver setting: altera_arria10_soc_noc_arria10_uboot_driver.
+				 *					I_NOC.mpu_m0.noc_fw_ddr_l3_ddr_scr.
+				 *					hpsregion0addr.base
+				 * Driver setting: altera_arria10_soc_noc_arria10_uboot_driver.
+				 *					I_NOC.mpu_m0.noc_fw_ddr_l3_ddr_scr.
+				 *					hpsregion0addr.limit
+				 */
+				altr,l3-0 = <0x00000000 0x0000ffff>;
+				/*
+				 * Driver setting: altera_arria10_soc_noc_arria10_uboot_driver.
+				 * 					I_NOC.mpu_m0.
+				 *					noc_fw_ddr_mpu_fpga2sdram_ddr_scr.
+				 *					fpga2sdram0region0addr.base
+				 * Driver setting: altera_arria10_soc_noc_arria10_uboot_driver.
+				 *					I_NOC.mpu_m0.
+				 *					noc_fw_ddr_mpu_fpga2sdram_ddr_scr.
+				 *					fpga2sdram0region0addr.limit
+				 */
+				altr,fpga2sdram0-0 = <0x00000000 0x0000ffff>;
+				/*
+				 * Driver setting: altera_arria10_soc_noc_arria10_uboot_driver.
+				 *					I_NOC.mpu_m0.
+				 *					noc_fw_ddr_mpu_fpga2sdram_ddr_scr.
+				 *					fpga2sdram1region0addr.base
+				 * Driver setting: altera_arria10_soc_noc_arria10_uboot_driver.
+				 *					I_NOC.mpu_m0.
+				 *					noc_fw_ddr_mpu_fpga2sdram_ddr_scr.
+				 *					fpga2sdram1region0addr.limit
+				 */
+				altr,fpga2sdram1-0 = <0x00000000 0x0000ffff>;
+				/*
+				 * Driver setting: altera_arria10_soc_noc_arria10_uboot_driver.
+				 *					I_NOC.mpu_m0.
+				 *					noc_fw_ddr_mpu_fpga2sdram_ddr_scr.
+				 *					fpga2sdram2region0addr.base
+				 * Driver setting: altera_arria10_soc_noc_arria10_uboot_driver.
+				 *					I_NOC.mpu_m0.
+				 *					noc_fw_ddr_mpu_fpga2sdram_ddr_scr.
+				 *					fpga2sdram2region0addr.limit
+				 */
+				altr,fpga2sdram2-0 = <0x00000000 0x0000ffff>;
+			};
+		};
+
+		hps_fpgabridge0: fpgabridge at 0 {
+			compatible = "altr,socfpga-hps2fpga-bridge";
+			altr,init-val = <1>;
+		};
+
+		hps_fpgabridge1: fpgabridge at 1 {
+			compatible = "altr,socfpga-lwhps2fpga-bridge";
+			altr,init-val = <1>;
+		};
+
+		hps_fpgabridge2: fpgabridge at 2 {
+			compatible = "altr,socfpga-fpga2hps-bridge";
+			altr,init-val = <1>;
+		};
+
+		hps_fpgabridge3: fpgabridge at 3 {
+			compatible = "altr,socfpga-fpga2sdram0-bridge";
+			altr,init-val = <1>;
+		};
+
+		hps_fpgabridge4: fpgabridge at 4 {
+			compatible = "altr,socfpga-fpga2sdram1-bridge";
+			altr,init-val = <0>;
+		};
+
+		hps_fpgabridge5: fpgabridge at 5 {
+			compatible = "altr,socfpga-fpga2sdram2-bridge";
+			altr,init-val = <1>;
+		};
+	};
+};
-- 
1.8.2.3

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 15/20] arm: socfpga: Add SPL support for Arria 10
  2017-03-09  0:26 [U-Boot] [PATCH v2 00/20] Add Intel Arria 10 SoC support Ley Foon Tan
                   ` (13 preceding siblings ...)
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 14/20] arm: dts: Add dts and dtsi " Ley Foon Tan
@ 2017-03-09  0:26 ` Ley Foon Tan
  2017-03-10  1:52   ` Marek Vasut
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 16/20] drivers: fpga: Add compile switch for Gen5 only registers Ley Foon Tan
                   ` (6 subsequent siblings)
  21 siblings, 1 reply; 60+ messages in thread
From: Ley Foon Tan @ 2017-03-09  0:26 UTC (permalink / raw)
  To: u-boot

Add SPL support for Arria 10 and add reset_uart() to use in SPL.

Signed-off-by: Tien Fong Chee <tien.fong.chee@intel.com>
Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
---
 .../include/mach/reset_manager_arria10.h           |  1 +
 arch/arm/mach-socfpga/reset_manager_arria10.c      | 18 +++++++
 arch/arm/mach-socfpga/spl.c                        | 55 +++++++++++++++++++++-
 3 files changed, 72 insertions(+), 2 deletions(-)

diff --git a/arch/arm/mach-socfpga/include/mach/reset_manager_arria10.h b/arch/arm/mach-socfpga/include/mach/reset_manager_arria10.h
index e3171d1..d0711cf 100644
--- a/arch/arm/mach-socfpga/include/mach/reset_manager_arria10.h
+++ b/arch/arm/mach-socfpga/include/mach/reset_manager_arria10.h
@@ -14,6 +14,7 @@ void emac_manage_reset(ulong emacbase, uint state);
 int reset_deassert_bridges_handoff(void);
 void reset_assert_fpga_connected_peripherals(void);
 void reset_deassert_osc1wd0(void);
+void reset_uart(int assert);
 
 struct socfpga_reset_manager {
 	u32	stat;
diff --git a/arch/arm/mach-socfpga/reset_manager_arria10.c b/arch/arm/mach-socfpga/reset_manager_arria10.c
index 547a8bb..bbf54f0 100644
--- a/arch/arm/mach-socfpga/reset_manager_arria10.c
+++ b/arch/arm/mach-socfpga/reset_manager_arria10.c
@@ -28,6 +28,24 @@ static const struct socfpga_system_manager *sysmgr_regs =
 	ALT_RSTMGR_PER0MODRST_QSPIECC_SET_MSK | \
 	ALT_RSTMGR_PER0MODRST_SDMMCECC_SET_MSK)
 
+void reset_uart(int assert)
+{
+	u32 mask = 0;
+	unsigned int com_port;
+
+	com_port = uart_com_port(gd->fdt_blob);
+
+	if (com_port == SOCFPGA_UART1_ADDRESS)
+		mask |= ALT_RSTMGR_PER1MODRST_UART1_SET_MSK;
+	else if (com_port == SOCFPGA_UART0_ADDRESS)
+		mask |= ALT_RSTMGR_PER1MODRST_UART0_SET_MSK;
+
+	if (assert)
+		setbits_le32(&reset_manager_base->per1modrst, mask);
+	else
+		clrbits_le32(&reset_manager_base->per1modrst, mask);
+}
+
 static const u32 per0fpgamasks[] = {
 	ALT_RSTMGR_PER0MODRST_EMACECC0_SET_MSK |
 	ALT_RSTMGR_PER0MODRST_EMAC0_SET_MSK,
diff --git a/arch/arm/mach-socfpga/spl.c b/arch/arm/mach-socfpga/spl.c
index fec4c7a..5c0cc98 100644
--- a/arch/arm/mach-socfpga/spl.c
+++ b/arch/arm/mach-socfpga/spl.c
@@ -19,23 +19,32 @@
 #include <asm/arch/sdram.h>
 #include <asm/arch/scu.h>
 #include <asm/arch/nic301.h>
+#include <asm/sections.h>
+#include <fdtdec.h>
+#include <watchdog.h>
+#if defined(CONFIG_TARGET_SOCFPGA_ARRIA10)
+#include <asm/arch/pinmux.h>
+#endif
 
 DECLARE_GLOBAL_DATA_PTR;
 
+#if defined(CONFIG_TARGET_SOCFPGA_GEN5)
 static struct pl310_regs *const pl310 =
 	(struct pl310_regs *)CONFIG_SYS_PL310_BASE;
 static struct scu_registers *scu_regs =
 	(struct scu_registers *)SOCFPGA_MPUSCU_ADDRESS;
 static struct nic301_registers *nic301_regs =
 	(struct nic301_registers *)SOCFPGA_L3REGS_ADDRESS;
-static struct socfpga_system_manager *sysmgr_regs =
+#endif
+
+static const struct socfpga_system_manager *sysmgr_regs =
 	(struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS;
 
 u32 spl_boot_device(void)
 {
 	const u32 bsel = readl(&sysmgr_regs->bootinfo);
 
-	switch (bsel & 0x7) {
+	switch ((bsel >> SYSMGR_BOOTINFO_BSEL_SHIFT) & 0x7) {
 	case 0x1:	/* FPGA (HPS2FPGA Bridge) */
 		return BOOT_DEVICE_RAM;
 	case 0x2:	/* NAND Flash (1.8V) */
@@ -68,6 +77,7 @@ u32 spl_boot_mode(const u32 boot_device)
 }
 #endif
 
+#if defined(CONFIG_TARGET_SOCFPGA_GEN5)
 static void socfpga_nic301_slave_ns(void)
 {
 	writel(0x1, &nic301_regs->lwhps2fpgaregs);
@@ -182,3 +192,44 @@ void board_init_f(ulong dummy)
 	/* Configure simple malloc base pointer into RAM. */
 	gd->malloc_base = CONFIG_SYS_TEXT_BASE + (1024 * 1024);
 }
+#elif defined(CONFIG_TARGET_SOCFPGA_ARRIA10)
+#ifdef CONFIG_SPL_BOARD_INIT
+void spl_board_init(void)
+{
+	/* configuring the clock based on handoff */
+	cm_basic_init(gd->fdt_blob);
+	WATCHDOG_RESET();
+
+	config_dedicated_pins(gd->fdt_blob);
+	WATCHDOG_RESET();
+
+	/* Release UART from reset */
+	reset_uart(0);
+
+	/* enable console uart printing */
+	preloader_console_init();
+}
+#endif
+
+void board_init_f(ulong dummy)
+{
+	/*
+	 * Configure Clock Manager to use intosc clock instead external osc to
+	 * ensure success watchdog operation. We do it as early as possible.
+	 */
+	cm_use_intosc();
+
+	watchdog_disable();
+
+	arch_early_init_r();
+
+#ifdef CONFIG_HW_WATCHDOG
+	/* release osc1 watchdog timer 0 from reset */
+	reset_deassert_osc1wd0();
+
+	/* reconfigure and enable the watchdog */
+	hw_watchdog_init();
+	WATCHDOG_RESET();
+#endif /* CONFIG_HW_WATCHDOG */
+}
+#endif
-- 
1.8.2.3

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 16/20] drivers: fpga: Add compile switch for Gen5 only registers
  2017-03-09  0:26 [U-Boot] [PATCH v2 00/20] Add Intel Arria 10 SoC support Ley Foon Tan
                   ` (14 preceding siblings ...)
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 15/20] arm: socfpga: Add SPL support " Ley Foon Tan
@ 2017-03-09  0:26 ` Ley Foon Tan
  2017-03-10  1:53   ` Marek Vasut
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 17/20] arm: socfpga: Convert Altera ddr driver to use Kconfig Ley Foon Tan
                   ` (5 subsequent siblings)
  21 siblings, 1 reply; 60+ messages in thread
From: Ley Foon Tan @ 2017-03-09  0:26 UTC (permalink / raw)
  To: u-boot

These registers only available for Gen5 device, excludes them
if for Arria 10 build.

Signed-off-by: Tien Fong Chee <tien.fong.chee@intel.com>
Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
---
 drivers/fpga/socfpga.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/drivers/fpga/socfpga.c b/drivers/fpga/socfpga.c
index f1b2f2c..3751574 100644
--- a/drivers/fpga/socfpga.c
+++ b/drivers/fpga/socfpga.c
@@ -19,8 +19,10 @@ DECLARE_GLOBAL_DATA_PTR;
 
 static struct socfpga_fpga_manager *fpgamgr_regs =
 	(struct socfpga_fpga_manager *)SOCFPGA_FPGAMGRREGS_ADDRESS;
+#if defined(CONFIG_TARGET_SOCFPGA_GEN5)
 static struct socfpga_system_manager *sysmgr_regs =
 	(struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS;
+#endif
 
 /* Set CD ratio */
 static void fpgamgr_set_cd_ratio(unsigned long ratio)
@@ -268,8 +270,10 @@ int socfpga_load(Altera_desc *desc, const void *rbf_data, size_t rbf_size)
 
 	/* Prior programming the FPGA, all bridges need to be shut off */
 
+#if defined(CONFIG_TARGET_SOCFPGA_GEN5)
 	/* Disable all signals from hps peripheral controller to fpga */
 	writel(0, &sysmgr_regs->fpgaintfgrp_module);
+#endif
 
 	/* Disable all signals from FPGA to HPS SDRAM */
 #define SDR_CTRLGRP_FPGAPORTRST_ADDRESS	0x5080
@@ -278,8 +282,10 @@ int socfpga_load(Altera_desc *desc, const void *rbf_data, size_t rbf_size)
 	/* Disable all axi bridge (hps2fpga, lwhps2fpga & fpga2hps) */
 	socfpga_bridges_reset(1);
 
+#if defined(CONFIG_TARGET_SOCFPGA_GEN5)
 	/* Unmap the bridges from NIC-301 */
 	writel(0x1, SOCFPGA_L3REGS_ADDRESS);
+#endif
 
 	/* Initialize the FPGA Manager */
 	status = fpgamgr_program_init();
-- 
1.8.2.3

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 17/20] arm: socfpga: Convert Altera ddr driver to use Kconfig
  2017-03-09  0:26 [U-Boot] [PATCH v2 00/20] Add Intel Arria 10 SoC support Ley Foon Tan
                   ` (15 preceding siblings ...)
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 16/20] drivers: fpga: Add compile switch for Gen5 only registers Ley Foon Tan
@ 2017-03-09  0:26 ` Ley Foon Tan
  2017-03-10  1:53   ` Marek Vasut
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 18/20] arm: socfpga: Add config and defconfig for Arria 10 Ley Foon Tan
                   ` (4 subsequent siblings)
  21 siblings, 1 reply; 60+ messages in thread
From: Ley Foon Tan @ 2017-03-09  0:26 UTC (permalink / raw)
  To: u-boot

Convert Altera ddr driver to use Kconfig method. Enable ALTERA_SDRAM
by default if it is on Gen5 target. Arria 10 will have different driver.

Signed-off-by: Tien Fong Chee <tien.fong.chee@intel.com>
Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
---
 drivers/Kconfig                  | 2 ++
 drivers/ddr/Kconfig              | 1 +
 drivers/ddr/altera/Kconfig       | 6 ++++++
 include/configs/socfpga_common.h | 5 -----
 4 files changed, 9 insertions(+), 5 deletions(-)
 create mode 100644 drivers/ddr/Kconfig
 create mode 100644 drivers/ddr/altera/Kconfig

diff --git a/drivers/Kconfig b/drivers/Kconfig
index 0e5d97d..3e6bbac 100644
--- a/drivers/Kconfig
+++ b/drivers/Kconfig
@@ -14,6 +14,8 @@ source "drivers/cpu/Kconfig"
 
 source "drivers/crypto/Kconfig"
 
+source "drivers/ddr/Kconfig"
+
 source "drivers/demo/Kconfig"
 
 source "drivers/ddr/fsl/Kconfig"
diff --git a/drivers/ddr/Kconfig b/drivers/ddr/Kconfig
new file mode 100644
index 0000000..b764add
--- /dev/null
+++ b/drivers/ddr/Kconfig
@@ -0,0 +1 @@
+source "drivers/ddr/altera/Kconfig"
diff --git a/drivers/ddr/altera/Kconfig b/drivers/ddr/altera/Kconfig
new file mode 100644
index 0000000..9554da7
--- /dev/null
+++ b/drivers/ddr/altera/Kconfig
@@ -0,0 +1,6 @@
+config ALTERA_SDRAM
+	bool "SoCFPGA SDRAM for Arria5/Cyclone5 devices"
+	default y if TARGET_SOCFPGA_GEN5
+	help
+	  This is for building the SDRAM controller for the Arria5/Cyclone5
+	  devices.
diff --git a/include/configs/socfpga_common.h b/include/configs/socfpga_common.h
index 55e0bf9..bc92a2c 100644
--- a/include/configs/socfpga_common.h
+++ b/include/configs/socfpga_common.h
@@ -77,11 +77,6 @@
 #define CONFIG_SYS_PL310_BASE		SOCFPGA_MPUL2_ADDRESS
 
 /*
- * SDRAM controller
- */
-#define CONFIG_ALTERA_SDRAM
-
-/*
  * EPCS/EPCQx1 Serial Flash Controller
  */
 #ifdef CONFIG_ALTERA_SPI
-- 
1.8.2.3

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 18/20] arm: socfpga: Add config and defconfig for Arria 10
  2017-03-09  0:26 [U-Boot] [PATCH v2 00/20] Add Intel Arria 10 SoC support Ley Foon Tan
                   ` (16 preceding siblings ...)
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 17/20] arm: socfpga: Convert Altera ddr driver to use Kconfig Ley Foon Tan
@ 2017-03-09  0:26 ` Ley Foon Tan
  2017-03-10  1:55   ` Marek Vasut
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 19/20] arm: socfpga: Add board files for the Arria10 Ley Foon Tan
                   ` (3 subsequent siblings)
  21 siblings, 1 reply; 60+ messages in thread
From: Ley Foon Tan @ 2017-03-09  0:26 UTC (permalink / raw)
  To: u-boot

Add config and defconfig for the Arria10 and update socfpga_common.h.

Signed-off-by: Tien Fong Chee <tien.fong.chee@intel.com>
Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
---
 configs/socfpga_arria10_defconfig       | 30 +++++++++++++++
 include/configs/socfpga_arria10_socdk.h | 67 +++++++++++++++++++++++++++++++++
 include/configs/socfpga_common.h        | 28 ++++++++++++--
 3 files changed, 121 insertions(+), 4 deletions(-)
 create mode 100644 configs/socfpga_arria10_defconfig
 create mode 100644 include/configs/socfpga_arria10_socdk.h

diff --git a/configs/socfpga_arria10_defconfig b/configs/socfpga_arria10_defconfig
new file mode 100644
index 0000000..9e6bc1e0
--- /dev/null
+++ b/configs/socfpga_arria10_defconfig
@@ -0,0 +1,30 @@
+CONFIG_ARM=y
+CONFIG_ARCH_SOCFPGA=y
+CONFIG_SYS_MALLOC_F_LEN=0x2000
+CONFIG_TARGET_SOCFPGA_ARRIA10_SOCDK=y
+CONFIG_IDENT_STRING="socfpga_arria10"
+CONFIG_DEFAULT_DEVICE_TREE="socfpga_arria10_socdk_sdmmc"
+CONFIG_DEFAULT_FDT_FILE="socfpga_arria10_socdk_sdmmc.dtb"
+CONFIG_SPL=y
+CONFIG_CMD_BOOTZ=y
+# CONFIG_CMD_IMLS is not set
+CONFIG_CMD_ASKENV=y
+CONFIG_CMD_GREPENV=y
+# CONFIG_CMD_FLASH is not set
+CONFIG_CMD_MMC=y
+CONFIG_CMD_GPIO=y
+CONFIG_CMD_PING=y
+CONFIG_CMD_CACHE=y
+CONFIG_CMD_EXT4=y
+CONFIG_CMD_EXT4_WRITE=y
+CONFIG_DOS_PARTITION=y
+# CONFIG_SPL_DOS_PARTITION is not set
+CONFIG_SPL_DM=y
+CONFIG_SPL_DM_SEQ_ALIAS=y
+CONFIG_DM_GPIO=y
+CONFIG_DWAPB_GPIO=y
+CONFIG_DM_MMC=y
+CONFIG_SYS_NS16550=y
+CONFIG_USE_TINY_PRINTF=y
+CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION_TYPE=y
+CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION_TYPE=0xa2
diff --git a/include/configs/socfpga_arria10_socdk.h b/include/configs/socfpga_arria10_socdk.h
new file mode 100644
index 0000000..5b7d572
--- /dev/null
+++ b/include/configs/socfpga_arria10_socdk.h
@@ -0,0 +1,67 @@
+/*
+ *  Copyright (C) 2015-2017 Altera Corporation <www.altera.com>
+ *
+ * SPDX-License-Identifier:	GPL-2.0
+ */
+
+#ifndef __CONFIG_SOCFGPA_ARRIA10_H__
+#define __CONFIG_SOCFGPA_ARRIA10_H__
+
+#include <asm/arch/base_addr_a10.h>
+/* U-Boot Commands */
+#define CONFIG_FAT_WRITE
+#define CONFIG_HW_WATCHDOG
+
+
+/* Booting Linux */
+#define CONFIG_LOADADDR		0x01000000
+#define CONFIG_SYS_LOAD_ADDR	CONFIG_LOADADDR
+
+/*
+ * U-Boot general configurations
+ */
+/* Cache options */
+#define CONFIG_SYS_DCACHE_OFF
+
+/* Memory configurations  */
+#define PHYS_SDRAM_1_SIZE		0x80000000
+
+/* Ethernet on SoC (EMAC) */
+#if defined(CONFIG_CMD_NET)
+#define CONFIG_PHY_MICREL
+#define CONFIG_PHY_MICREL_KSZ9031
+#endif
+
+/*
+ * U-Boot environment configurations
+ */
+#define CONFIG_ENV_IS_IN_MMC
+
+/*
+ * arguments passed to the bootz command. The value of
+ * CONFIG_BOOTARGS goes into the environment value "bootargs".
+ * Do note the value will overide also the chosen node in FDT blob.
+ */
+#define CONFIG_BOOTARGS "console=ttyS0," __stringify(CONFIG_BAUDRATE)
+
+/*
+ * Serial / UART configurations
+ */
+#define CONFIG_SYS_NS16550_MEM32
+#define CONFIG_SYS_BAUDRATE_TABLE {4800, 9600, 19200, 38400, 57600, 115200}
+
+/*
+ * L4 OSC1 Timer 0
+ */
+/* reload value when timer count to zero */
+#define TIMER_LOAD_VAL			0xFFFFFFFF
+
+/*
+ * Flash configurations
+ */
+#define CONFIG_SYS_MAX_FLASH_BANKS     1
+
+/* The rest of the configuration is shared */
+#include <configs/socfpga_common.h>
+
+#endif	/* __CONFIG_SOCFGPA_ARRIA10_H__ */
diff --git a/include/configs/socfpga_common.h b/include/configs/socfpga_common.h
index bc92a2c..a228ea5 100644
--- a/include/configs/socfpga_common.h
+++ b/include/configs/socfpga_common.h
@@ -34,9 +34,13 @@
 #define CONFIG_SYS_MALLOC_LEN		(64 * 1024 * 1024)
 #define CONFIG_SYS_MEMTEST_START	PHYS_SDRAM_1
 #define CONFIG_SYS_MEMTEST_END		PHYS_SDRAM_1_SIZE
-
+#if defined(CONFIG_TARGET_SOCFPGA_GEN5)
 #define CONFIG_SYS_INIT_RAM_ADDR	0xFFFF0000
 #define CONFIG_SYS_INIT_RAM_SIZE	0x10000
+#elif defined(CONFIG_TARGET_SOCFPGA_ARRIA10)
+#define CONFIG_SYS_INIT_RAM_ADDR	0xFFE00000
+#define CONFIG_SYS_INIT_RAM_SIZE	0x40000 /* 256KB */
+#endif
 #define CONFIG_SYS_INIT_SP_OFFSET		\
 	(CONFIG_SYS_INIT_RAM_SIZE - GENERATED_GBL_DATA_SIZE)
 #define CONFIG_SYS_INIT_SP_ADDR			\
@@ -67,8 +71,10 @@
 #define CONFIG_SYS_HOSTNAME	CONFIG_SYS_BOARD
 #endif
 
+#if defined(CONFIG_TARGET_SOCFPGA_GEN5)
 #define CONFIG_CMD_PXE
 #define CONFIG_MENU
+#endif
 
 /*
  * Cache
@@ -103,13 +109,14 @@
 /*
  * FPGA Driver
  */
+#ifdef CONFIG_TARGET_SOCFPGA_GEN5
 #ifdef CONFIG_CMD_FPGA
 #define CONFIG_FPGA
 #define CONFIG_FPGA_ALTERA
 #define CONFIG_FPGA_SOCFPGA
 #define CONFIG_FPGA_COUNT		1
 #endif
-
+#endif
 /*
  * L4 OSC1 Timer 0
  */
@@ -209,11 +216,14 @@ unsigned int cm_get_qspi_controller_clk_hz(void);
  */
 #define CONFIG_SYS_NS16550_SERIAL
 #define CONFIG_SYS_NS16550_REG_SIZE	-4
-#define CONFIG_SYS_NS16550_COM1		SOCFPGA_UART0_ADDRESS
 #ifdef CONFIG_SOCFPGA_VIRTUAL_TARGET
 #define CONFIG_SYS_NS16550_CLK		1000000
-#else
+#elif defined(CONFIG_TARGET_SOCFPGA_GEN5)
+#define CONFIG_SYS_NS16550_COM1		SOCFPGA_UART0_ADDRESS
 #define CONFIG_SYS_NS16550_CLK		100000000
+#elif defined(CONFIG_TARGET_SOCFPGA_ARRIA10)
+#define CONFIG_SYS_NS16550_COM1        SOCFPGA_UART1_ADDRESS
+#define CONFIG_SYS_NS16550_CLK		50000000
 #endif
 #define CONFIG_CONS_INDEX		1
 #define CONFIG_BAUDRATE			115200
@@ -301,7 +311,12 @@ unsigned int cm_get_qspi_controller_clk_hz(void);
  */
 #define CONFIG_SPL_FRAMEWORK
 #define CONFIG_SPL_TEXT_BASE		CONFIG_SYS_INIT_RAM_ADDR
+#if defined(CONFIG_TARGET_SOCFPGA_GEN5)
 #define CONFIG_SPL_MAX_SIZE		(64 * 1024)
+#elif defined(CONFIG_TARGET_SOCFPGA_ARRIA10)
+#define CONFIG_SPL_MAX_SIZE		CONFIG_SYS_INIT_RAM_SIZE
+#define CONFIG_SPL_BOARD_INIT
+#endif
 
 /* SPL SDMMC boot support */
 #ifdef CONFIG_SPL_MMC_SUPPORT
@@ -349,10 +364,15 @@ unsigned int cm_get_qspi_controller_clk_hz(void);
 #define BOOT_TARGET_DEVICES_MMC(func)
 #endif
 
+#if defined(CONFIG_TARGET_SOCFPGA_GEN5)
 #define BOOT_TARGET_DEVICES(func) \
 	BOOT_TARGET_DEVICES_MMC(func) \
 	BOOT_TARGET_DEVICES_PXE(func) \
 	func(DHCP, dhcp, na)
+#elif defined(CONFIG_TARGET_SOCFPGA_ARRIA10)
+#define BOOT_TARGET_DEVICES(func) \
+	BOOT_TARGET_DEVICES_MMC(func)
+#endif
 
 #include <config_distro_bootcmd.h>
 
-- 
1.8.2.3

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 19/20] arm: socfpga: Add board files for the Arria10
  2017-03-09  0:26 [U-Boot] [PATCH v2 00/20] Add Intel Arria 10 SoC support Ley Foon Tan
                   ` (17 preceding siblings ...)
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 18/20] arm: socfpga: Add config and defconfig for Arria 10 Ley Foon Tan
@ 2017-03-09  0:26 ` Ley Foon Tan
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 20/20] arm: socfpga: Enable build for Arria 10 Ley Foon Tan
                   ` (2 subsequent siblings)
  21 siblings, 0 replies; 60+ messages in thread
From: Ley Foon Tan @ 2017-03-09  0:26 UTC (permalink / raw)
  To: u-boot

Add support for the Arria10 SoCDK.

Signed-off-by: Tien Fong Chee <tien.fong.chee@intel.com>
Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
---
 board/altera/arria10-socdk/Kconfig   | 18 ++++++++++++++++++
 board/altera/arria10-socdk/Makefile  |  7 +++++++
 board/altera/arria10-socdk/socfpga.c |  7 +++++++
 3 files changed, 32 insertions(+)
 create mode 100644 board/altera/arria10-socdk/Kconfig
 create mode 100644 board/altera/arria10-socdk/Makefile
 create mode 100644 board/altera/arria10-socdk/socfpga.c

diff --git a/board/altera/arria10-socdk/Kconfig b/board/altera/arria10-socdk/Kconfig
new file mode 100644
index 0000000..b80cc6d
--- /dev/null
+++ b/board/altera/arria10-socdk/Kconfig
@@ -0,0 +1,18 @@
+if TARGET_SOCFPGA_ARRIA10
+
+config SYS_CPU
+	default "armv7"
+
+config SYS_BOARD
+	default "socfpga_arria10"
+
+config SYS_VENDOR
+	default "altera"
+
+config SYS_SOC
+	default "socfpga_arria10"
+
+config SYS_CONFIG_NAME
+	default "socfpga_arria10"
+
+endif
diff --git a/board/altera/arria10-socdk/Makefile b/board/altera/arria10-socdk/Makefile
new file mode 100644
index 0000000..1d885ce
--- /dev/null
+++ b/board/altera/arria10-socdk/Makefile
@@ -0,0 +1,7 @@
+#
+# Copyright (C) 2015 Altera Corporation <www.altera.com>
+#
+# SPDX-License-Identifier:	GPL-2.0
+#
+
+obj-y	:= socfpga.o
diff --git a/board/altera/arria10-socdk/socfpga.c b/board/altera/arria10-socdk/socfpga.c
new file mode 100644
index 0000000..8516633
--- /dev/null
+++ b/board/altera/arria10-socdk/socfpga.c
@@ -0,0 +1,7 @@
+/*
+ * Copyright (C) 2015 Altera Corporation <www.altera.com>
+ *
+ * SPDX-License-Identifier:	GPL-2.0
+ */
+
+#include <common.h>
-- 
1.8.2.3

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 20/20] arm: socfpga: Enable build for Arria 10
  2017-03-09  0:26 [U-Boot] [PATCH v2 00/20] Add Intel Arria 10 SoC support Ley Foon Tan
                   ` (18 preceding siblings ...)
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 19/20] arm: socfpga: Add board files for the Arria10 Ley Foon Tan
@ 2017-03-09  0:26 ` Ley Foon Tan
  2017-03-09 21:32 ` [U-Boot] [PATCH v2 00/20] Add Intel Arria 10 SoC support Dinh Nguyen
  2017-03-16 21:56 ` Marek Vasut
  21 siblings, 0 replies; 60+ messages in thread
From: Ley Foon Tan @ 2017-03-09  0:26 UTC (permalink / raw)
  To: u-boot

Update Kconfig and Makefile to enable Arria 10.
Clean up Makefile and sorting *.o alphanumerically.

Signed-off-by: Tien Fong Chee <tien.fong.chee@intel.com>
Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
---
 arch/arm/mach-socfpga/Kconfig  | 10 +++++++++
 arch/arm/mach-socfpga/Makefile | 46 ++++++++++++++++++++++++++++++------------
 2 files changed, 43 insertions(+), 13 deletions(-)

diff --git a/arch/arm/mach-socfpga/Kconfig b/arch/arm/mach-socfpga/Kconfig
index e56b3db..ee98a44 100644
--- a/arch/arm/mach-socfpga/Kconfig
+++ b/arch/arm/mach-socfpga/Kconfig
@@ -37,6 +37,9 @@ config TARGET_SOCFPGA_ARRIA5
 	bool
 	select TARGET_SOCFPGA_GEN5
 
+config TARGET_SOCFPGA_ARRIA10
+	bool
+
 config TARGET_SOCFPGA_CYCLONE5
 	bool
 	select TARGET_SOCFPGA_GEN5
@@ -48,6 +51,10 @@ choice
 	prompt "Altera SOCFPGA board select"
 	optional
 
+config TARGET_SOCFPGA_ARRIA10_SOCDK
+	bool "Altera SOCFPGA SoCDK (Arria 10)"
+	select TARGET_SOCFPGA_ARRIA10
+
 config TARGET_SOCFPGA_ARRIA5_SOCDK
 	bool "Altera SOCFPGA SoCDK (Arria V)"
 	select TARGET_SOCFPGA_ARRIA5
@@ -93,6 +100,7 @@ endchoice
 
 config SYS_BOARD
 	default "arria5-socdk" if TARGET_SOCFPGA_ARRIA5_SOCDK
+	default "arria10-socdk" if TARGET_SOCFPGA_ARRIA10_SOCDK
 	default "cyclone5-socdk" if TARGET_SOCFPGA_CYCLONE5_SOCDK
 	default "de0-nano-soc" if TARGET_SOCFPGA_TERASIC_DE0_NANO
 	default "de1-soc" if TARGET_SOCFPGA_TERASIC_DE1_SOC
@@ -105,6 +113,7 @@ config SYS_BOARD
 
 config SYS_VENDOR
 	default "altera" if TARGET_SOCFPGA_ARRIA5_SOCDK
+	default "altera" if TARGET_SOCFPGA_ARRIA10_SOCDK
 	default "altera" if TARGET_SOCFPGA_CYCLONE5_SOCDK
 	default "denx" if TARGET_SOCFPGA_DENX_MCVEVK
 	default "ebv" if TARGET_SOCFPGA_EBV_SOCRATES
@@ -118,6 +127,7 @@ config SYS_SOC
 
 config SYS_CONFIG_NAME
 	default "socfpga_arria5_socdk" if TARGET_SOCFPGA_ARRIA5_SOCDK
+	default "socfpga_arria10_socdk" if TARGET_SOCFPGA_ARRIA10_SOCDK
 	default "socfpga_cyclone5_socdk" if TARGET_SOCFPGA_CYCLONE5_SOCDK
 	default "socfpga_de0_nano_soc" if TARGET_SOCFPGA_TERASIC_DE0_NANO
 	default "socfpga_de1_soc" if TARGET_SOCFPGA_TERASIC_DE1_SOC
diff --git a/arch/arm/mach-socfpga/Makefile b/arch/arm/mach-socfpga/Makefile
index 68d55e4..41b779c 100644
--- a/arch/arm/mach-socfpga/Makefile
+++ b/arch/arm/mach-socfpga/Makefile
@@ -2,28 +2,48 @@
 # (C) Copyright 2000-2003
 # Wolfgang Denk, DENX Software Engineering, wd at denx.de.
 #
-# Copyright (C) 2012 Altera Corporation <www.altera.com>
+# Copyright (C) 2012-2017 Altera Corporation <www.altera.com>
 #
 # SPDX-License-Identifier:	GPL-2.0+
 #
 
-obj-y	+= misc.o timer.o reset_manager.o clock_manager.o \
-	   fpga_manager.o board.o
+obj-y	+= board.o
+obj-y	+= clock_manager.o
+obj-y	+= fpga_manager.o
+obj-y	+= misc.o
+obj-y	+= reset_manager.o
+obj-y	+= timer.o
 
-obj-$(CONFIG_TARGET_SOCFPGA_ARRIA10) += clock_manager_arria10.o \
-					misc_arria10.o		\
-					pinmux_arria10.o	\
-					reset_manager_arria10.o
+ifdef CONFIG_TARGET_SOCFPGA_GEN5
+obj-y	+= clock_manager_gen5.o
+obj-y	+= misc_gen5.o
+obj-y	+= reset_manager_gen5.o
+obj-y	+= scan_manager.o
+obj-y	+= system_manager_gen5.o
+obj-y	+= wrap_pll_config.o
+endif
 
-obj-$(CONFIG_SPL_BUILD) += spl.o freeze_controller.o
+ifdef CONFIG_TARGET_SOCFPGA_ARRIA10
+obj-y	+= clock_manager_arria10.o
+obj-y	+= misc_arria10.o
+obj-y	+= pinmux_arria10.o
+obj-y	+= reset_manager_arria10.o
+endif
 
+ifdef CONFIG_SPL_BUILD
+obj-y	+= spl.o
+ifdef CONFIG_TARGET_SOCFPGA_GEN5
+obj-y	+= freeze_controller.o
+obj-y	+= wrap_iocsr_config.o
+obj-y	+= wrap_pinmux_config.o
+obj-y	+= wrap_sdram_config.o
+endif
+endif
+
+ifdef CONFIG_TARGET_SOCFPGA_GEN5
 # QTS-generated config file wrappers
-obj-$(CONFIG_TARGET_SOCFPGA_GEN5)	+= scan_manager.o wrap_pll_config.o \
-					   clock_manager_gen5.o reset_manager_gen5.o \
-					   misc_gen5.o system_manager_gen5.o
-obj-$(CONFIG_SPL_BUILD) += wrap_iocsr_config.o wrap_pinmux_config.o	\
-			   wrap_sdram_config.o
 CFLAGS_wrap_iocsr_config.o	+= -I$(srctree)/board/$(BOARDDIR)
 CFLAGS_wrap_pinmux_config.o	+= -I$(srctree)/board/$(BOARDDIR)
 CFLAGS_wrap_pll_config.o	+= -I$(srctree)/board/$(BOARDDIR)
 CFLAGS_wrap_sdram_config.o	+= -I$(srctree)/board/$(BOARDDIR)
+endif
-- 
1.8.2.3

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 01/20] arm: socfpga: Restructure clock manager driver
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 01/20] arm: socfpga: Restructure clock manager driver Ley Foon Tan
@ 2017-03-09 16:29   ` Dinh Nguyen
  2017-03-21  7:26     ` Ley Foon Tan
  0 siblings, 1 reply; 60+ messages in thread
From: Dinh Nguyen @ 2017-03-09 16:29 UTC (permalink / raw)
  To: u-boot



On 03/08/2017 06:26 PM, Ley Foon Tan wrote:
> Restructure clock manager driver in the preparation to support A10.
> Move the Gen5 specific code to _gen5 files. No functional change.
> 
> Change all uint32_t to u32 and change to use macro BIT(n) for bit shift.
> 
> Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
> ---
>  arch/arm/mach-socfpga/Makefile                     |   3 +-
>  arch/arm/mach-socfpga/clock_manager.c              | 510 +--------------------
>  arch/arm/mach-socfpga/clock_manager_gen5.c         | 510 +++++++++++++++++++++
>  arch/arm/mach-socfpga/include/mach/clock_manager.h | 312 +------------
>  .../mach-socfpga/include/mach/clock_manager_gen5.h | 322 +++++++++++++
>  5 files changed, 846 insertions(+), 811 deletions(-)
>  create mode 100644 arch/arm/mach-socfpga/clock_manager_gen5.c
>  create mode 100644 arch/arm/mach-socfpga/include/mach/clock_manager_gen5.h
> 

Please add a -C when you run format-patch, you'll get something like this:

 5 files changed, 104 insertions(+), 947 deletions(-)
 copy arch/arm/mach-socfpga/{clock_manager.c => clock_manager_gen5.c} (88%)
 copy arch/arm/mach-socfpga/include/mach/{clock_manager.h =>
clock_manager_gen5.h} (87%)

It it make things a bit smaller to review for simple file copies.

Thanks,
Dinh

^ permalink raw reply	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 02/20] arm: socfpga: Update clock for Gen5
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 02/20] arm: socfpga: Update clock for Gen5 Ley Foon Tan
@ 2017-03-09 16:39   ` Dinh Nguyen
  0 siblings, 0 replies; 60+ messages in thread
From: Dinh Nguyen @ 2017-03-09 16:39 UTC (permalink / raw)
  To: u-boot



On 03/08/2017 06:26 PM, Ley Foon Tan wrote:
> Rename some of variables and fixes on clock calculation.
> 

Why? Please be more specific with why this change is necessary?

> Signed-off-by: Tien Fong Chee <tien.fong.chee@intel.com>
> Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
> ---
>  arch/arm/mach-socfpga/clock_manager_gen5.c | 126 +++++++++++++++++------------
>  1 file changed, 76 insertions(+), 50 deletions(-)
> 
> diff --git a/arch/arm/mach-socfpga/clock_manager_gen5.c b/arch/arm/mach-socfpga/clock_manager_gen5.c
> index bca27df..bef0adb 100644
> --- a/arch/arm/mach-socfpga/clock_manager_gen5.c
> +++ b/arch/arm/mach-socfpga/clock_manager_gen5.c
> @@ -1,5 +1,5 @@
>  /*
> - *  Copyright (C) 2013-2017 Altera Corporation <www.altera.com>
> + * Copyright (C) 2013-2017 Altera Corporation <www.altera.com>
>   *
>   * SPDX-License-Identifier:	GPL-2.0+
>   */
> @@ -66,7 +66,6 @@ static void cm_write_with_phase(u32 value,
>   * set source main and peripheral clocks
>   * Ungate clocks
>   */
> -
>  void cm_basic_init(const struct cm_config * const cfg)
>  {
>  	unsigned long end;
> @@ -307,56 +306,73 @@ void cm_basic_init(const struct cm_config * const cfg)
>  
>  static unsigned int cm_get_main_vco_clk_hz(void)
>  {
> -	u32 reg, clock;
> +	u32 src_hz, numer, denom, vco;
>  
>  	/* get the main VCO clock */
> -	reg = readl(&clock_manager_base->main_pll.vco);
> -	clock = cm_get_osc_clk_hz(1);
> -	clock /= ((reg & CLKMGR_MAINPLLGRP_VCO_DENOM_MASK) >>
> -		  CLKMGR_MAINPLLGRP_VCO_DENOM_OFFSET) + 1;
> -	clock *= ((reg & CLKMGR_MAINPLLGRP_VCO_NUMER_MASK) >>
> -		  CLKMGR_MAINPLLGRP_VCO_NUMER_OFFSET) + 1;
> +	vco = readl(&clock_manager_base->main_pll.vco);
>  
> -	return clock;
> +	numer = ((vco & CLKMGR_MAINPLLGRP_VCO_NUMER_MASK) >>
> +		CLKMGR_MAINPLLGRP_VCO_NUMER_OFFSET);
> +	denom = ((vco & CLKMGR_MAINPLLGRP_VCO_DENOM_MASK) >>
> +		 CLKMGR_MAINPLLGRP_VCO_DENOM_OFFSET);
> +
> +	src_hz = cm_get_osc_clk_hz(1);
> +
> +	vco = src_hz;
> +	vco /= (1 + denom);
> +	vco *= (1 + numer);
> +
> +	return vco;

It seems like this change is beyond just "Rename some of variables and
fixes on clock calculation". Could probably be it's own patch?

>  }
>  
>  static unsigned int cm_get_per_vco_clk_hz(void)
>  {
> -	u32 reg, clock = 0;
> +	u32 src_hz = 0;
> +	u32 clk_src = 0;
> +	u32 numer = 0;
> +	u32 denom = 0;
> +	u32 vco = 0;
>  
>  	/* identify PER PLL clock source */
> -	reg = readl(&clock_manager_base->per_pll.vco);
> -	reg = (reg & CLKMGR_PERPLLGRP_VCO_SSRC_MASK) >>
> +	clk_src = readl(&clock_manager_base->per_pll.vco);
> +	clk_src = (clk_src & CLKMGR_PERPLLGRP_VCO_SSRC_MASK) >>
>  	      CLKMGR_PERPLLGRP_VCO_SSRC_OFFSET;
> -	if (reg == CLKMGR_VCO_SSRC_EOSC1)
> -		clock = cm_get_osc_clk_hz(1);
> -	else if (reg == CLKMGR_VCO_SSRC_EOSC2)
> -		clock = cm_get_osc_clk_hz(2);
> -	else if (reg == CLKMGR_VCO_SSRC_F2S)
> -		clock = cm_get_f2s_per_ref_clk_hz();
> +	if (clk_src == CLKMGR_VCO_SSRC_EOSC1)
> +		src_hz = cm_get_osc_clk_hz(1);
> +	else if (clk_src == CLKMGR_VCO_SSRC_EOSC2)
> +		src_hz = cm_get_osc_clk_hz(2);
> +	else if (clk_src == CLKMGR_VCO_SSRC_F2S)
> +		src_hz = cm_get_f2s_per_ref_clk_hz();
>  
>  	/* get the PER VCO clock */
> -	reg = readl(&clock_manager_base->per_pll.vco);
> -	clock /= ((reg & CLKMGR_PERPLLGRP_VCO_DENOM_MASK) >>
> -		  CLKMGR_PERPLLGRP_VCO_DENOM_OFFSET) + 1;
> -	clock *= ((reg & CLKMGR_PERPLLGRP_VCO_NUMER_MASK) >>
> -		  CLKMGR_PERPLLGRP_VCO_NUMER_OFFSET) + 1;
> +	vco = readl(&clock_manager_base->per_pll.vco);
>  
> -	return clock;
> +	numer = (vco & CLKMGR_PERPLLGRP_VCO_NUMER_MASK) >>
> +		CLKMGR_PERPLLGRP_VCO_NUMER_OFFSET;
> +
> +	denom = (vco & CLKMGR_PERPLLGRP_VCO_DENOM_MASK) >>
> +		CLKMGR_PERPLLGRP_VCO_DENOM_OFFSET;
> +
> +	vco = src_hz;
> +	vco /= (1 + denom);
> +	vco *= (1 + numer);
> +
> +	return vco;
>  }

Ditto..

>  
>  unsigned long cm_get_mpu_clk_hz(void)
>  {
> -	u32 reg, clock;
> +	u32 reg, clk_hz;
>  
> -	clock = cm_get_main_vco_clk_hz();
> +	clk_hz = cm_get_main_vco_clk_hz();
>  
>  	/* get the MPU clock */
>  	reg = readl(&clock_manager_base->altera.mpuclk);
> -	clock /= (reg + 1);
> +	clk_hz /= (reg + 1);
>  	reg = readl(&clock_manager_base->main_pll.mpuclk);
> -	clock /= (reg + 1);
> -	return clock;
> +	clk_hz /= (reg + 1);
> +
> +	return clk_hz;
>  }
>  
>  unsigned long cm_get_sdram_clk_hz(void)
> @@ -392,7 +408,8 @@ unsigned long cm_get_sdram_clk_hz(void)
>  
>  unsigned int cm_get_l4_sp_clk_hz(void)
>  {
> -	u32 reg, clock = 0;
> +	u32 clock = 0;
> +	u32 reg;
>  
>  	/* identify the source of L4 SP clock */
>  	reg = readl(&clock_manager_base->main_pll.l4src);
> @@ -426,37 +443,45 @@ unsigned int cm_get_l4_sp_clk_hz(void)
>  
>  unsigned int cm_get_mmc_controller_clk_hz(void)
>  {
> -	u32 reg, clock = 0;
> +	u32 clk_hz = 0;
> +	u32 clk_input = 0;
>  
> -	/* identify the source of MMC clock */
> -	reg = readl(&clock_manager_base->per_pll.src);
> -	reg = (reg & CLKMGR_PERPLLGRP_SRC_SDMMC_MASK) >>
> +	clk_input = readl(&clock_manager_base->per_pll.src);
> +	clk_input = (clk_input & CLKMGR_PERPLLGRP_SRC_SDMMC_MASK) >>
>  	      CLKMGR_PERPLLGRP_SRC_SDMMC_OFFSET;
>  
> -	if (reg == CLKMGR_SDMMC_CLK_SRC_F2S) {
> -		clock = cm_get_f2s_per_ref_clk_hz();
> -	} else if (reg == CLKMGR_SDMMC_CLK_SRC_MAIN) {
> -		clock = cm_get_main_vco_clk_hz();
> +	switch (clk_input) {
> +	case CLKMGR_SDMMC_CLK_SRC_F2S:
> +		clk_hz = cm_get_f2s_per_ref_clk_hz();
> +		break;
> +
> +	case CLKMGR_SDMMC_CLK_SRC_MAIN:
> +		clk_hz = cm_get_main_vco_clk_hz();
>  
>  		/* get the SDMMC clock */
> -		reg = readl(&clock_manager_base->main_pll.mainnandsdmmcclk);
> -		clock /= (reg + 1);
> -	} else if (reg == CLKMGR_SDMMC_CLK_SRC_PER) {
> -		clock = cm_get_per_vco_clk_hz();
> +		clk_input =
> +			readl(&clock_manager_base->main_pll.mainnandsdmmcclk);
> +		clk_hz /= (clk_input + 1);
> +		break;
> +
> +	case CLKMGR_SDMMC_CLK_SRC_PER:
> +		clk_hz = cm_get_per_vco_clk_hz();
>  
>  		/* get the SDMMC clock */
> -		reg = readl(&clock_manager_base->per_pll.pernandsdmmcclk);
> -		clock /= (reg + 1);
> +		clk_input =
> +			readl(&clock_manager_base->per_pll.pernandsdmmcclk);
> +		clk_hz /= (clk_input + 1);
> +		break;
>  	}
>  
> -	/* further divide by 4 as we have fixed divider at wrapper */
> -	clock /= 4;
> -	return clock;
> +	return clk_hz / 4;
>  }
>  
> +
>  unsigned int cm_get_qspi_controller_clk_hz(void)
>  {
> -	u32 reg, clock = 0;
> +	u32 clock = 0;
> +	u32 reg;
>  

Why is this necessary?

>  	/* identify the source of QSPI clock */
>  	reg = readl(&clock_manager_base->per_pll.src);
> @@ -484,7 +509,8 @@ unsigned int cm_get_qspi_controller_clk_hz(void)
>  
>  unsigned int cm_get_spi_controller_clk_hz(void)
>  {
> -	u32 reg, clock = 0;
> +	u32 clock = 0;
> +	u32 reg;
>  

Ditto..

Dinh

^ permalink raw reply	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 00/20] Add Intel Arria 10 SoC support
  2017-03-09  0:26 [U-Boot] [PATCH v2 00/20] Add Intel Arria 10 SoC support Ley Foon Tan
                   ` (19 preceding siblings ...)
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 20/20] arm: socfpga: Enable build for Arria 10 Ley Foon Tan
@ 2017-03-09 21:32 ` Dinh Nguyen
  2017-03-10  1:51   ` Marek Vasut
  2017-03-16 21:56 ` Marek Vasut
  21 siblings, 1 reply; 60+ messages in thread
From: Dinh Nguyen @ 2017-03-09 21:32 UTC (permalink / raw)
  To: u-boot

On Wed, Mar 8, 2017 at 6:26 PM, Ley Foon Tan <ley.foon.tan@intel.com> wrote:
> This is the 2nd version of patchset to adds support for Intel Arria 10 SoC.
> This version mainly resolved comments from Marek in [v1].
>

Can you please include me on this patchset? I'd like to help with the
review process.

Thanks,
Dinh

^ permalink raw reply	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 04/20] arm: socfpga: Restructure misc driver
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 04/20] arm: socfpga: Restructure misc driver Ley Foon Tan
@ 2017-03-10  1:36   ` Marek Vasut
  2017-03-21  7:44     ` Ley Foon Tan
  0 siblings, 1 reply; 60+ messages in thread
From: Marek Vasut @ 2017-03-10  1:36 UTC (permalink / raw)
  To: u-boot

On 03/09/2017 01:26 AM, Ley Foon Tan wrote:
> Restructure misc driver in the preparation to support A10.
> Move the Gen5 specific code to _gen5 file. No functional change.
> 
> Change all uint32_t_to u32.
> 
> Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
> ---
>  arch/arm/mach-socfpga/Makefile            |   3 +-
>  arch/arm/mach-socfpga/include/mach/misc.h |  26 +++
>  arch/arm/mach-socfpga/misc.c              | 361 ++----------------------------
>  arch/arm/mach-socfpga/misc_gen5.c         | 355 +++++++++++++++++++++++++++++
>  4 files changed, 398 insertions(+), 347 deletions(-)
>  create mode 100644 arch/arm/mach-socfpga/include/mach/misc.h
>  create mode 100644 arch/arm/mach-socfpga/misc_gen5.c
> 
> diff --git a/arch/arm/mach-socfpga/Makefile b/arch/arm/mach-socfpga/Makefile
> index 97819ac..5b09ea9 100644
> --- a/arch/arm/mach-socfpga/Makefile
> +++ b/arch/arm/mach-socfpga/Makefile
> @@ -14,7 +14,8 @@ obj-$(CONFIG_SPL_BUILD) += spl.o freeze_controller.o
>  
>  # QTS-generated config file wrappers
>  obj-$(CONFIG_TARGET_SOCFPGA_GEN5)	+= scan_manager.o wrap_pll_config.o \
> -					   clock_manager_gen5.o reset_manager_gen5.o
> +					   clock_manager_gen5.o reset_manager_gen5.o \
> +					   misc_gen5.o
>  obj-$(CONFIG_SPL_BUILD) += wrap_iocsr_config.o wrap_pinmux_config.o	\
>  			   wrap_sdram_config.o
>  CFLAGS_wrap_iocsr_config.o	+= -I$(srctree)/board/$(BOARDDIR)
> diff --git a/arch/arm/mach-socfpga/include/mach/misc.h b/arch/arm/mach-socfpga/include/mach/misc.h
> new file mode 100644
> index 0000000..64f9b86
> --- /dev/null
> +++ b/arch/arm/mach-socfpga/include/mach/misc.h
> @@ -0,0 +1,26 @@
> +/*
> + * Copyright (C) 2016-2017 Intel Corporation
> + *
> + * SPDX-License-Identifier:    GPL-2.0
> + */
> +
> +#ifndef _MISC_H_
> +#define _MISC_H_
> +
> +void dwmac_deassert_reset(const unsigned int of_reset_id,
> +				 const u32 phymode);
> +
> +struct bsel {
> +	const char	*mode;
> +	const char	*name;
> +};
> +
> +extern struct bsel bsel_str[];

I'm really not a big fan of extern variables, can we get rid of this?

> +#ifdef CONFIG_FPGA
> +void socfpga_fpga_add(void);
> +#else
> +inline void socfpga_fpga_add(void) {}

static

> +#endif
> +
> +#endif /* _MISC_H_ */
> diff --git a/arch/arm/mach-socfpga/misc.c b/arch/arm/mach-socfpga/misc.c
> index dd6b53b..cd250af 100644
> --- a/arch/arm/mach-socfpga/misc.c
> +++ b/arch/arm/mach-socfpga/misc.c
> @@ -1,5 +1,5 @@
>  /*
> - *  Copyright (C) 2012 Altera Corporation <www.altera.com>
> + *  Copyright (C) 2012-2017 Altera Corporation <www.altera.com>
>   *
>   * SPDX-License-Identifier:	GPL-2.0+
>   */
> @@ -13,6 +13,7 @@
>  #include <miiphy.h>
>  #include <netdev.h>
>  #include <watchdog.h>
> +#include <asm/arch/misc.h>
>  #include <asm/arch/reset_manager.h>
>  #include <asm/arch/scan_manager.h>
>  #include <asm/arch/system_manager.h>
> @@ -24,16 +25,19 @@
>  
>  DECLARE_GLOBAL_DATA_PTR;
>  
> -static struct pl310_regs *const pl310 =
> +static const struct pl310_regs *const pl310 =
>  	(struct pl310_regs *)CONFIG_SYS_PL310_BASE;
> -static struct socfpga_system_manager *sysmgr_regs =
> -	(struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS;
> -static struct socfpga_reset_manager *reset_manager_base =
> -	(struct socfpga_reset_manager *)SOCFPGA_RSTMGR_ADDRESS;
> -static struct nic301_registers *nic301_regs =
> -	(struct nic301_registers *)SOCFPGA_L3REGS_ADDRESS;
> -static struct scu_registers *scu_regs =
> -	(struct scu_registers *)SOCFPGA_MPUSCU_ADDRESS;
> +
> +struct bsel bsel_str[] = {
> +	{ "rsvd", "Reserved", },
> +	{ "fpga", "FPGA (HPS2FPGA Bridge)", },
> +	{ "nand", "NAND Flash (1.8V)", },
> +	{ "nand", "NAND Flash (3.0V)", },
> +	{ "sd", "SD/MMC External Transceiver (1.8V)", },
> +	{ "sd", "SD/MMC Internal Transceiver (3.0V)", },
> +	{ "qspi", "QSPI Flash (1.8V)", },
> +	{ "qspi", "QSPI Flash (3.0V)", },
> +};
>  
>  int dram_init(void)
>  {
> @@ -72,207 +76,6 @@ void v7_outer_cache_disable(void)
>  	clrbits_le32(&pl310->pl310_ctrl, L2X0_CTRL_EN);
>  }
>  
> -/*
> - * DesignWare Ethernet initialization
> - */
> -#ifdef CONFIG_ETH_DESIGNWARE
> -static void dwmac_deassert_reset(const unsigned int of_reset_id,
> -				 const u32 phymode)
> -{
> -	u32 physhift, reset;
> -
> -	if (of_reset_id == EMAC0_RESET) {
> -		physhift = SYSMGR_EMACGRP_CTRL_PHYSEL0_LSB;
> -		reset = SOCFPGA_RESET(EMAC0);
> -	} else if (of_reset_id == EMAC1_RESET) {
> -		physhift = SYSMGR_EMACGRP_CTRL_PHYSEL1_LSB;
> -		reset = SOCFPGA_RESET(EMAC1);
> -	} else {
> -		printf("GMAC: Invalid reset ID (%i)!\n", of_reset_id);
> -		return;
> -	}
> -
> -	/* Clearing emac0 PHY interface select to 0 */
> -	clrbits_le32(&sysmgr_regs->emacgrp_ctrl,
> -		     SYSMGR_EMACGRP_CTRL_PHYSEL_MASK << physhift);
> -
> -	/* configure to PHY interface select choosed */
> -	setbits_le32(&sysmgr_regs->emacgrp_ctrl,
> -		     phymode << physhift);
> -
> -	/* Release the EMAC controller from reset */
> -	socfpga_per_reset(reset, 0);
> -}
> -
> -static u32 dwmac_phymode_to_modereg(const char *phymode, u32 *modereg)
> -{
> -	if (!phymode)
> -		return -EINVAL;
> -
> -	if (!strcmp(phymode, "mii") || !strcmp(phymode, "gmii")) {
> -		*modereg = SYSMGR_EMACGRP_CTRL_PHYSEL_ENUM_GMII_MII;
> -		return 0;
> -	}
> -
> -	if (!strcmp(phymode, "rgmii")) {
> -		*modereg = SYSMGR_EMACGRP_CTRL_PHYSEL_ENUM_RGMII;
> -		return 0;
> -	}
> -
> -	if (!strcmp(phymode, "rmii")) {
> -		*modereg = SYSMGR_EMACGRP_CTRL_PHYSEL_ENUM_RMII;
> -		return 0;
> -	}
> -
> -	return -EINVAL;
> -}
> -
> -static int socfpga_eth_reset(void)
> -{
> -	const void *fdt = gd->fdt_blob;
> -	struct fdtdec_phandle_args args;
> -	const char *phy_mode;
> -	u32 phy_modereg;
> -	int nodes[2];	/* Max. two GMACs */
> -	int ret, count;
> -	int i, node;
> -
> -	/* Put both GMACs into RESET state. */
> -	socfpga_per_reset(SOCFPGA_RESET(EMAC0), 1);
> -	socfpga_per_reset(SOCFPGA_RESET(EMAC1), 1);
> -
> -	count = fdtdec_find_aliases_for_id(fdt, "ethernet",
> -					   COMPAT_ALTERA_SOCFPGA_DWMAC,
> -					   nodes, ARRAY_SIZE(nodes));
> -	for (i = 0; i < count; i++) {
> -		node = nodes[i];
> -		if (node <= 0)
> -			continue;
> -
> -		ret = fdtdec_parse_phandle_with_args(fdt, node, "resets",
> -						     "#reset-cells", 1, 0,
> -						     &args);
> -		if (ret || (args.args_count != 1)) {
> -			debug("GMAC%i: Failed to parse DT 'resets'!\n", i);
> -			continue;
> -		}
> -
> -		phy_mode = fdt_getprop(fdt, node, "phy-mode", NULL);
> -		ret = dwmac_phymode_to_modereg(phy_mode, &phy_modereg);
> -		if (ret) {
> -			debug("GMAC%i: Failed to parse DT 'phy-mode'!\n", i);
> -			continue;
> -		}
> -
> -		dwmac_deassert_reset(args.args[0], phy_modereg);
> -	}
> -
> -	return 0;
> -}
> -#else
> -static int socfpga_eth_reset(void)
> -{
> -	return 0;
> -};
> -#endif
> -
> -struct {
> -	const char	*mode;
> -	const char	*name;
> -} bsel_str[] = {
> -	{ "rsvd", "Reserved", },
> -	{ "fpga", "FPGA (HPS2FPGA Bridge)", },
> -	{ "nand", "NAND Flash (1.8V)", },
> -	{ "nand", "NAND Flash (3.0V)", },
> -	{ "sd", "SD/MMC External Transceiver (1.8V)", },
> -	{ "sd", "SD/MMC Internal Transceiver (3.0V)", },
> -	{ "qspi", "QSPI Flash (1.8V)", },
> -	{ "qspi", "QSPI Flash (3.0V)", },
> -};
> -
> -static const struct {
> -	const u16	pn;
> -	const char	*name;
> -	const char	*var;
> -} const socfpga_fpga_model[] = {
> -	/* Cyclone V E */
> -	{ 0x2b15, "Cyclone V, E/A2", "cv_e_a2" },
> -	{ 0x2b05, "Cyclone V, E/A4", "cv_e_a4" },
> -	{ 0x2b22, "Cyclone V, E/A5", "cv_e_a5" },
> -	{ 0x2b13, "Cyclone V, E/A7", "cv_e_a7" },
> -	{ 0x2b14, "Cyclone V, E/A9", "cv_e_a9" },
> -	/* Cyclone V GX/GT */
> -	{ 0x2b01, "Cyclone V, GX/C3", "cv_gx_c3" },
> -	{ 0x2b12, "Cyclone V, GX/C4", "cv_gx_c4" },
> -	{ 0x2b02, "Cyclone V, GX/C5 or GT/D5", "cv_gx_c5" },
> -	{ 0x2b03, "Cyclone V, GX/C7 or GT/D7", "cv_gx_c7" },
> -	{ 0x2b04, "Cyclone V, GX/C9 or GT/D9", "cv_gx_c9" },
> -	/* Cyclone V SE/SX/ST */
> -	{ 0x2d11, "Cyclone V, SE/A2 or SX/C2", "cv_se_a2" },
> -	{ 0x2d01, "Cyclone V, SE/A4 or SX/C4", "cv_se_a4" },
> -	{ 0x2d12, "Cyclone V, SE/A5 or SX/C5 or ST/D5", "cv_se_a5" },
> -	{ 0x2d02, "Cyclone V, SE/A6 or SX/C6 or ST/D6", "cv_se_a6" },
> -	/* Arria V */
> -	{ 0x2d03, "Arria V, D5", "av_d5" },
> -};
> -
> -static int socfpga_fpga_id(const bool print_id)
> -{
> -	const u32 altera_mi = 0x6e;
> -	const u32 id = scan_mgr_get_fpga_id();
> -
> -	const u32 lsb = id & 0x00000001;
> -	const u32 mi = (id >> 1) & 0x000007ff;
> -	const u32 pn = (id >> 12) & 0x0000ffff;
> -	const u32 version = (id >> 28) & 0x0000000f;
> -	int i;
> -
> -	if ((mi != altera_mi) || (lsb != 1)) {
> -		printf("FPGA:  Not Altera chip ID\n");
> -		return -EINVAL;
> -	}
> -
> -	for (i = 0; i < ARRAY_SIZE(socfpga_fpga_model); i++)
> -		if (pn == socfpga_fpga_model[i].pn)
> -			break;
> -
> -	if (i == ARRAY_SIZE(socfpga_fpga_model)) {
> -		printf("FPGA:  Unknown Altera chip, ID 0x%08x\n", id);
> -		return -EINVAL;
> -	}
> -
> -	if (print_id)
> -		printf("FPGA:  Altera %s, version 0x%01x\n",
> -		       socfpga_fpga_model[i].name, version);
> -	return i;
> -}
> -
> -/*
> - * Print CPU information
> - */
> -#if defined(CONFIG_DISPLAY_CPUINFO)
> -int print_cpuinfo(void)
> -{
> -	const u32 bsel = readl(&sysmgr_regs->bootinfo) & 0x7;
> -	puts("CPU:   Altera SoCFPGA Platform\n");
> -	socfpga_fpga_id(1);
> -	printf("BOOT:  %s\n", bsel_str[bsel].name);
> -	return 0;
> -}
> -#endif
> -
> -#ifdef CONFIG_ARCH_MISC_INIT
> -int arch_misc_init(void)
> -{
> -	const u32 bsel = readl(&sysmgr_regs->bootinfo) & 0x7;
> -	const int fpga_id = socfpga_fpga_id(0);
> -	setenv("bootmode", bsel_str[bsel].mode);
> -	if (fpga_id >= 0)
> -		setenv("fpgatype", socfpga_fpga_model[fpga_id].var);
> -	return socfpga_eth_reset();
> -}
> -#endif
> -
>  #if defined(CONFIG_SYS_CONSOLE_IS_IN_ENV) && \
>  defined(CONFIG_SYS_CONSOLE_OVERWRITE_ROUTINE)
>  int overwrite_console(void)
> @@ -303,15 +106,13 @@ static Altera_desc altera_fpga[] = {
>  };
>  
>  /* add device descriptor to FPGA device table */
> -static void socfpga_fpga_add(void)
> +void socfpga_fpga_add(void)
>  {
>  	int i;
>  	fpga_init();
>  	for (i = 0; i < ARRAY_SIZE(altera_fpga); i++)
>  		fpga_add(fpga_altera, &altera_fpga[i]);
>  }
> -#else
> -static inline void socfpga_fpga_add(void) {}
>  #endif
>  
>  int arch_cpu_init(void)
> @@ -337,135 +138,3 @@ int arch_cpu_init(void)
>  
>  	return 0;
>  }
> -
> -/*
> - * Convert all NIC-301 AMBA slaves from secure to non-secure
> - */
> -static void socfpga_nic301_slave_ns(void)
> -{
> -	writel(0x1, &nic301_regs->lwhps2fpgaregs);
> -	writel(0x1, &nic301_regs->hps2fpgaregs);
> -	writel(0x1, &nic301_regs->acp);
> -	writel(0x1, &nic301_regs->rom);
> -	writel(0x1, &nic301_regs->ocram);
> -	writel(0x1, &nic301_regs->sdrdata);
> -}
> -
> -static uint32_t iswgrp_handoff[8];
> -
> -int arch_early_init_r(void)
> -{
> -	int i;
> -
> -	/*
> -	 * Write magic value into magic register to unlock support for
> -	 * issuing warm reset. The ancient kernel code expects this
> -	 * value to be written into the register by the bootloader, so
> -	 * to support that old code, we write it here instead of in the
> -	 * reset_cpu() function just before resetting the CPU.
> -	 */
> -	writel(0xae9efebc, &sysmgr_regs->romcodegrp_warmramgrp_enable);
> -
> -	for (i = 0; i < 8; i++)	/* Cache initial SW setting regs */
> -		iswgrp_handoff[i] = readl(&sysmgr_regs->iswgrp_handoff[i]);
> -
> -	socfpga_bridges_reset(1);
> -	socfpga_nic301_slave_ns();
> -
> -	/*
> -	 * Private components security:
> -	 * U-Boot : configure private timer, global timer and cpu component
> -	 * access as non secure for kernel stage (as required by Linux)
> -	 */
> -	setbits_le32(&scu_regs->sacr, 0xfff);
> -
> -	/* Configure the L2 controller to make SDRAM start at 0 */
> -#ifdef CONFIG_SOCFPGA_VIRTUAL_TARGET
> -	writel(0x2, &nic301_regs->remap);
> -#else
> -	writel(0x1, &nic301_regs->remap);	/* remap.mpuzero */
> -	writel(0x1, &pl310->pl310_addr_filter_start);
> -#endif
> -
> -	/* Add device descriptor to FPGA device table */
> -	socfpga_fpga_add();
> -
> -#ifdef CONFIG_DESIGNWARE_SPI
> -	/* Get Designware SPI controller out of reset */
> -	socfpga_per_reset(SOCFPGA_RESET(SPIM0), 0);
> -	socfpga_per_reset(SOCFPGA_RESET(SPIM1), 0);
> -#endif
> -
> -#ifdef CONFIG_NAND_DENALI
> -	socfpga_per_reset(SOCFPGA_RESET(NAND), 0);
> -#endif
> -
> -	return 0;
> -}
> -
> -static void socfpga_sdram_apply_static_cfg(void)
> -{
> -	const uint32_t staticcfg = SOCFPGA_SDR_ADDRESS + 0x505c;
> -	const uint32_t applymask = 0x8;
> -	uint32_t val = readl(staticcfg) | applymask;
> -
> -	/*
> -	 * SDRAM staticcfg register specific:
> -	 * When applying the register setting, the CPU must not access
> -	 * SDRAM. Luckily for us, we can abuse i-cache here to help us
> -	 * circumvent the SDRAM access issue. The idea is to make sure
> -	 * that the code is in one full i-cache line by branching past
> -	 * it and back. Once it is in the i-cache, we execute the core
> -	 * of the code and apply the register settings.
> -	 *
> -	 * The code below uses 7 instructions, while the Cortex-A9 has
> -	 * 32-byte cachelines, thus the limit is 8 instructions total.
> -	 */
> -	asm volatile(
> -		".align	5			\n"
> -		"	b	2f		\n"
> -		"1:	str	%0,	[%1]	\n"
> -		"	dsb			\n"
> -		"	isb			\n"
> -		"	b	3f		\n"
> -		"2:	b	1b		\n"
> -		"3:	nop			\n"
> -	: : "r"(val), "r"(staticcfg) : "memory", "cc");
> -}
> -
> -int do_bridge(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
> -{
> -	if (argc != 2)
> -		return CMD_RET_USAGE;
> -
> -	argv++;
> -
> -	switch (*argv[0]) {
> -	case 'e':	/* Enable */
> -		writel(iswgrp_handoff[2], &sysmgr_regs->fpgaintfgrp_module);
> -		socfpga_sdram_apply_static_cfg();
> -		writel(iswgrp_handoff[3], SOCFPGA_SDR_ADDRESS + 0x5080);
> -		writel(iswgrp_handoff[0], &reset_manager_base->brg_mod_reset);
> -		writel(iswgrp_handoff[1], &nic301_regs->remap);
> -		break;
> -	case 'd':	/* Disable */
> -		writel(0, &sysmgr_regs->fpgaintfgrp_module);
> -		writel(0, SOCFPGA_SDR_ADDRESS + 0x5080);
> -		socfpga_sdram_apply_static_cfg();
> -		writel(0, &reset_manager_base->brg_mod_reset);
> -		writel(1, &nic301_regs->remap);
> -		break;
> -	default:
> -		return CMD_RET_USAGE;
> -	}
> -
> -	return 0;
> -}
> -
> -U_BOOT_CMD(
> -	bridge, 2, 1, do_bridge,
> -	"SoCFPGA HPS FPGA bridge control",
> -	"enable  - Enable HPS-to-FPGA, FPGA-to-HPS, LWHPS-to-FPGA bridges\n"
> -	"bridge disable - Enable HPS-to-FPGA, FPGA-to-HPS, LWHPS-to-FPGA bridges\n"
> -	""
> -);
> diff --git a/arch/arm/mach-socfpga/misc_gen5.c b/arch/arm/mach-socfpga/misc_gen5.c
> new file mode 100644
> index 0000000..f870e1f
> --- /dev/null
> +++ b/arch/arm/mach-socfpga/misc_gen5.c
> @@ -0,0 +1,355 @@
> +/*
> + *  Copyright (C) 2012-2017 Altera Corporation <www.altera.com>
> + *
> + * SPDX-License-Identifier:	GPL-2.0+
> + */
> +
> +#include <common.h>
> +#include <asm/io.h>
> +#include <errno.h>
> +#include <fdtdec.h>
> +#include <libfdt.h>
> +#include <altera.h>
> +#include <miiphy.h>
> +#include <netdev.h>
> +#include <watchdog.h>
> +#include <asm/arch/misc.h>
> +#include <asm/arch/reset_manager.h>
> +#include <asm/arch/scan_manager.h>
> +#include <asm/arch/system_manager.h>
> +#include <asm/arch/nic301.h>
> +#include <asm/arch/scu.h>
> +#include <asm/pl310.h>
> +
> +#include <dt-bindings/reset/altr,rst-mgr.h>
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +static struct pl310_regs *const pl310 =
> +	(struct pl310_regs *)CONFIG_SYS_PL310_BASE;
> +static struct socfpga_system_manager *sysmgr_regs =
> +	(struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS;
> +static struct socfpga_reset_manager *reset_manager_base =
> +	(struct socfpga_reset_manager *)SOCFPGA_RSTMGR_ADDRESS;
> +static struct nic301_registers *nic301_regs =
> +	(struct nic301_registers *)SOCFPGA_L3REGS_ADDRESS;
> +static struct scu_registers *scu_regs =
> +	(struct scu_registers *)SOCFPGA_MPUSCU_ADDRESS;
> +
> +/*
> + * DesignWare Ethernet initialization
> + */
> +#ifdef CONFIG_ETH_DESIGNWARE
> +void dwmac_deassert_reset(const unsigned int of_reset_id,
> +				 const u32 phymode)
> +{
> +	u32 physhift, reset;
> +
> +	if (of_reset_id == EMAC0_RESET) {
> +		physhift = SYSMGR_EMACGRP_CTRL_PHYSEL0_LSB;
> +		reset = SOCFPGA_RESET(EMAC0);
> +	} else if (of_reset_id == EMAC1_RESET) {
> +		physhift = SYSMGR_EMACGRP_CTRL_PHYSEL1_LSB;
> +		reset = SOCFPGA_RESET(EMAC1);
> +	} else {
> +		printf("GMAC: Invalid reset ID (%i)!\n", of_reset_id);
> +		return;
> +	}
> +
> +	/* configure to PHY interface select choosed */
> +	clrsetbits_le32(&sysmgr_regs->emacgrp_ctrl,
> +			SYSMGR_EMACGRP_CTRL_PHYSEL_MASK << physhift,
> +			phymode << physhift);
> +
> +	/* Release the EMAC controller from reset */
> +	socfpga_per_reset(reset, 0);
> +}
> +
> +static u32 dwmac_phymode_to_modereg(const char *phymode, u32 *modereg)
> +{
> +	if (!phymode)
> +		return -EINVAL;
> +
> +	if (!strcmp(phymode, "mii") || !strcmp(phymode, "gmii")) {
> +		*modereg = SYSMGR_EMACGRP_CTRL_PHYSEL_ENUM_GMII_MII;
> +		return 0;
> +	}
> +
> +	if (!strcmp(phymode, "rgmii")) {
> +		*modereg = SYSMGR_EMACGRP_CTRL_PHYSEL_ENUM_RGMII;
> +		return 0;
> +	}
> +
> +	if (!strcmp(phymode, "rmii")) {
> +		*modereg = SYSMGR_EMACGRP_CTRL_PHYSEL_ENUM_RMII;
> +		return 0;
> +	}
> +
> +	return -EINVAL;
> +}
> +
> +static int socfpga_eth_reset(void)
> +{
> +	const void *fdt = gd->fdt_blob;
> +	struct fdtdec_phandle_args args;
> +	const char *phy_mode;
> +	u32 phy_modereg;
> +	int nodes[2];	/* Max. two GMACs */
> +	int ret, count;
> +	int i, node;
> +
> +	/* Put both GMACs into RESET state. */
> +	socfpga_per_reset(SOCFPGA_RESET(EMAC0), 1);
> +	socfpga_per_reset(SOCFPGA_RESET(EMAC1), 1);
> +
> +	count = fdtdec_find_aliases_for_id(fdt, "ethernet",
> +					   COMPAT_ALTERA_SOCFPGA_DWMAC,
> +					   nodes, ARRAY_SIZE(nodes));
> +	for (i = 0; i < count; i++) {
> +		node = nodes[i];
> +		if (node <= 0)
> +			continue;
> +
> +		ret = fdtdec_parse_phandle_with_args(fdt, node, "resets",
> +						     "#reset-cells", 1, 0,
> +						     &args);
> +		if (ret || (args.args_count != 1)) {
> +			debug("GMAC%i: Failed to parse DT 'resets'!\n", i);
> +			continue;
> +		}
> +
> +		phy_mode = fdt_getprop(fdt, node, "phy-mode", NULL);
> +		ret = dwmac_phymode_to_modereg(phy_mode, &phy_modereg);
> +		if (ret) {
> +			debug("GMAC%i: Failed to parse DT 'phy-mode'!\n", i);
> +			continue;
> +		}
> +
> +		dwmac_deassert_reset(args.args[0], phy_modereg);
> +	}
> +
> +	return 0;
> +}
> +#else
> +static int socfpga_eth_reset(void)
> +{
> +	return 0;
> +};
> +#endif
> +
> +static const struct {
> +	const u16	pn;
> +	const char	*name;
> +	const char	*var;
> +} const socfpga_fpga_model[] = {
> +	/* Cyclone V E */
> +	{ 0x2b15, "Cyclone V, E/A2", "cv_e_a2" },
> +	{ 0x2b05, "Cyclone V, E/A4", "cv_e_a4" },
> +	{ 0x2b22, "Cyclone V, E/A5", "cv_e_a5" },
> +	{ 0x2b13, "Cyclone V, E/A7", "cv_e_a7" },
> +	{ 0x2b14, "Cyclone V, E/A9", "cv_e_a9" },
> +	/* Cyclone V GX/GT */
> +	{ 0x2b01, "Cyclone V, GX/C3", "cv_gx_c3" },
> +	{ 0x2b12, "Cyclone V, GX/C4", "cv_gx_c4" },
> +	{ 0x2b02, "Cyclone V, GX/C5 or GT/D5", "cv_gx_c5" },
> +	{ 0x2b03, "Cyclone V, GX/C7 or GT/D7", "cv_gx_c7" },
> +	{ 0x2b04, "Cyclone V, GX/C9 or GT/D9", "cv_gx_c9" },
> +	/* Cyclone V SE/SX/ST */
> +	{ 0x2d11, "Cyclone V, SE/A2 or SX/C2", "cv_se_a2" },
> +	{ 0x2d01, "Cyclone V, SE/A4 or SX/C4", "cv_se_a4" },
> +	{ 0x2d12, "Cyclone V, SE/A5 or SX/C5 or ST/D5", "cv_se_a5" },
> +	{ 0x2d02, "Cyclone V, SE/A6 or SX/C6 or ST/D6", "cv_se_a6" },
> +	/* Arria V */
> +	{ 0x2d03, "Arria V, D5", "av_d5" },
> +};
> +
> +static int socfpga_fpga_id(const bool print_id)
> +{
> +	const u32 altera_mi = 0x6e;
> +	const u32 id = scan_mgr_get_fpga_id();
> +
> +	const u32 lsb = id & 0x00000001;
> +	const u32 mi = (id >> 1) & 0x000007ff;
> +	const u32 pn = (id >> 12) & 0x0000ffff;
> +	const u32 version = (id >> 28) & 0x0000000f;
> +	int i;
> +
> +	if ((mi != altera_mi) || (lsb != 1)) {
> +		printf("FPGA:  Not Altera chip ID\n");
> +		return -EINVAL;
> +	}
> +
> +	for (i = 0; i < ARRAY_SIZE(socfpga_fpga_model); i++)
> +		if (pn == socfpga_fpga_model[i].pn)
> +			break;
> +
> +	if (i == ARRAY_SIZE(socfpga_fpga_model)) {
> +		printf("FPGA:  Unknown Altera chip, ID 0x%08x\n", id);
> +		return -EINVAL;
> +	}
> +
> +	if (print_id)
> +		printf("FPGA:  Altera %s, version 0x%01x\n",
> +		       socfpga_fpga_model[i].name, version);
> +	return i;
> +}
> +
> +/*
> + * Print CPU information
> + */
> +#if defined(CONFIG_DISPLAY_CPUINFO)
> +int print_cpuinfo(void)
> +{
> +	const u32 bsel = readl(&sysmgr_regs->bootinfo) & 0x7;
> +
> +	puts("CPU:   Altera SoCFPGA Platform\n");
> +	socfpga_fpga_id(1);
> +
> +	printf("BOOT:  %s\n", bsel_str[bsel].name);
> +	return 0;
> +}
> +#endif
> +
> +#ifdef CONFIG_ARCH_MISC_INIT
> +int arch_misc_init(void)
> +{
> +	const u32 bsel = readl(&sysmgr_regs->bootinfo) & 0x7;
> +	const int fpga_id = socfpga_fpga_id(0);
> +	setenv("bootmode", bsel_str[bsel].mode);
> +	if (fpga_id >= 0)
> +		setenv("fpgatype", socfpga_fpga_model[fpga_id].var);
> +	return socfpga_eth_reset();
> +}
> +#endif
> +
> +/*
> + * Convert all NIC-301 AMBA slaves from secure to non-secure
> + */
> +static void socfpga_nic301_slave_ns(void)
> +{
> +	writel(0x1, &nic301_regs->lwhps2fpgaregs);
> +	writel(0x1, &nic301_regs->hps2fpgaregs);
> +	writel(0x1, &nic301_regs->acp);
> +	writel(0x1, &nic301_regs->rom);
> +	writel(0x1, &nic301_regs->ocram);
> +	writel(0x1, &nic301_regs->sdrdata);
> +}
> +
> +static u32 iswgrp_handoff[8];
> +
> +int arch_early_init_r(void)
> +{
> +	int i;
> +
> +	/*
> +	 * Write magic value into magic register to unlock support for
> +	 * issuing warm reset. The ancient kernel code expects this
> +	 * value to be written into the register by the bootloader, so
> +	 * to support that old code, we write it here instead of in the
> +	 * reset_cpu() function just before resetting the CPU.
> +	 */
> +	writel(0xae9efebc, &sysmgr_regs->romcodegrp_warmramgrp_enable);
> +
> +	for (i = 0; i < 8; i++)	/* Cache initial SW setting regs */
> +		iswgrp_handoff[i] = readl(&sysmgr_regs->iswgrp_handoff[i]);
> +
> +	socfpga_bridges_reset(1);
> +	socfpga_nic301_slave_ns();
> +
> +	/*
> +	 * Private components security:
> +	 * U-Boot : configure private timer, global timer and cpu component
> +	 * access as non secure for kernel stage (as required by Linux)
> +	 */
> +	setbits_le32(&scu_regs->sacr, 0xfff);
> +
> +	/* Configure the L2 controller to make SDRAM start at 0 */
> +#ifdef CONFIG_SOCFPGA_VIRTUAL_TARGET
> +	writel(0x2, &nic301_regs->remap);
> +#else
> +	writel(0x1, &nic301_regs->remap);	/* remap.mpuzero */
> +	writel(0x1, &pl310->pl310_addr_filter_start);
> +#endif
> +
> +	/* Add device descriptor to FPGA device table */
> +	socfpga_fpga_add();
> +
> +#ifdef CONFIG_DESIGNWARE_SPI
> +	/* Get Designware SPI controller out of reset */
> +	socfpga_per_reset(SOCFPGA_RESET(SPIM0), 0);
> +	socfpga_per_reset(SOCFPGA_RESET(SPIM1), 0);
> +#endif
> +
> +#ifdef CONFIG_NAND_DENALI
> +	socfpga_per_reset(SOCFPGA_RESET(NAND), 0);
> +#endif
> +
> +	return 0;
> +}
> +
> +static void socfpga_sdram_apply_static_cfg(void)
> +{
> +	const u32 staticcfg = SOCFPGA_SDR_ADDRESS + 0x505c;
> +	const u32 applymask = 0x8;
> +	u32 val = readl(staticcfg) | applymask;
> +
> +	/*
> +	 * SDRAM staticcfg register specific:
> +	 * When applying the register setting, the CPU must not access
> +	 * SDRAM. Luckily for us, we can abuse i-cache here to help us
> +	 * circumvent the SDRAM access issue. The idea is to make sure
> +	 * that the code is in one full i-cache line by branching past
> +	 * it and back. Once it is in the i-cache, we execute the core
> +	 * of the code and apply the register settings.
> +	 *
> +	 * The code below uses 7 instructions, while the Cortex-A9 has
> +	 * 32-byte cachelines, thus the limit is 8 instructions total.
> +	 */
> +	asm volatile(
> +		".align	5			\n"
> +		"	b	2f		\n"
> +		"1:	str	%0,	[%1]	\n"
> +		"	dsb			\n"
> +		"	isb			\n"
> +		"	b	3f		\n"
> +		"2:	b	1b		\n"
> +		"3:	nop			\n"
> +	: : "r"(val), "r"(staticcfg) : "memory", "cc");
> +}
> +
> +int do_bridge(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
> +{
> +	if (argc != 2)
> +		return CMD_RET_USAGE;
> +
> +	argv++;
> +
> +	switch (*argv[0]) {
> +	case 'e':	/* Enable */
> +		writel(iswgrp_handoff[2], &sysmgr_regs->fpgaintfgrp_module);
> +		socfpga_sdram_apply_static_cfg();
> +		writel(iswgrp_handoff[3], SOCFPGA_SDR_ADDRESS + 0x5080);
> +		writel(iswgrp_handoff[0], &reset_manager_base->brg_mod_reset);
> +		writel(iswgrp_handoff[1], &nic301_regs->remap);
> +		break;
> +	case 'd':	/* Disable */
> +		writel(0, &sysmgr_regs->fpgaintfgrp_module);
> +		writel(0, SOCFPGA_SDR_ADDRESS + 0x5080);
> +		socfpga_sdram_apply_static_cfg();
> +		writel(0, &reset_manager_base->brg_mod_reset);
> +		writel(1, &nic301_regs->remap);
> +		break;
> +	default:
> +		return CMD_RET_USAGE;
> +	}
> +
> +	return 0;
> +}
> +
> +U_BOOT_CMD(
> +	bridge, 2, 1, do_bridge,
> +	"SoCFPGA HPS FPGA bridge control",
> +	"enable  - Enable HPS-to-FPGA, FPGA-to-HPS, LWHPS-to-FPGA bridges\n"
> +	"bridge disable - Enable HPS-to-FPGA, FPGA-to-HPS, LWHPS-to-FPGA bridges\n"
> +	""
> +);
> 


-- 
Best regards,
Marek Vasut

^ permalink raw reply	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 06/20] arm: socfpga: Add A10 defines
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 06/20] arm: socfpga: Add A10 defines Ley Foon Tan
@ 2017-03-10  1:38   ` Marek Vasut
  2017-03-21  8:05     ` Ley Foon Tan
  0 siblings, 1 reply; 60+ messages in thread
From: Marek Vasut @ 2017-03-10  1:38 UTC (permalink / raw)
  To: u-boot

On 03/09/2017 01:26 AM, Ley Foon Tan wrote:
> Add i2c, timer and other A10 defines.

macros ... btw. you're defining macro with their address.

> Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
> ---
>  arch/arm/mach-socfpga/include/mach/base_addr_a10.h | 8 +++++++-
>  1 file changed, 7 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/arm/mach-socfpga/include/mach/base_addr_a10.h b/arch/arm/mach-socfpga/include/mach/base_addr_a10.h
> index a7056d4..448fbdc 100644
> --- a/arch/arm/mach-socfpga/include/mach/base_addr_a10.h
> +++ b/arch/arm/mach-socfpga/include/mach/base_addr_a10.h
> @@ -1,5 +1,5 @@
>  /*
> - * Copyright (C) 2014 Altera Corporation <www.altera.com>
> + * Copyright (C) 2014-2017 Altera Corporation <www.altera.com>
>   *
>   * SPDX-License-Identifier:	GPL-2.0+
>   */
> @@ -29,14 +29,20 @@
>  #define SOCFPGA_MPUL2_ADDRESS			0xfffff000
>  #define SOCFPGA_I2C0_ADDRESS			0xffc02200
>  #define SOCFPGA_I2C1_ADDRESS			0xffc02300
> +#define SOCFPGA_I2C2_ADDRESS			0xffc02400
> +#define SOCFPGA_I2C3_ADDRESS			0xffc02500
> +#define SOCFPGA_I2C4_ADDRESS			0xffc02600
>  
>  #define SOCFPGA_ECC_OCRAM_ADDRESS		0xff8c3000
>  #define SOCFPGA_UART0_ADDRESS			0xffc02000
>  #define SOCFPGA_OSC1TIMER0_ADDRESS		0xffd00000
> +#define SOCFPGA_OSC1TIMER1_ADDRESS		0xffd00100
>  #define SOCFPGA_CLKMGR_ADDRESS			0xffd04000
>  #define SOCFPGA_RSTMGR_ADDRESS			0xffd05000
>  
>  #define SOCFPGA_SDR_ADDRESS			0xffcfb000
> +#define SOCFPGA_NOC_L4_PRIV_FLT_OFST		0xffd11000
> +#define SOCFPGA_NOC_FW_H2F_SCR_OFST		0xffd13500
>  #define SOCFPGA_SDR_SCHEDULER_ADDRESS		0xffd12400
>  #define SOCFPGA_SDR_FIREWALL_OCRAM_ADDRESS	0xffd13200
>  #define SOCFPGA_SDR_FIREWALL_MPU_FPGA_ADDRESS	0xffd13300
> 


-- 
Best regards,
Marek Vasut

^ permalink raw reply	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 07/20] arm: socfpga: Add reset driver support for Arria 10
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 07/20] arm: socfpga: Add reset driver support for Arria 10 Ley Foon Tan
@ 2017-03-10  1:40   ` Marek Vasut
  2017-03-23  5:55     ` Ley Foon Tan
  0 siblings, 1 reply; 60+ messages in thread
From: Marek Vasut @ 2017-03-10  1:40 UTC (permalink / raw)
  To: u-boot

On 03/09/2017 01:26 AM, Ley Foon Tan wrote:
> Add reset driver support for Arria 10.
> 
> Signed-off-by: Tien Fong Chee <tien.fong.chee@intel.com>
> Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
> ---
>  arch/arm/mach-socfpga/Makefile                     |   2 +
>  arch/arm/mach-socfpga/include/mach/reset_manager.h |   2 +
>  .../include/mach/reset_manager_arria10.h           | 143 ++++++++
>  arch/arm/mach-socfpga/reset_manager_arria10.c      | 362 +++++++++++++++++++++
>  include/dt-bindings/reset/altr,rst-mgr-a10.h       | 103 ++++++
>  5 files changed, 612 insertions(+)
>  create mode 100644 arch/arm/mach-socfpga/include/mach/reset_manager_arria10.h
>  create mode 100644 arch/arm/mach-socfpga/reset_manager_arria10.c
>  create mode 100644 include/dt-bindings/reset/altr,rst-mgr-a10.h
> 
> diff --git a/arch/arm/mach-socfpga/Makefile b/arch/arm/mach-socfpga/Makefile
> index e83da2e..d81f003 100644
> --- a/arch/arm/mach-socfpga/Makefile
> +++ b/arch/arm/mach-socfpga/Makefile
> @@ -10,6 +10,8 @@
>  obj-y	+= misc.o timer.o reset_manager.o clock_manager.o \
>  	   fpga_manager.o board.o
>  
> +obj-$(CONFIG_TARGET_SOCFPGA_ARRIA10) += reset_manager_arria10.o
> +
>  obj-$(CONFIG_SPL_BUILD) += spl.o freeze_controller.o
>  
>  # QTS-generated config file wrappers
> diff --git a/arch/arm/mach-socfpga/include/mach/reset_manager.h b/arch/arm/mach-socfpga/include/mach/reset_manager.h
> index 9e253bf..57dc034 100644
> --- a/arch/arm/mach-socfpga/include/mach/reset_manager.h
> +++ b/arch/arm/mach-socfpga/include/mach/reset_manager.h
> @@ -45,6 +45,8 @@ void socfpga_per_reset_all(void);
>  
>  #if defined(CONFIG_TARGET_SOCFPGA_GEN5)
>  #include <asm/arch/reset_manager_gen5.h>
> +#elif defined(CONFIG_TARGET_SOCFPGA_ARRIA10)
> +#include <asm/arch/reset_manager_arria10.h>
>  #endif
>  
>  #endif /* _RESET_MANAGER_H_ */
> diff --git a/arch/arm/mach-socfpga/include/mach/reset_manager_arria10.h b/arch/arm/mach-socfpga/include/mach/reset_manager_arria10.h
> new file mode 100644
> index 0000000..e3171d1
> --- /dev/null
> +++ b/arch/arm/mach-socfpga/include/mach/reset_manager_arria10.h
> @@ -0,0 +1,143 @@
> +/*
> + * Copyright (C) 2016-2017 Intel Corporation
> + *
> + * SPDX-License-Identifier:	GPL-2.0
> + */
> +
> +#ifndef _RESET_MANAGER_ARRIA10_H_
> +#define _RESET_MANAGER_ARRIA10_H_
> +
> +void watchdog_disable(void);
> +void reset_deassert_noc_ddr_scheduler(void);
> +int is_wdt_in_reset(void);
> +void emac_manage_reset(ulong emacbase, uint state);
> +int reset_deassert_bridges_handoff(void);
> +void reset_assert_fpga_connected_peripherals(void);
> +void reset_deassert_osc1wd0(void);

Nit, it'd be nice to prefix all exported functions with socfpga_ , so
it's obvious where they come from if you debug u-boot .

> +struct socfpga_reset_manager {
> +	u32	stat;
> +	u32	ramstat;
> +	u32	miscstat;
> +	u32	ctrl;
> +	u32	hdsken;
> +	u32	hdskreq;
> +	u32	hdskack;
> +	u32	counts;
> +	u32	mpumodrst;
> +	u32	per0modrst;
> +	u32	per1modrst;
> +	u32	brgmodrst;
> +	u32	sysmodrst;
> +	u32	coldmodrst;
> +	u32	nrstmodrst;
> +	u32	dbgmodrst;
> +	u32	mpuwarmmask;
> +	u32	per0warmmask;
> +	u32	per1warmmask;
> +	u32	brgwarmmask;
> +	u32	syswarmmask;
> +	u32	nrstwarmmask;
> +	u32	l3warmmask;
> +	u32	tststa;
> +	u32	tstscratch;
> +	u32	hdsktimeout;
> +	u32	hmcintr;
> +	u32	hmcintren;
> +	u32	hmcintrens;
> +	u32	hmcintrenr;
> +	u32	hmcgpout;
> +	u32	hmcgpin;
> +};
> +
> +/*
> + * SocFPGA Arria10 reset IDs, bank mapping is as follows:
> + * 0 ... mpumodrst
> + * 1 ... per0modrst
> + * 2 ... per1modrst
> + * 3 ... brgmodrst
> + * 4 ... sysmodrst
> + */
> +#define RSTMGR_EMAC0		RSTMGR_DEFINE(1, 0)
> +#define RSTMGR_EMAC1		RSTMGR_DEFINE(1, 1)
> +#define RSTMGR_EMAC2		RSTMGR_DEFINE(1, 2)
> +#define RSTMGR_NAND		RSTMGR_DEFINE(1, 5)
> +#define RSTMGR_QSPI		RSTMGR_DEFINE(1, 6)
> +#define RSTMGR_SDMMC		RSTMGR_DEFINE(1, 7)
> +#define RSTMGR_DMA		RSTMGR_DEFINE(1, 16)
> +#define RSTMGR_SPIM0		RSTMGR_DEFINE(1, 17)
> +#define RSTMGR_SPIM1		RSTMGR_DEFINE(1, 18)
> +#define RSTMGR_L4WD0		RSTMGR_DEFINE(2, 0)
> +#define RSTMGR_L4WD1		RSTMGR_DEFINE(2, 1)
> +#define RSTMGR_L4SYSTIMER0	RSTMGR_DEFINE(2, 2)
> +#define RSTMGR_L4SYSTIMER1	RSTMGR_DEFINE(2, 3)
> +#define RSTMGR_SPTIMER0		RSTMGR_DEFINE(2, 4)
> +#define RSTMGR_SPTIMER1		RSTMGR_DEFINE(2, 5)
> +#define RSTMGR_UART0		RSTMGR_DEFINE(2, 16)
> +#define RSTMGR_UART1		RSTMGR_DEFINE(2, 17)
> +#define RSTMGR_DDRSCH		RSTMGR_DEFINE(3, 6)
> +
> +#define ALT_RSTMGR_CTL_SWWARMRSTREQ_SET_MSK	BIT(1)
> +#define ALT_RSTMGR_PER0MODRST_EMAC0_SET_MSK	BIT(0)
> +#define ALT_RSTMGR_PER0MODRST_EMAC1_SET_MSK	BIT(1)
> +#define ALT_RSTMGR_PER0MODRST_EMAC2_SET_MSK	BIT(2)
> +#define ALT_RSTMGR_PER0MODRST_USB0_SET_MSK	BIT(3)
> +#define ALT_RSTMGR_PER0MODRST_USB1_SET_MSK	BIT(4)
> +#define ALT_RSTMGR_PER0MODRST_NAND_SET_MSK	BIT(5)
> +#define ALT_RSTMGR_PER0MODRST_QSPI_SET_MSK	BIT(6)
> +#define ALT_RSTMGR_PER0MODRST_SDMMC_SET_MSK	BIT(7)
> +#define ALT_RSTMGR_PER0MODRST_EMACECC0_SET_MSK	BIT(8)
> +#define ALT_RSTMGR_PER0MODRST_EMACECC1_SET_MSK	BIT(9)
> +#define ALT_RSTMGR_PER0MODRST_EMACECC2_SET_MSK	BIT(10)
> +#define ALT_RSTMGR_PER0MODRST_USBECC0_SET_MSK	BIT(11)
> +#define ALT_RSTMGR_PER0MODRST_USBECC1_SET_MSK	BIT(12)
> +#define ALT_RSTMGR_PER0MODRST_NANDECC_SET_MSK	BIT(13)
> +#define ALT_RSTMGR_PER0MODRST_QSPIECC_SET_MSK	BIT(14)
> +#define ALT_RSTMGR_PER0MODRST_SDMMCECC_SET_MSK	BIT(15)
> +#define ALT_RSTMGR_PER0MODRST_DMA_SET_MSK	BIT(16)
> +#define ALT_RSTMGR_PER0MODRST_SPIM0_SET_MSK	BIT(17)
> +#define ALT_RSTMGR_PER0MODRST_SPIM1_SET_MSK	BIT(18)
> +#define ALT_RSTMGR_PER0MODRST_SPIS0_SET_MSK	BIT(19)
> +#define ALT_RSTMGR_PER0MODRST_SPIS1_SET_MSK	BIT(20)
> +#define ALT_RSTMGR_PER0MODRST_DMAECC_SET_MSK	BIT(21)
> +#define ALT_RSTMGR_PER0MODRST_EMACPTP_SET_MSK	BIT(22)
> +#define ALT_RSTMGR_PER0MODRST_DMAIF0_SET_MSK	BIT(24)
> +#define ALT_RSTMGR_PER0MODRST_DMAIF1_SET_MSK	BIT(25)
> +#define ALT_RSTMGR_PER0MODRST_DMAIF2_SET_MSK	BIT(26)
> +#define ALT_RSTMGR_PER0MODRST_DMAIF3_SET_MSK	BIT(27)
> +#define ALT_RSTMGR_PER0MODRST_DMAIF4_SET_MSK	BIT(28)
> +#define ALT_RSTMGR_PER0MODRST_DMAIF5_SET_MSK	BIT(29)
> +#define ALT_RSTMGR_PER0MODRST_DMAIF6_SET_MSK	BIT(30)
> +#define ALT_RSTMGR_PER0MODRST_DMAIF7_SET_MSK	BIT(31)
> +
> +#define ALT_RSTMGR_PER1MODRST_WD0_SET_MSK	BIT(0)
> +#define ALT_RSTMGR_PER1MODRST_WD1_SET_MSK	BIT(1)
> +#define ALT_RSTMGR_PER1MODRST_L4SYSTMR0_SET_MSK	BIT(2)
> +#define ALT_RSTMGR_PER1MODRST_L4SYSTMR1_SET_MSK	BIT(3)
> +#define ALT_RSTMGR_PER1MODRST_SPTMR0_SET_MSK	BIT(4)
> +#define ALT_RSTMGR_PER1MODRST_SPTMR1_SET_MSK	BIT(5)
> +#define ALT_RSTMGR_PER1MODRST_I2C0_SET_MSK	BIT(8)
> +#define ALT_RSTMGR_PER1MODRST_I2C1_SET_MSK	BIT(9)
> +#define ALT_RSTMGR_PER1MODRST_I2C2_SET_MSK	BIT(10)
> +#define ALT_RSTMGR_PER1MODRST_I2C3_SET_MSK	BIT(11)
> +#define ALT_RSTMGR_PER1MODRST_I2C4_SET_MSK	BIT(12)
> +#define ALT_RSTMGR_PER1MODRST_UART0_SET_MSK	BIT(16)
> +#define ALT_RSTMGR_PER1MODRST_UART1_SET_MSK	BIT(17)
> +#define ALT_RSTMGR_PER1MODRST_GPIO0_SET_MSK	BIT(24)
> +#define ALT_RSTMGR_PER1MODRST_GPIO1_SET_MSK	BIT(25)
> +#define ALT_RSTMGR_PER1MODRST_GPIO2_SET_MSK	BIT(26)
> +
> +#define ALT_RSTMGR_BRGMODRST_H2F_SET_MSK	BIT(0)
> +#define ALT_RSTMGR_BRGMODRST_LWH2F_SET_MSK	BIT(1)
> +#define ALT_RSTMGR_BRGMODRST_F2H_SET_MSK	BIT(2)
> +#define ALT_RSTMGR_BRGMODRST_F2SSDRAM0_SET_MSK	BIT(3)
> +#define ALT_RSTMGR_BRGMODRST_F2SSDRAM1_SET_MSK	BIT(4)
> +#define ALT_RSTMGR_BRGMODRST_F2SSDRAM2_SET_MSK	BIT(5)
> +#define ALT_RSTMGR_BRGMODRST_DDRSCH_SET_MSK	BIT(6)
> +
> +#define ALT_RSTMGR_HDSKEN_SDRSELFREFEN_SET_MSK	BIT(0)
> +#define ALT_RSTMGR_HDSKEN_FPGAMGRHSEN_SET_MSK	BIT(1)
> +#define ALT_RSTMGR_HDSKEN_FPGAHSEN_SET_MSK	BIT(2)
> +#define ALT_RSTMGR_HDSKEN_ETRSTALLEN_SET_MSK	BIT(3)
> +
> +#endif /* _RESET_MANAGER_ARRIA10_H_ */
> diff --git a/arch/arm/mach-socfpga/reset_manager_arria10.c b/arch/arm/mach-socfpga/reset_manager_arria10.c
> new file mode 100644
> index 0000000..547a8bb
> --- /dev/null
> +++ b/arch/arm/mach-socfpga/reset_manager_arria10.c
> @@ -0,0 +1,362 @@
> +/*
> + * Copyright (C) 2016-2017 Intel Corporation
> + *
> + * SPDX-License-Identifier:    GPL-2.0
> + */
> +
> +#include <asm/io.h>
> +#include <asm/arch/fpga_manager.h>
> +#include <asm/arch/misc.h>
> +#include <asm/arch/reset_manager.h>
> +#include <asm/arch/system_manager.h>
> +#include <common.h>
> +#include <errno.h>
> +#include <fdtdec.h>
> +#include <wait_bit.h>
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +static const struct socfpga_reset_manager *reset_manager_base =
> +		(void *)SOCFPGA_RSTMGR_ADDRESS;
> +static const struct socfpga_system_manager *sysmgr_regs =
> +		(struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS;
> +
> +#define ECC_MASK (ALT_RSTMGR_PER0MODRST_EMACECC0_SET_MSK | \
> +	ALT_RSTMGR_PER0MODRST_EMACECC1_SET_MSK | \
> +	ALT_RSTMGR_PER0MODRST_EMACECC2_SET_MSK | \
> +	ALT_RSTMGR_PER0MODRST_NANDECC_SET_MSK | \
> +	ALT_RSTMGR_PER0MODRST_QSPIECC_SET_MSK | \
> +	ALT_RSTMGR_PER0MODRST_SDMMCECC_SET_MSK)
> +
> +static const u32 per0fpgamasks[] = {
> +	ALT_RSTMGR_PER0MODRST_EMACECC0_SET_MSK |
> +	ALT_RSTMGR_PER0MODRST_EMAC0_SET_MSK,
> +	ALT_RSTMGR_PER0MODRST_EMACECC1_SET_MSK |
> +	ALT_RSTMGR_PER0MODRST_EMAC1_SET_MSK,
> +	ALT_RSTMGR_PER0MODRST_EMACECC2_SET_MSK |
> +	ALT_RSTMGR_PER0MODRST_EMAC2_SET_MSK,
> +	0, /* i2c0 per1mod */
> +	0, /* i2c1 per1mod */
> +	0, /* i2c0_emac */
> +	0, /* i2c1_emac */
> +	0, /* i2c2_emac */
> +	ALT_RSTMGR_PER0MODRST_NANDECC_SET_MSK |
> +	ALT_RSTMGR_PER0MODRST_NAND_SET_MSK,
> +	ALT_RSTMGR_PER0MODRST_QSPIECC_SET_MSK |
> +	ALT_RSTMGR_PER0MODRST_QSPI_SET_MSK,
> +	ALT_RSTMGR_PER0MODRST_SDMMCECC_SET_MSK |
> +	ALT_RSTMGR_PER0MODRST_SDMMC_SET_MSK,
> +	ALT_RSTMGR_PER0MODRST_SPIM0_SET_MSK,
> +	ALT_RSTMGR_PER0MODRST_SPIM1_SET_MSK,
> +	ALT_RSTMGR_PER0MODRST_SPIS0_SET_MSK,
> +	ALT_RSTMGR_PER0MODRST_SPIS1_SET_MSK,
> +	0, /* uart0 per1mod */
> +	0, /* uart1 per1mod */
> +};
> +
> +static const u32 per1fpgamasks[] = {
> +	0, /* emac0 per0mod */
> +	0, /* emac1 per0mod */
> +	0, /* emac2 per0mod */
> +	ALT_RSTMGR_PER1MODRST_I2C0_SET_MSK,
> +	ALT_RSTMGR_PER1MODRST_I2C1_SET_MSK,
> +	ALT_RSTMGR_PER1MODRST_I2C2_SET_MSK, /* i2c0_emac */
> +	ALT_RSTMGR_PER1MODRST_I2C3_SET_MSK, /* i2c1_emac */
> +	ALT_RSTMGR_PER1MODRST_I2C4_SET_MSK, /* i2c2_emac */
> +	0, /* nand per0mod */
> +	0, /* qspi per0mod */
> +	0, /* sdmmc per0mod */
> +	0, /* spim0 per0mod */
> +	0, /* spim1 per0mod */
> +	0, /* spis0 per0mod */
> +	0, /* spis1 per0mod */
> +	ALT_RSTMGR_PER1MODRST_UART0_SET_MSK,
> +	ALT_RSTMGR_PER1MODRST_UART1_SET_MSK,
> +};
> +
> +struct bridge_cfg {
> +	int compat_id;
> +	u32  mask_noc;
> +	u32  mask_rstmgr;
> +};
> +
> +static const struct bridge_cfg bridge_cfg_tbl[] = {
> +	{
> +		COMPAT_ALTERA_SOCFPGA_H2F_BRG,
> +		ALT_SYSMGR_NOC_H2F_SET_MSK,
> +		ALT_RSTMGR_BRGMODRST_H2F_SET_MSK,
> +	},
> +	{
> +		COMPAT_ALTERA_SOCFPGA_LWH2F_BRG,
> +		ALT_SYSMGR_NOC_LWH2F_SET_MSK,
> +		ALT_RSTMGR_BRGMODRST_LWH2F_SET_MSK,
> +	},
> +	{
> +		COMPAT_ALTERA_SOCFPGA_F2H_BRG,
> +		ALT_SYSMGR_NOC_F2H_SET_MSK,
> +		ALT_RSTMGR_BRGMODRST_F2H_SET_MSK,
> +	},
> +	{
> +		COMPAT_ALTERA_SOCFPGA_F2SDR0,
> +		ALT_SYSMGR_NOC_F2SDR0_SET_MSK,
> +		ALT_RSTMGR_BRGMODRST_F2SSDRAM0_SET_MSK,
> +	},
> +	{
> +		COMPAT_ALTERA_SOCFPGA_F2SDR1,
> +		ALT_SYSMGR_NOC_F2SDR1_SET_MSK,
> +		ALT_RSTMGR_BRGMODRST_F2SSDRAM1_SET_MSK,
> +	},
> +	{
> +		COMPAT_ALTERA_SOCFPGA_F2SDR2,
> +		ALT_SYSMGR_NOC_F2SDR2_SET_MSK,
> +		ALT_RSTMGR_BRGMODRST_F2SSDRAM2_SET_MSK,
> +	},
> +};
> +
> +/* Disable the watchdog (toggle reset to watchdog) */
> +void watchdog_disable(void)
> +{
> +	/* assert reset for watchdog */
> +	setbits_le32(&reset_manager_base->per1modrst,
> +		     ALT_RSTMGR_PER1MODRST_WD0_SET_MSK);
> +}
> +
> +/* Release NOC ddr scheduler from reset */
> +void reset_deassert_noc_ddr_scheduler(void)
> +{
> +	clrbits_le32(&reset_manager_base->brgmodrst,
> +		     ALT_RSTMGR_BRGMODRST_DDRSCH_SET_MSK);
> +}
> +
> +/* Check whether Watchdog in reset state? */
> +int is_wdt_in_reset(void)
> +{
> +	u32 val;
> +
> +	val = readl(&reset_manager_base->per1modrst);
> +	val &= ALT_RSTMGR_PER1MODRST_WD0_SET_MSK;
> +
> +	/* return 0x1 if watchdog in reset */
> +	return val;
> +}
> +
> +/* emacbase: base address of emac to enable/disable reset
> + * state: 0 - disable reset, !0 - enable reset
> + */
> +void emac_manage_reset(ulong emacbase, uint state)
> +{
> +	ulong eccmask;
> +	ulong emacmask;
> +
> +	switch (emacbase) {
> +	case SOCFPGA_EMAC0_ADDRESS:
> +		eccmask = ALT_RSTMGR_PER0MODRST_EMACECC0_SET_MSK;
> +		emacmask = ALT_RSTMGR_PER0MODRST_EMAC0_SET_MSK;
> +		break;
> +	case SOCFPGA_EMAC1_ADDRESS:
> +		eccmask = ALT_RSTMGR_PER0MODRST_EMACECC1_SET_MSK;
> +		emacmask = ALT_RSTMGR_PER0MODRST_EMAC1_SET_MSK;
> +		break;
> +	case SOCFPGA_EMAC2_ADDRESS:
> +		eccmask = ALT_RSTMGR_PER0MODRST_EMACECC2_SET_MSK;
> +		emacmask = ALT_RSTMGR_PER0MODRST_EMAC2_SET_MSK;
> +		break;
> +	default:
> +		error("emac base address unexpected! %lx", emacbase);
> +		hang();
> +		break;
> +	}
> +
> +	if (state) {
> +		/* Enable ECC OCP first */
> +		setbits_le32(&reset_manager_base->per0modrst, eccmask);
> +		setbits_le32(&reset_manager_base->per0modrst, emacmask);
> +	} else {
> +		/* Disable ECC OCP first */
> +		clrbits_le32(&reset_manager_base->per0modrst, emacmask);
> +		clrbits_le32(&reset_manager_base->per0modrst, eccmask);
> +	}
> +}
> +
> +static int get_bridge_init_val(const void *blob, int compat_id)
> +{
> +	int node;
> +
> +	node = fdtdec_next_compatible(blob, 0, compat_id);
> +	if (node < 0)
> +		return 0;
> +
> +	return fdtdec_get_uint(blob, node, "init-val", 0);
> +}
> +
> +/* Enable bridges (hps2fpga, lwhps2fpga, fpga2hps, fpga2sdram) per handoff */
> +int reset_deassert_bridges_handoff(void)
> +{
> +	u32 mask_noc = 0, mask_rstmgr = 0;
> +	int i;
> +
> +	for (i = 0; i < ARRAY_SIZE(bridge_cfg_tbl); i++) {
> +		if (get_bridge_init_val(gd->fdt_blob,
> +					bridge_cfg_tbl[i].compat_id)) {
> +			mask_noc |= bridge_cfg_tbl[i].mask_noc;
> +			mask_rstmgr |= bridge_cfg_tbl[i].mask_rstmgr;
> +		}
> +	}
> +
> +	/* clear idle request to all bridges */
> +	setbits_le32(&sysmgr_regs->noc_idlereq_clr, mask_noc);
> +
> +	/* Release bridges from reset state per handoff value */
> +	clrbits_le32(&reset_manager_base->brgmodrst, mask_rstmgr);
> +
> +	/* Poll until all idleack to 0, timeout at 1000ms */
> +	return wait_for_bit(__func__, &sysmgr_regs->noc_idleack, mask_noc,
> +			    false, 1000, false);
> +}
> +
> +void reset_assert_fpga_connected_peripherals(void)
> +{
> +	u32 mask0 = 0;
> +	u32 mask1 = 0;
> +	u32 fpga_pinux_addr = SOCFPGA_PINMUX_FPGA_INTERFACE_ADDRESS;
> +	int i;
> +
> +	for (i = 0; i < ARRAY_SIZE(per1fpgamasks); i++) {
> +		if (readl(fpga_pinux_addr)) {
> +			mask0 |= per0fpgamasks[i];
> +			mask1 |= per1fpgamasks[i];
> +		}
> +		fpga_pinux_addr += sizeof(u32);
> +	}
> +
> +	setbits_le32(&reset_manager_base->per0modrst, mask0 & ECC_MASK);
> +	setbits_le32(&reset_manager_base->per1modrst, mask1);
> +	setbits_le32(&reset_manager_base->per0modrst, mask0);
> +}
> +
> +/* Release L4 OSC1 Watchdog Timer 0 from reset through reset manager */
> +void reset_deassert_osc1wd0(void)
> +{
> +	clrbits_le32(&reset_manager_base->per1modrst,
> +		     ALT_RSTMGR_PER1MODRST_WD0_SET_MSK);
> +}
> +
> +/*
> + * Assert or de-assert SoCFPGA reset manager reset.
> + */
> +void socfpga_per_reset(u32 reset, int set)
> +{
> +	const u32 *reg;
> +	u32 rstmgr_bank = RSTMGR_BANK(reset);
> +
> +	switch (rstmgr_bank) {
> +	case 0:
> +		reg = &reset_manager_base->mpumodrst;
> +		break;
> +	case 1:
> +		reg = &reset_manager_base->per0modrst;
> +		break;
> +	case 2:
> +		reg = &reset_manager_base->per1modrst;
> +		break;
> +	case 3:
> +		reg = &reset_manager_base->brgmodrst;
> +		break;
> +	case 4:
> +		reg = &reset_manager_base->sysmodrst;
> +		break;
> +
> +	default:
> +		return;
> +	}
> +
> +	if (set)
> +		setbits_le32(reg, 1 << RSTMGR_RESET(reset));
> +	else
> +		clrbits_le32(reg, 1 << RSTMGR_RESET(reset));
> +}
> +
> +/*
> + * Assert reset on every peripheral but L4WD0.
> + * Watchdog must be kept intact to prevent glitches
> + * and/or hangs.
> + * For the Arria10, we disable all the peripherals except L4 watchdog0,
> + * L4 Timer 0, and ECC.
> + */
> +void socfpga_per_reset_all(void)
> +{
> +	const u32 l4wd0 = (1 << RSTMGR_RESET(SOCFPGA_RESET(L4WD0)) |
> +			  (1 << RSTMGR_RESET(SOCFPGA_RESET(L4SYSTIMER0))));
> +	unsigned mask_ecc_ocp =
> +		ALT_RSTMGR_PER0MODRST_EMACECC0_SET_MSK |
> +		ALT_RSTMGR_PER0MODRST_EMACECC1_SET_MSK |
> +		ALT_RSTMGR_PER0MODRST_EMACECC2_SET_MSK |
> +		ALT_RSTMGR_PER0MODRST_USBECC0_SET_MSK |
> +		ALT_RSTMGR_PER0MODRST_USBECC1_SET_MSK |
> +		ALT_RSTMGR_PER0MODRST_NANDECC_SET_MSK |
> +		ALT_RSTMGR_PER0MODRST_QSPIECC_SET_MSK |
> +		ALT_RSTMGR_PER0MODRST_SDMMCECC_SET_MSK;
> +
> +	/* disable all components except ECC_OCP, L4 Timer0 and L4 WD0 */
> +	writel(~l4wd0, &reset_manager_base->per1modrst);
> +	setbits_le32(&reset_manager_base->per0modrst, ~mask_ecc_ocp);
> +
> +	/* Finally disable the ECC_OCP */
> +	setbits_le32(&reset_manager_base->per0modrst, mask_ecc_ocp);
> +}
> +
> +#if defined(CONFIG_SOCFPGA_VIRTUAL_TARGET)
> +void socfpga_bridges_reset(int enable)
> +{
> +	/* For SoCFPGA-VT, this is NOP. */
> +}
> +#else
> +void socfpga_bridges_reset(int enable)
> +{
> +	/* Disable all the bridges (hps2fpga, lwhps2fpga, fpga2hps,
> +	   fpga2sdram) */
> +	/* set idle request to all bridges */
> +	writel(ALT_SYSMGR_NOC_H2F_SET_MSK |
> +		ALT_SYSMGR_NOC_LWH2F_SET_MSK |
> +		ALT_SYSMGR_NOC_F2H_SET_MSK |
> +		ALT_SYSMGR_NOC_F2SDR0_SET_MSK |
> +		ALT_SYSMGR_NOC_F2SDR1_SET_MSK |
> +		ALT_SYSMGR_NOC_F2SDR2_SET_MSK,
> +		&sysmgr_regs->noc_idlereq_set);
> +
> +	/* Enable the NOC timeout */
> +	writel(ALT_SYSMGR_NOC_TMO_EN_SET_MSK, &sysmgr_regs->noc_timeout);
> +
> +	/* Poll until all idleack to 1 */
> +	wait_for_bit(__func__, &sysmgr_regs->noc_idleack,
> +		     ALT_SYSMGR_NOC_H2F_SET_MSK |
> +		     ALT_SYSMGR_NOC_LWH2F_SET_MSK |
> +		     ALT_SYSMGR_NOC_F2H_SET_MSK |
> +		     ALT_SYSMGR_NOC_F2SDR0_SET_MSK |
> +		     ALT_SYSMGR_NOC_F2SDR1_SET_MSK |
> +		     ALT_SYSMGR_NOC_F2SDR2_SET_MSK,
> +		     true, 10000, false);

You should check return value of all these wait_for_bit() calls,
otherwise you might ignore errors.

> +	/* Poll until all idlestatus to 1 */
> +	wait_for_bit(__func__, &sysmgr_regs->noc_idlestatus,
> +		     ALT_SYSMGR_NOC_H2F_SET_MSK |
> +		     ALT_SYSMGR_NOC_LWH2F_SET_MSK |
> +		     ALT_SYSMGR_NOC_F2H_SET_MSK |
> +		     ALT_SYSMGR_NOC_F2SDR0_SET_MSK |
> +		     ALT_SYSMGR_NOC_F2SDR1_SET_MSK |
> +		     ALT_SYSMGR_NOC_F2SDR2_SET_MSK,
> +		     true, 10000, false);
> +
> +	/* Put all bridges (except NOR DDR scheduler) into reset state */
> +	setbits_le32(&reset_manager_base->brgmodrst,
> +		     (ALT_RSTMGR_BRGMODRST_H2F_SET_MSK |
> +		     ALT_RSTMGR_BRGMODRST_LWH2F_SET_MSK |
> +		     ALT_RSTMGR_BRGMODRST_F2H_SET_MSK |
> +		     ALT_RSTMGR_BRGMODRST_F2SSDRAM0_SET_MSK |
> +		     ALT_RSTMGR_BRGMODRST_F2SSDRAM1_SET_MSK |
> +		     ALT_RSTMGR_BRGMODRST_F2SSDRAM2_SET_MSK));
> +
> +	/* Disable NOC timeout */
> +	writel(0, &sysmgr_regs->noc_timeout);
> +}
> +#endif
> diff --git a/include/dt-bindings/reset/altr,rst-mgr-a10.h b/include/dt-bindings/reset/altr,rst-mgr-a10.h
> new file mode 100644
> index 0000000..99875de
> --- /dev/null
> +++ b/include/dt-bindings/reset/altr,rst-mgr-a10.h
> @@ -0,0 +1,103 @@
> +/*
> + * Copyright (C) 2016-2017 Intel Corporation
> + *
> + * SPDX-License-Identifier:	GPL-2.0
> + */
> +
> +#ifndef _DT_BINDINGS_RESET_ALTR_RST_MGR_A10_H
> +#define _DT_BINDINGS_RESET_ALTR_RST_MGR_A10_H
> +
> +/* MPUMODRST */
> +#define CPU0_RESET		0
> +#define CPU1_RESET		1
> +#define WDS_RESET		2
> +#define SCUPER_RESET		3
> +
> +/* PER0MODRST */
> +#define EMAC0_RESET		32
> +#define EMAC1_RESET		33
> +#define EMAC2_RESET		34
> +#define USB0_RESET		35
> +#define USB1_RESET		36
> +#define NAND_RESET		37
> +#define QSPI_RESET		38
> +#define SDMMC_RESET		39
> +#define EMAC0_OCP_RESET		40
> +#define EMAC1_OCP_RESET		41
> +#define EMAC2_OCP_RESET		42
> +#define USB0_OCP_RESET		43
> +#define USB1_OCP_RESET		44
> +#define NAND_OCP_RESET		45
> +#define QSPI_OCP_RESET		46
> +#define SDMMC_OCP_RESET		47
> +#define DMA_RESET		48
> +#define SPIM0_RESET		49
> +#define SPIM1_RESET		50
> +#define SPIS0_RESET		51
> +#define SPIS1_RESET		52
> +#define DMA_OCP_RESET		53
> +#define EMAC_PTP_RESET		54
> +/* 55 is empty*/
> +#define DMAIF0_RESET		56
> +#define DMAIF1_RESET		57
> +#define DMAIF2_RESET		58
> +#define DMAIF3_RESET		59
> +#define DMAIF4_RESET		60
> +#define DMAIF5_RESET		61
> +#define DMAIF6_RESET		62
> +#define DMAIF7_RESET		63
> +
> +/* PER1MODRST */
> +#define L4WD0_RESET		64
> +#define L4WD1_RESET		65
> +#define L4SYSTIMER0_RESET	66
> +#define L4SYSTIMER1_RESET	67
> +#define SPTIMER0_RESET		68
> +#define SPTIMER1_RESET		69
> +/* 70-71 is reserved */
> +#define I2C0_RESET		72
> +#define I2C1_RESET		73
> +#define I2C2_RESET		74
> +#define I2C3_RESET		75
> +#define I2C4_RESET		76
> +/* 77-79 is reserved */
> +#define UART0_RESET		80
> +#define UART1_RESET		81
> +/* 82-87 is reserved */
> +#define GPIO0_RESET		88
> +#define GPIO1_RESET		89
> +#define GPIO2_RESET		90
> +
> +/* BRGMODRST */
> +#define HPS2FPGA_RESET		96
> +#define LWHPS2FPGA_RESET	97
> +#define FPGA2HPS_RESET		98
> +#define F2SSDRAM0_RESET		99
> +#define F2SSDRAM1_RESET		100
> +#define F2SSDRAM2_RESET		101
> +#define DDRSCH_RESET		102
> +
> +/* SYSMODRST*/
> +#define ROM_RESET		128
> +#define OCRAM_RESET		129
> +/* 130 is reserved */
> +#define FPGAMGR_RESET		131
> +#define S2F_RESET		132
> +#define SYSDBG_RESET		133
> +#define OCRAM_OCP_RESET		134
> +
> +/* COLDMODRST */
> +#define CLKMGRCOLD_RESET	160
> +/* 161-162 is reserved */
> +#define S2FCOLD_RESET		163
> +#define TIMESTAMPCOLD_RESET	164
> +#define TAPCOLD_RESET		165
> +#define HMCCOLD_RESET		166
> +#define IOMGRCOLD_RESET		167
> +
> +/* NRSTMODRST */
> +#define NRSTPINOE_RESET		192
> +
> +/* DBGMODRST */
> +#define DBG_RESET		224
> +#endif
> 


-- 
Best regards,
Marek Vasut

^ permalink raw reply	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 08/20] arm: socfpga: Add clock driver for Arria 10
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 08/20] arm: socfpga: Add clock driver " Ley Foon Tan
@ 2017-03-10  1:47   ` Marek Vasut
  2017-03-22  6:14     ` Ley Foon Tan
  0 siblings, 1 reply; 60+ messages in thread
From: Marek Vasut @ 2017-03-10  1:47 UTC (permalink / raw)
  To: u-boot

On 03/09/2017 01:26 AM, Ley Foon Tan wrote:
> Add clock driver support for Arria 10.
> 
> Signed-off-by: Tien Fong Chee <tien.fong.chee@intel.com>
> Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
> ---
>  arch/arm/mach-socfpga/Makefile                     |    3 +-
>  arch/arm/mach-socfpga/clock_manager.c              |   18 +-
>  arch/arm/mach-socfpga/clock_manager_arria10.c      | 1104 ++++++++++++++++++++
>  arch/arm/mach-socfpga/include/mach/clock_manager.h |    6 +
>  .../include/mach/clock_manager_arria10.h           |  222 ++++
>  5 files changed, 1350 insertions(+), 3 deletions(-)
>  create mode 100644 arch/arm/mach-socfpga/clock_manager_arria10.c
>  create mode 100644 arch/arm/mach-socfpga/include/mach/clock_manager_arria10.h
> 
> diff --git a/arch/arm/mach-socfpga/Makefile b/arch/arm/mach-socfpga/Makefile
> index d81f003..c494930 100644
> --- a/arch/arm/mach-socfpga/Makefile
> +++ b/arch/arm/mach-socfpga/Makefile
> @@ -10,7 +10,8 @@
>  obj-y	+= misc.o timer.o reset_manager.o clock_manager.o \
>  	   fpga_manager.o board.o
>  
> -obj-$(CONFIG_TARGET_SOCFPGA_ARRIA10) += reset_manager_arria10.o
> +obj-$(CONFIG_TARGET_SOCFPGA_ARRIA10) += clock_manager_arria10.o \
> +					reset_manager_arria10.o
>  
>  obj-$(CONFIG_SPL_BUILD) += spl.o freeze_controller.o
>  
> diff --git a/arch/arm/mach-socfpga/clock_manager.c b/arch/arm/mach-socfpga/clock_manager.c
> index c2af6f3..ad602c8 100644
> --- a/arch/arm/mach-socfpga/clock_manager.c
> +++ b/arch/arm/mach-socfpga/clock_manager.c
> @@ -5,6 +5,8 @@
>   */
>  
>  #include <common.h>
> +#include <fdtdec.h>
> +#include <wait_bit.h>
>  #include <asm/io.h>
>  #include <asm/arch/clock_manager.h>
>  
> @@ -18,7 +20,12 @@ void cm_wait_for_lock(u32 mask)
>  	u32 inter_val;
>  	u32 retry = 0;
>  	do {
> +#if defined(CONFIG_TARGET_SOCFPGA_GEN5)
>  		inter_val = readl(&clock_manager_base->inter) & mask;
> +#elif defined(CONFIG_TARGET_SOCFPGA_ARRIA10)
> +		inter_val = readl(&clock_manager_base->stat) & mask;
> +#endif
> +		/* Wait for stable lock */
>  		if (inter_val == mask)
>  			retry++;
>  		else
> @@ -31,8 +38,10 @@ void cm_wait_for_lock(u32 mask)
>  /* function to poll in the fsm busy bit */
>  void cm_wait_for_fsm(void)
>  {
> -	while (readl(&clock_manager_base->stat) & CLKMGR_STAT_BUSY)
> -		;
> +	wait_for_bit(__func__, (const u32 *)&clock_manager_base->stat,
> +		     CLKMGR_CLKMGR_STAT_BUSY_SET_MSK,
> +		     false, 20000, false);

Please do test this change on CV or AV if you didn't already.

> +
>  }
>  
>  int set_cpu_clk_info(void)
> @@ -43,7 +52,12 @@ int set_cpu_clk_info(void)
>  
>  	gd->bd->bi_arm_freq = cm_get_mpu_clk_hz() / 1000000;
>  	gd->bd->bi_dsp_freq = 0;
> +
> +#if defined(CONFIG_TARGET_SOCFPGA_GEN5)
>  	gd->bd->bi_ddr_freq = cm_get_sdram_clk_hz() / 1000000;
> +#elif defined(CONFIG_TARGET_SOCFPGA_ARRIA10)
> +	gd->bd->bi_ddr_freq = 0;
> +#endif
>  
>  	return 0;
>  }
> diff --git a/arch/arm/mach-socfpga/clock_manager_arria10.c b/arch/arm/mach-socfpga/clock_manager_arria10.c
> new file mode 100644
> index 0000000..67b3e58
> --- /dev/null
> +++ b/arch/arm/mach-socfpga/clock_manager_arria10.c
> @@ -0,0 +1,1104 @@
> +/*
> + * Copyright (C) 2016-2017 Intel Corporation
> + *
> + * SPDX-License-Identifier:    GPL-2.0
> + */
> +
> +#include <common.h>
> +#include <fdtdec.h>
> +#include <asm/io.h>
> +#include <asm/arch/clock_manager.h>
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +static u32 eosc1_hz;
> +static u32 cb_intosc_hz;
> +static u32 f2s_free_hz;
> +static u32 cm_l4_main_clk_hz;
> +static u32 cm_l4_sp_clk_hz;
> +static u32 cm_l4_mp_clk_hz;
> +static u32 cm_l4_sys_free_clk_hz;
> +
> +struct mainpll_cfg {
> +	u32 vco0_psrc;
> +	u32 vco1_denom;
> +	u32 vco1_numer;
> +	u32 mpuclk;
> +	u32 mpuclk_cnt;
> +	u32 mpuclk_src;
> +	u32 nocclk;
> +	u32 nocclk_cnt;
> +	u32 nocclk_src;
> +	u32 cntr2clk_cnt;
> +	u32 cntr3clk_cnt;
> +	u32 cntr4clk_cnt;
> +	u32 cntr5clk_cnt;
> +	u32 cntr6clk_cnt;
> +	u32 cntr7clk_cnt;
> +	u32 cntr7clk_src;
> +	u32 cntr8clk_cnt;
> +	u32 cntr9clk_cnt;
> +	u32 cntr9clk_src;
> +	u32 cntr15clk_cnt;
> +	u32 nocdiv_l4mainclk;
> +	u32 nocdiv_l4mpclk;
> +	u32 nocdiv_l4spclk;
> +	u32 nocdiv_csatclk;
> +	u32 nocdiv_cstraceclk;
> +	u32 nocdiv_cspdbclk;
> +};
> +
> +struct perpll_cfg {
> +	u32 vco0_psrc;
> +	u32 vco1_denom;
> +	u32 vco1_numer;
> +	u32 cntr2clk_cnt;
> +	u32 cntr2clk_src;
> +	u32 cntr3clk_cnt;
> +	u32 cntr3clk_src;
> +	u32 cntr4clk_cnt;
> +	u32 cntr4clk_src;
> +	u32 cntr5clk_cnt;
> +	u32 cntr5clk_src;
> +	u32 cntr6clk_cnt;
> +	u32 cntr6clk_src;
> +	u32 cntr7clk_cnt;
> +	u32 cntr8clk_cnt;
> +	u32 cntr8clk_src;
> +	u32 cntr9clk_cnt;
> +	u32 emacctl_emac0sel;
> +	u32 emacctl_emac1sel;
> +	u32 emacctl_emac2sel;
> +	u32 gpiodiv_gpiodbclk;
> +};
> +
> +struct alteragrp_cfg {
> +	u32 nocclk;
> +	u32 mpuclk;
> +};
> +
> +static const struct socfpga_clock_manager *clock_manager_base =
> +	(struct socfpga_clock_manager *)SOCFPGA_CLKMGR_ADDRESS;
> +
> +static int of_to_struct(const void *blob, int node, int cfg_len, void *cfg)
> +{
> +	if (fdtdec_get_int_array(blob, node, "altr,of_reg_value",
> +				 (u32 *)cfg, cfg_len)) {
> +		/* could not find required property */
> +		return -EINVAL;
> +	}
> +
> +	return 0;
> +}
> +
> +static int of_get_input_clks(const void *blob, int node, u32 *val)
> +{
> +	*val = fdtdec_get_uint(blob, node, "clock-frequency", 0);
> +	if (!*val)
> +		return -EINVAL;
> +
> +	return 0;
> +}
> +
> +static int of_get_clk_cfg(const void *blob, struct mainpll_cfg *main_cfg,
> +			  struct perpll_cfg *per_cfg,
> +			  struct alteragrp_cfg *altrgrp_cfg)
> +{
> +	int node, child, len;
> +	const char *node_name;
> +
> +	node = fdtdec_next_compatible(blob, 0, COMPAT_ALTERA_SOCFPGA_CLK);
> +	if (node < 0)
> +		return -EINVAL;
> +
> +	child = fdt_first_subnode(blob, node);
> +	if (child < 0)
> +		return -EINVAL;
> +
> +	child = fdt_first_subnode(blob, child);
> +	if (child < 0)
> +		return -EINVAL;
> +
> +	node_name = fdt_get_name(blob, child, &len);
> +
> +	while (node_name) {
> +		if (!strcmp(node_name, "osc1")) {
> +			if (of_get_input_clks(blob, child, &eosc1_hz))
> +				return -EINVAL;
> +		} else if (!strcmp(node_name, "cb_intosc_ls_clk")) {
> +			if (of_get_input_clks(blob, child, &cb_intosc_hz))
> +				return -EINVAL;
> +		} else if (!strcmp(node_name, "f2s_free_clk")) {
> +			if (of_get_input_clks(blob, child, &f2s_free_hz))
> +				return -EINVAL;
> +		} else if (!strcmp(node_name, "main_pll")) {
> +			if (of_to_struct(blob, child,
> +					 sizeof(*main_cfg)/sizeof(u32),
> +					 main_cfg))
> +				return -EINVAL;
> +		} else if (!strcmp(node_name, "periph_pll")) {
> +			if (of_to_struct(blob, child,
> +					 sizeof(*per_cfg)/sizeof(u32),
> +					 per_cfg))
> +				return -EINVAL;
> +		} else if (!strcmp(node_name, "altera")) {
> +			if (of_to_struct(blob, child,
> +					 sizeof(*altrgrp_cfg)/sizeof(u32),
> +					 altrgrp_cfg))
> +				return -EINVAL;
> +
> +			main_cfg->mpuclk = altrgrp_cfg->mpuclk;
> +			main_cfg->nocclk = altrgrp_cfg->nocclk;
> +		}
> +		child = fdt_next_subnode(blob, child);
> +
> +		if (child < 0)
> +			break;
> +
> +		node_name = fdt_get_name(blob, child, &len);
> +	}
> +
> +	return 0;
> +}
> +
> +/* calculate the intended main VCO frequency based on handoff */
> +static unsigned int cm_calc_handoff_main_vco_clk_hz
> +					(struct mainpll_cfg *main_cfg)
> +{
> +	unsigned int clk_hz;
> +
> +	/* Check main VCO clock source: eosc, intosc or f2s? */
> +	switch (main_cfg->vco0_psrc) {
> +	case CLKMGR_MAINPLL_VCO0_PSRC_EOSC:
> +		clk_hz = eosc1_hz;
> +		break;
> +	case CLKMGR_MAINPLL_VCO0_PSRC_E_INTOSC:
> +		clk_hz = cb_intosc_hz;
> +		break;
> +	case CLKMGR_MAINPLL_VCO0_PSRC_F2S:
> +		clk_hz = f2s_free_hz;
> +		break;
> +	default:
> +		return 0;
> +	}
> +
> +	/* calculate the VCO frequency */
> +	clk_hz /= (1 + main_cfg->vco1_denom);
> +	clk_hz *= (1 + main_cfg->vco1_numer);
> +
> +	return clk_hz;
> +}
> +
> +/* calculate the intended periph VCO frequency based on handoff */
> +static unsigned int cm_calc_handoff_periph_vco_clk_hz(
> +		struct mainpll_cfg *main_cfg, struct perpll_cfg *per_cfg)
> +{
> +	unsigned int clk_hz;
> +
> +	/* Check periph VCO clock source: eosc, intosc, f2s or mainpll? */
> +	switch (per_cfg->vco0_psrc) {
> +	case CLKMGR_PERPLL_VCO0_PSRC_EOSC:
> +		clk_hz = eosc1_hz;
> +		break;
> +	case CLKMGR_PERPLL_VCO0_PSRC_E_INTOSC:
> +		clk_hz = cb_intosc_hz;
> +		break;
> +	case CLKMGR_PERPLL_VCO0_PSRC_F2S:
> +		clk_hz = f2s_free_hz;
> +		break;
> +	case CLKMGR_PERPLL_VCO0_PSRC_MAIN:
> +		clk_hz = cm_calc_handoff_main_vco_clk_hz(main_cfg);
> +		clk_hz /= main_cfg->cntr15clk_cnt;
> +		break;
> +	default:
> +		return 0;
> +	}
> +
> +	/* calculate the VCO frequency */
> +	clk_hz /= (1 + per_cfg->vco1_denom);
> +	clk_hz *= (1 + per_cfg->vco1_numer);

Extra parenthesis around statement not needed, fix globally.

> +	return clk_hz;
> +}
> +
> +/* calculate the intended MPU clock frequency based on handoff */
> +static unsigned int cm_calc_handoff_mpu_clk_hz(struct mainpll_cfg *main_cfg,
> +					       struct perpll_cfg *per_cfg)
> +{
> +	unsigned int clk_hz;
> +
> +	/* Check MPU clock source: main, periph, osc1, intosc or f2s? */
> +	switch (main_cfg->mpuclk_src) {
> +	case CLKMGR_MAINPLL_MPUCLK_SRC_MAIN:
> +		clk_hz = cm_calc_handoff_main_vco_clk_hz(main_cfg);
> +		clk_hz /= ((main_cfg->mpuclk & CLKMGR_MAINPLL_MPUCLK_CNT_MSK)
> +			   + 1);

DTTO

> +		break;
> +	case CLKMGR_MAINPLL_MPUCLK_SRC_PERI:
> +		clk_hz = cm_calc_handoff_periph_vco_clk_hz(main_cfg, per_cfg);
> +		clk_hz /= (((main_cfg->mpuclk >>
> +			   CLKMGR_MAINPLL_MPUCLK_PERICNT_LSB) &
> +			   CLKMGR_MAINPLL_MPUCLK_CNT_MSK) + 1);

DTTO

> +		break;
> +	case CLKMGR_MAINPLL_MPUCLK_SRC_OSC1:
> +		clk_hz = eosc1_hz;
> +		break;
> +	case CLKMGR_MAINPLL_MPUCLK_SRC_INTOSC:
> +		clk_hz = cb_intosc_hz;
> +		break;
> +	case CLKMGR_MAINPLL_MPUCLK_SRC_FPGA:
> +		clk_hz = f2s_free_hz;
> +		break;
> +	default:
> +		return 0;
> +	}
> +
> +	clk_hz /= (main_cfg->mpuclk_cnt + 1);
> +	return clk_hz;
> +}
> +
> +/* calculate the intended NOC clock frequency based on handoff */
> +static unsigned int cm_calc_handoff_noc_clk_hz(struct mainpll_cfg *main_cfg,
> +					       struct perpll_cfg *per_cfg)
> +{
> +	unsigned int clk_hz;
> +
> +	/* Check MPU clock source: main, periph, osc1, intosc or f2s? */
> +	switch (main_cfg->nocclk_src) {
> +	case CLKMGR_MAINPLL_NOCCLK_SRC_MAIN:
> +		clk_hz = cm_calc_handoff_main_vco_clk_hz(main_cfg);
> +		clk_hz /= ((main_cfg->nocclk & CLKMGR_MAINPLL_NOCCLK_CNT_MSK)
> +			   + 1);

DTTO

> +		break;
> +	case CLKMGR_MAINPLL_NOCCLK_SRC_PERI:
> +		clk_hz = cm_calc_handoff_periph_vco_clk_hz(main_cfg, per_cfg);
> +		clk_hz /= (((main_cfg->nocclk >>
> +			   CLKMGR_MAINPLL_NOCCLK_PERICNT_LSB) &
> +			   CLKMGR_MAINPLL_NOCCLK_CNT_MSK) + 1);

DTTO

> +		break;
> +	case CLKMGR_MAINPLL_NOCCLK_SRC_OSC1:
> +		clk_hz = eosc1_hz;
> +		break;
> +	case CLKMGR_MAINPLL_NOCCLK_SRC_INTOSC:
> +		clk_hz = cb_intosc_hz;
> +		break;
> +	case CLKMGR_MAINPLL_NOCCLK_SRC_FPGA:
> +		clk_hz = f2s_free_hz;
> +		break;
> +	default:
> +		return 0;
> +	}
> +
> +	clk_hz /= (main_cfg->nocclk_cnt + 1);
> +	return clk_hz;
> +}
> +
> +/* return 1 if PLL ramp is required */
> +static int cm_is_pll_ramp_required(int main0periph1,
> +				   struct mainpll_cfg *main_cfg,
> +				   struct perpll_cfg *per_cfg)
> +{
> +	/* Check for main PLL */
> +	if (main0periph1 == 0) {
> +		/*
> +		 * PLL ramp is not required if both MPU clock and NOC clock are
> +		 * not sourced from main PLL
> +		 */
> +		if (main_cfg->mpuclk_src != CLKMGR_MAINPLL_MPUCLK_SRC_MAIN &&
> +		    main_cfg->nocclk_src != CLKMGR_MAINPLL_NOCCLK_SRC_MAIN)
> +			return 0;
> +
> +		/*
> +		 * PLL ramp is required if MPU clock is sourced from main PLL
> +		 * and MPU clock is over 900MHz (as advised by HW team)
> +		 */
> +		if (main_cfg->mpuclk_src == CLKMGR_MAINPLL_MPUCLK_SRC_MAIN &&
> +		    (cm_calc_handoff_mpu_clk_hz(main_cfg, per_cfg) >
> +		     CLKMGR_PLL_RAMP_MPUCLK_THRESHOLD_HZ))
> +			return 1;
> +
> +		/*
> +		 * PLL ramp is required if NOC clock is sourced from main PLL
> +		 * and NOC clock is over 300MHz (as advised by HW team)
> +		 */
> +		if (main_cfg->nocclk_src == CLKMGR_MAINPLL_NOCCLK_SRC_MAIN &&
> +		    (cm_calc_handoff_noc_clk_hz(main_cfg, per_cfg) >
> +		     CLKMGR_PLL_RAMP_NOCCLK_THRESHOLD_HZ))
> +			return 2;
> +
> +	} else if (main0periph1 == 1) {
> +		/*
> +		 * PLL ramp is not required if both MPU clock and NOC clock are
> +		 * not sourced from periph PLL
> +		 */
> +		if (main_cfg->mpuclk_src != CLKMGR_MAINPLL_MPUCLK_SRC_PERI &&
> +		    main_cfg->nocclk_src != CLKMGR_MAINPLL_NOCCLK_SRC_PERI)
> +			return 0;
> +
> +		/*
> +		 * PLL ramp is required if MPU clock are source from periph PLL
> +		 * and MPU clock is over 900MHz (as advised by HW team)
> +		 */
> +		if (main_cfg->mpuclk_src == CLKMGR_MAINPLL_MPUCLK_SRC_PERI &&
> +		    (cm_calc_handoff_mpu_clk_hz(main_cfg, per_cfg) >
> +		     CLKMGR_PLL_RAMP_MPUCLK_THRESHOLD_HZ))
> +			return 1;
> +
> +		/*
> +		 * PLL ramp is required if NOC clock are source from periph PLL
> +		 * and NOC clock is over 300MHz (as advised by HW team)
> +		 */
> +		if (main_cfg->nocclk_src == CLKMGR_MAINPLL_NOCCLK_SRC_PERI &&
> +		    (cm_calc_handoff_noc_clk_hz(main_cfg, per_cfg) >
> +		     CLKMGR_PLL_RAMP_NOCCLK_THRESHOLD_HZ))
> +			return 2;
> +	}
> +
> +	return 0;
> +}
> +
> +/*
> + * Calculate the new PLL numerator which is based on existing DTS hand off and
> + * intended safe frequency (safe_hz). Note that PLL ramp is only modifying the
> + * numerator while maintaining denominator as denominator will influence the
> + * jitter condition. Please refer A10 HPS TRM for the jitter guide. Note final
> + * value for numerator is minus with 1 to cater our register value
> + * representation.
> + */
> +static unsigned int cm_calc_safe_pll_numer(int main0periph1,
> +					   struct mainpll_cfg *main_cfg,
> +					   struct perpll_cfg *per_cfg,
> +					   unsigned int safe_hz)
> +{
> +	unsigned int clk_hz = 0;
> +
> +	/* Check for main PLL */
> +	if (main0periph1 == 0) {
> +		/* Check main VCO clock source: eosc, intosc or f2s? */
> +		switch (main_cfg->vco0_psrc) {
> +		case CLKMGR_MAINPLL_VCO0_PSRC_EOSC:
> +			clk_hz = eosc1_hz;
> +			break;
> +		case CLKMGR_MAINPLL_VCO0_PSRC_E_INTOSC:
> +			clk_hz = cb_intosc_hz;
> +			break;
> +		case CLKMGR_MAINPLL_VCO0_PSRC_F2S:
> +			clk_hz = f2s_free_hz;
> +			break;
> +		default:
> +			return 0;
> +		}
> +
> +		/* Applicable if MPU clock is from main PLL */
> +		if (main_cfg->mpuclk_src == CLKMGR_MAINPLL_MPUCLK_SRC_MAIN) {
> +			/* calculate the safe numer value */
> +			clk_hz = (safe_hz / clk_hz) *
> +				(main_cfg->mpuclk_cnt + 1) *
> +				((main_cfg->mpuclk &
> +				  CLKMGR_MAINPLL_MPUCLK_CNT_MSK) + 1) *
> +				(1 + main_cfg->vco1_denom) - 1;

Maybe you can factor out this awful equation into a function somehow ?

> +		}
> +		/* Reach here if MPU clk not from main PLL but NOC clk is */
> +		else if (main_cfg->nocclk_src ==
> +			 CLKMGR_MAINPLL_NOCCLK_SRC_MAIN) {
> +			/* calculate the safe numer value */
> +			clk_hz = (safe_hz / clk_hz) *
> +				(main_cfg->nocclk_cnt + 1) *
> +				((main_cfg->nocclk &
> +				  CLKMGR_MAINPLL_NOCCLK_CNT_MSK) + 1) *
> +				(1 + main_cfg->vco1_denom) - 1;
> +		} else
> +			clk_hz = 0;
> +
> +	} else if (main0periph1 == 1) {
> +		/* Check periph VCO clock source: eosc, intosc, f2s, mainpll */
> +		switch (per_cfg->vco0_psrc) {
> +		case CLKMGR_PERPLL_VCO0_PSRC_EOSC:
> +			clk_hz = eosc1_hz;
> +			break;
> +		case CLKMGR_PERPLL_VCO0_PSRC_E_INTOSC:
> +			clk_hz = cb_intosc_hz;
> +			break;
> +		case CLKMGR_PERPLL_VCO0_PSRC_F2S:
> +			clk_hz = f2s_free_hz;
> +			break;
> +		case CLKMGR_PERPLL_VCO0_PSRC_MAIN:
> +			clk_hz = cm_calc_handoff_main_vco_clk_hz(
> +				 main_cfg);
> +			clk_hz /= main_cfg->cntr15clk_cnt;
> +			break;
> +		default:
> +			return 0;
> +		}
> +		/* Applicable if MPU clock is from periph PLL */
> +		if (main_cfg->mpuclk_src == CLKMGR_MAINPLL_MPUCLK_SRC_PERI) {
> +			/* calculate the safe numer value */
> +			clk_hz = (safe_hz / clk_hz) *
> +				(main_cfg->mpuclk_cnt + 1) *
> +				(((main_cfg->mpuclk >>
> +				  CLKMGR_MAINPLL_MPUCLK_PERICNT_LSB) &
> +				  CLKMGR_MAINPLL_MPUCLK_CNT_MSK) + 1) *
> +				(1 + per_cfg->vco1_denom) - 1;
> +		}
> +		/* Reach here if MPU clk not from periph PLL but NOC clk is */
> +		else if (main_cfg->nocclk_src ==
> +			 CLKMGR_MAINPLL_NOCCLK_SRC_PERI) {
> +			/* calculate the safe numer value */
> +			clk_hz = (safe_hz / clk_hz) *
> +				(main_cfg->nocclk_cnt + 1) *
> +				(((main_cfg->nocclk >>
> +				  CLKMGR_MAINPLL_NOCCLK_PERICNT_LSB) &
> +				  CLKMGR_MAINPLL_NOCCLK_CNT_MSK) + 1) *
> +				(1 + per_cfg->vco1_denom) - 1;
> +		} else
> +			clk_hz = 0;
> +	}
> +	return clk_hz;
> +}

[...]

> +unsigned int cm_get_per_vco_clk_hz(void)
> +{
> +	u32 src_hz = 0;
> +	u32 clk_src = 0;
> +	u32 numer = 0;
> +	u32 denom = 0;
> +	u32 vco = 0;
> +
> +	clk_src = readl(&clock_manager_base->per_pll.vco0);
> +
> +	clk_src = (clk_src >> CLKMGR_PERPLL_VCO0_PSRC_LSB) &
> +		CLKMGR_PERPLL_VCO0_PSRC_MSK;
> +
> +	if (clk_src == CLKMGR_PERPLL_VCO0_PSRC_EOSC) {
> +		src_hz = eosc1_hz;
> +	} else if (clk_src == CLKMGR_PERPLL_VCO0_PSRC_E_INTOSC) {
> +		src_hz = cb_intosc_hz;
> +	} else if (clk_src == CLKMGR_PERPLL_VCO0_PSRC_F2S) {
> +		src_hz = f2s_free_hz;
> +	} else if (clk_src == CLKMGR_PERPLL_VCO0_PSRC_MAIN) {
> +		src_hz = cm_get_main_vco_clk_hz();
> +		src_hz /= (readl
> +			(&clock_manager_base->main_pll.cntr15clk) &
> +			CLKMGR_MAINPLL_CNTRCLK_MSK) + 1;
> +	} else {
> +		printf("cm_get_per_vco_clk_hz invalid clk_src %d\n", clk_src);
> +		return 0;
> +	}
> +
> +	vco = readl(&clock_manager_base->per_pll.vco1);
> +
> +	numer = vco & CLKMGR_PERPLL_VCO1_NUMER_MSK;
> +
> +	denom = (vco >> CLKMGR_PERPLL_VCO1_DENOM_LSB) &
> +			CLKMGR_PERPLL_VCO1_DENOM_MSK;
> +
> +	vco = src_hz;
> +	vco /= (1 + denom);
> +	vco *= (1 + numer);

Extra parenthesis, not needed ...

> +	return vco;
> +}
> +
> +unsigned int cm_get_main_vco_clk_hz(void)
> +{
> +	u32 src_hz, numer, denom, vco;
> +
> +	u32 clk_src = readl(&clock_manager_base->main_pll.vco0);
> +
> +	clk_src = (clk_src >> CLKMGR_MAINPLL_VCO0_PSRC_LSB) &
> +		CLKMGR_MAINPLL_VCO0_PSRC_MSK;
> +
> +	if (clk_src == CLKMGR_MAINPLL_VCO0_PSRC_EOSC) {
> +		src_hz = eosc1_hz;
> +	} else if (clk_src == CLKMGR_MAINPLL_VCO0_PSRC_E_INTOSC) {
> +		src_hz = cb_intosc_hz;
> +	} else if (clk_src == CLKMGR_MAINPLL_VCO0_PSRC_F2S) {
> +		src_hz = f2s_free_hz;
> +	} else {
> +		printf("cm_get_main_vco_clk_hz invalid clk_src %d\n", clk_src);
> +		return 0;
> +	}
> +
> +	vco = readl(&clock_manager_base->main_pll.vco1);
> +
> +	numer = vco & CLKMGR_MAINPLL_VCO1_NUMER_MSK;
> +
> +	denom = (vco >> CLKMGR_MAINPLL_VCO1_DENOM_LSB) &
> +			CLKMGR_MAINPLL_VCO1_DENOM_MSK;
> +
> +	vco = src_hz;
> +	vco /= (1 + denom);
> +	vco *= (1 + numer);

DTTO

btw this function looks just like the previous one ...

> +	return vco;
> +}
> +
> +unsigned int cm_get_l4_sp_clk_hz(void)
> +{
> +	return cm_get_l4_noc_hz(CLKMGR_MAINPLL_NOCDIV_L4SPCLK_LSB);
> +}
> +
> +unsigned int cm_get_mmc_controller_clk_hz(void)
> +{
> +	u32 clk_hz = 0;
> +	u32 clk_input = 0;
> +
> +	clk_input = readl(&clock_manager_base->per_pll.cntr6clk);
> +	clk_input = (clk_input >> CLKMGR_PERPLL_CNTR6CLK_SRC_LSB) &
> +		CLKMGR_PERPLLGRP_SRC_MSK;
> +
> +	switch (clk_input) {
> +	case CLKMGR_PERPLLGRP_SRC_MAIN:
> +		clk_hz = cm_get_main_vco_clk_hz();
> +		clk_hz /= 1 +
> +			(readl
> +			(&clock_manager_base->main_pll.cntr6clk) &
> +			CLKMGR_MAINPLL_CNTRCLK_MSK);
> +		break;
> +
> +	case CLKMGR_PERPLLGRP_SRC_PERI:
> +		clk_hz = cm_get_per_vco_clk_hz();
> +		clk_hz /= 1 + (readl
> +			(&clock_manager_base->per_pll.cntr6clk) &
> +			CLKMGR_PERPLL_CNTRCLK_MSK);
> +		break;
> +
> +	case CLKMGR_PERPLLGRP_SRC_OSC1:
> +		clk_hz = eosc1_hz;
> +		break;
> +
> +	case CLKMGR_PERPLLGRP_SRC_INTOSC:
> +		clk_hz = cb_intosc_hz;
> +		break;
> +
> +	case CLKMGR_PERPLLGRP_SRC_FPGA:
> +		clk_hz = f2s_free_hz;
> +		break;
> +	}
> +
> +	return clk_hz / 4;
> +}
> +
> +unsigned int cm_get_spi_controller_clk_hz(void)
> +{
> +	return cm_get_l4_noc_hz(CLKMGR_MAINPLL_NOCDIV_L4MPCLK_LSB);
> +}
> +
> +unsigned int cm_get_qspi_controller_clk_hz(void)
> +{
> +	return  cm_get_l4_noc_hz(CLKMGR_MAINPLL_NOCDIV_L4MAINCLK_LSB);
> +}
> +
> +void cm_print_clock_quick_summary(void)
> +{
> +	printf("MPU       %10ld kHz\n", cm_get_mpu_clk_hz() / 1000);
> +	printf("MMC         %8d kHz\n", cm_get_mmc_controller_clk_hz() / 1000);
> +	printf("QSPI        %8d kHz\n",
> +	       cm_get_qspi_controller_clk_hz() / 1000);
> +	printf("SPI         %8d kHz\n", cm_get_spi_controller_clk_hz() / 1000);
> +	printf("EOSC1       %8d kHz\n", eosc1_hz / 1000);
> +	printf("cb_intosc   %8d kHz\n", cb_intosc_hz / 1000);
> +	printf("f2s_free    %8d kHz\n", f2s_free_hz / 1000);
> +	printf("Main VCO    %8d kHz\n", cm_get_main_vco_clk_hz() / 1000);
> +	printf("NOC         %8d kHz\n", cm_get_noc_clk_hz() / 1000);
> +	printf("L4 Main	    %8d kHz\n",
> +	       cm_get_l4_noc_hz(CLKMGR_MAINPLL_NOCDIV_L4MAINCLK_LSB) / 1000);
> +	printf("L4 MP       %8d kHz\n",
> +	       cm_get_l4_noc_hz(CLKMGR_MAINPLL_NOCDIV_L4MPCLK_LSB) / 1000);
> +	printf("L4 SP       %8d kHz\n",
> +	       cm_get_l4_sp_clk_hz() / 1000);
> +	printf("L4 sys free %8d kHz\n", cm_l4_sys_free_clk_hz / 1000);

This should be part of the clock command ... see CV clock command.

> +}
> diff --git a/arch/arm/mach-socfpga/include/mach/clock_manager.h b/arch/arm/mach-socfpga/include/mach/clock_manager.h
> index d0d0487..ec067ae 100644
> --- a/arch/arm/mach-socfpga/include/mach/clock_manager.h
> +++ b/arch/arm/mach-socfpga/include/mach/clock_manager.h
> @@ -13,7 +13,13 @@ void cm_wait_for_fsm(void);
>  void cm_print_clock_quick_summary(void);
>  #endif
>  
> +/* Common mask */
> +#define CLKMGR_CLKMGR_STAT_BUSY_SET_MSK			0x00000001

BIT(0) ?

>  #if defined(CONFIG_TARGET_SOCFPGA_GEN5)
>  #include <asm/arch/clock_manager_gen5.h>
> +#elif defined(CONFIG_TARGET_SOCFPGA_ARRIA10)
> +#include <asm/arch/clock_manager_arria10.h>
>  #endif
> +
>  #endif /* _CLOCK_MANAGER_H_ */

[...]

> +/* mask */
> +#define CLKMGR_MAINPLL_EN_S2FUSER0CLKEN_SET_MSK		0x00000040

Looks more like a BIT() to me ...

> +#define CLKMGR_MAINPLL_EN_HMCPLLREFCLKEN_SET_MSK	0x00000080
> +#define CLKMGR_CLKMGR_STAT_MAINPLLLOCKED_SET_MSK	0x00000100
> +#define CLKMGR_CLKMGR_STAT_PERPLLLOCKED_SET_MSK		0x00000200
> +#define CLKMGR_CLKMGR_STAT_BOOTCLKSRC_SET_MSK		0x00020000
> +#define CLKMGR_MAINPLL_VCO0_BGPWRDN_SET_MSK		0x00000001
> +#define CLKMGR_MAINPLL_VCO0_PWRDN_SET_MSK		0x00000002
> +#define CLKMGR_MAINPLL_VCO0_EN_SET_MSK			0x00000004
> +#define CLKMGR_MAINPLL_VCO0_OUTRSTALL_SET_MSK		0x00000008
> +#define CLKMGR_MAINPLL_VCO0_REGEXTSEL_SET_MSK		0x00000010
> +#define CLKMGR_PERPLL_VCO0_BGPWRDN_SET_MSK		0x00000001
> +#define CLKMGR_PERPLL_VCO0_PWRDN_SET_MSK		0x00000002
> +#define CLKMGR_PERPLL_VCO0_EN_SET_MSK			0x00000004
> +#define CLKMGR_PERPLL_VCO0_OUTRSTALL_SET_MSK		0x00000008
> +#define CLKMGR_PERPLL_VCO0_REGEXTSEL_SET_MSK		0x00000010
> +#define CLKMGR_CLKMGR_INTR_PERPLLFBSLIP_SET_MSK		0x00000800
> +#define CLKMGR_CLKMGR_INTR_MAINPLLFBSLIP_SET_MSK	0x00000400
> +#define CLKMGR_CLKMGR_INTR_PERPLLRFSLIP_SET_MSK		0x00000200
> +#define CLKMGR_CLKMGR_INTR_MAINPLLRFSLIP_SET_MSK	0x00000100
> +#define CLKMGR_CLKMGR_INTR_PERPLLLOST_SET_MSK		0x00000008
> +#define CLKMGR_CLKMGR_INTR_MAINPLLLOST_SET_MSK		0x00000004
> +#define CLKMGR_CLKMGR_INTR_MAINPLLACHIEVED_SET_MSK	0x00000001
> +#define CLKMGR_CLKMGR_INTR_PERPLLACHIEVED_SET_MSK	0x00000002
> +#define CLKMGR_CLKMGR_CTL_BOOTMOD_SET_MSK		0x00000001
> +#define CLKMGR_CLKMGR_CTL_BOOTCLK_INTOSC_SET_MSK	0x00000300
> +#define CLKMGR_PERPLL_EN_RESET				0x00000f7f
> +#define CLKMGR_PERPLLGRP_EN_SDMMCCLK_MASK		0x00000020
> +#define CLKMGR_MAINPLL_VCO0_PSRC_MSK			0x00000003
> +#define CLKMGR_MAINPLL_VCO1_NUMER_MSK			0x00001fff
> +#define CLKMGR_MAINPLL_VCO1_DENOM_MSK			0x0000003f
> +#define CLKMGR_MAINPLL_CNTRCLK_MSK			0x000003ff
> +#define CLKMGR_PERPLL_VCO0_PSRC_MSK			0x00000003
> +#define CLKMGR_PERPLL_VCO1_NUMER_MSK			0x00001fff
> +#define CLKMGR_PERPLL_VCO1_DENOM_MSK			0x0000003f
> +#define CLKMGR_PERPLL_CNTRCLK_MSK			0x000003ff
> +#define CLKMGR_MAINPLL_MPUCLK_SRC_MSK			0x00000007
> +#define CLKMGR_MAINPLL_MPUCLK_CNT_MSK			0x000003ff
> +#define CLKMGR_MAINPLL_MPUCLK_SRC_MAIN			0
> +#define CLKMGR_MAINPLL_MPUCLK_SRC_PERI			1
> +#define CLKMGR_MAINPLL_MPUCLK_SRC_OSC1			2
> +#define CLKMGR_MAINPLL_MPUCLK_SRC_INTOSC		3
> +#define CLKMGR_MAINPLL_MPUCLK_SRC_FPGA			4
> +#define CLKMGR_MAINPLL_NOCDIV_MSK			0x00000003
> +#define CLKMGR_MAINPLL_NOCCLK_CNT_MSK			0x000003ff
> +#define CLKMGR_MAINPLL_NOCCLK_SRC_MSK			0x00000007
> +#define CLKMGR_MAINPLL_NOCCLK_SRC_MAIN			0
> +#define CLKMGR_MAINPLL_NOCCLK_SRC_PERI			1
> +#define CLKMGR_MAINPLL_NOCCLK_SRC_OSC1			2
> +#define CLKMGR_MAINPLL_NOCCLK_SRC_INTOSC		3
> +#define CLKMGR_MAINPLL_NOCCLK_SRC_FPGA			4
> +
> +#define CLKMGR_PERPLLGRP_SRC_MSK			0x00000007
> +#define CLKMGR_PERPLLGRP_SRC_MAIN			0
> +#define CLKMGR_PERPLLGRP_SRC_PERI			1
> +#define CLKMGR_PERPLLGRP_SRC_OSC1			2
> +#define CLKMGR_PERPLLGRP_SRC_INTOSC			3
> +#define CLKMGR_PERPLLGRP_SRC_FPGA			4
> +
> +/* bit shifting macro */
> +#define CLKMGR_MAINPLL_VCO0_PSRC_LSB		8
> +#define CLKMGR_PERPLL_VCO0_PSRC_LSB		8
> +#define CLKMGR_MAINPLL_VCO1_DENOM_LSB		16
> +#define CLKMGR_PERPLL_VCO1_DENOM_LSB		16
> +#define CLKMGR_MAINPLL_NOCCLK_PERICNT_LSB	16
> +#define CLKMGR_MAINPLL_NOCCLK_SRC_LSB		16
> +#define CLKMGR_MAINPLL_NOCDIV_L4MAINCLK_LSB	0
> +#define CLKMGR_MAINPLL_NOCDIV_L4MPCLK_LSB	8
> +#define CLKMGR_MAINPLL_NOCDIV_L4SPCLK_LSB	16
> +#define CLKMGR_MAINPLL_NOCDIV_CSATCLK_LSB	24
> +#define CLKMGR_MAINPLL_NOCDIV_CSTRACECLK_LSB	26
> +#define CLKMGR_MAINPLL_NOCDIV_CSPDBGCLK_LSB	28
> +#define CLKMGR_MAINPLL_MPUCLK_SRC_LSB		16
> +#define CLKMGR_MAINPLL_MPUCLK_PERICNT_LSB	16
> +#define CLKMGR_MAINPLL_NOCCLK_SRC_LSB		16
> +#define CLKMGR_MAINPLL_CNTR7CLK_SRC_LSB		16
> +#define CLKMGR_MAINPLL_CNTR9CLK_SRC_LSB		16
> +#define CLKMGR_PERPLL_CNTR2CLK_SRC_LSB		16
> +#define CLKMGR_PERPLL_CNTR3CLK_SRC_LSB		16
> +#define CLKMGR_PERPLL_CNTR4CLK_SRC_LSB		16
> +#define CLKMGR_PERPLL_CNTR5CLK_SRC_LSB		16
> +#define CLKMGR_PERPLL_CNTR6CLK_SRC_LSB		16
> +#define CLKMGR_PERPLL_CNTR8CLK_SRC_LSB		16
> +#define CLKMGR_PERPLL_EMACCTL_EMAC0SEL_LSB	26
> +#define CLKMGR_PERPLL_EMACCTL_EMAC1SEL_LSB	27
> +#define CLKMGR_PERPLL_EMACCTL_EMAC2SEL_LSB	28
> +
> +/* PLL ramping work around */
> +#define CLKMGR_PLL_RAMP_MPUCLK_THRESHOLD_HZ	900000000
> +#define CLKMGR_PLL_RAMP_NOCCLK_THRESHOLD_HZ	300000000
> +#define CLKMGR_PLL_RAMP_MPUCLK_INCREMENT_HZ	100000000
> +#define CLKMGR_PLL_RAMP_NOCCLK_INCREMENT_HZ	33000000
> +
> +#endif /* CLOCK_MANAGER_ARRIA10 */
> 


-- 
Best regards,
Marek Vasut

^ permalink raw reply	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 09/20] arm: socfpga: Add system manager for Arria 10
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 09/20] arm: socfpga: Add system manager " Ley Foon Tan
@ 2017-03-10  1:47   ` Marek Vasut
  0 siblings, 0 replies; 60+ messages in thread
From: Marek Vasut @ 2017-03-10  1:47 UTC (permalink / raw)
  To: u-boot

On 03/09/2017 01:26 AM, Ley Foon Tan wrote:
> Add system manager register struct and defines for Arria 10.
> 
> Signed-off-by: Tien Fong Chee <tien.fong.chee@intel.com>
> Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
> ---
>  .../arm/mach-socfpga/include/mach/system_manager.h | 52 ++++++++++++++
>  .../include/mach/system_manager_arria10.h          | 81 ++++++++++++++++++++++
>  .../include/mach/system_manager_gen5.h             |  1 +
>  3 files changed, 134 insertions(+)
>  create mode 100644 arch/arm/mach-socfpga/include/mach/system_manager_arria10.h
> 
> diff --git a/arch/arm/mach-socfpga/include/mach/system_manager.h b/arch/arm/mach-socfpga/include/mach/system_manager.h
> index 53ced81..54078ce 100644
> --- a/arch/arm/mach-socfpga/include/mach/system_manager.h
> +++ b/arch/arm/mach-socfpga/include/mach/system_manager.h
> @@ -31,8 +31,60 @@
>  #define SYSMGR_EMACGRP_CTRL_PHYSEL1_LSB			2
>  #define SYSMGR_EMACGRP_CTRL_PHYSEL_MASK			0x3
>  
> +/* For dedicated IO configuration */
> +/* Voltage select enums */
> +#define VOLTAGE_SEL_3V		0x0
> +#define VOLTAGE_SEL_1P8V	0x1
> +#define VOLTAGE_SEL_2P5V	0x2
> +
> +/* Input buffer enable */
> +#define INPUT_BUF_DISABLE	0
> +#define INPUT_BUF_1P8V		1
> +#define INPUT_BUF_2P5V3V	2
> +
> +/* Weak pull up enable */
> +#define WK_PU_DISABLE		0
> +#define WK_PU_ENABLE		1
> +
> +/* Pull up slew rate control */
> +#define PU_SLW_RT_SLOW		0
> +#define PU_SLW_RT_FAST		1
> +#define PU_SLW_RT_DEFAULT	PU_SLW_RT_SLOW
> +
> +/* Pull down slew rate control */
> +#define PD_SLW_RT_SLOW		0
> +#define PD_SLW_RT_FAST		1
> +#define PD_SLW_RT_DEFAULT	PD_SLW_RT_SLOW
> +
> +/* Drive strength control */
> +#define PU_DRV_STRG_DEFAULT	0x10
> +#define PD_DRV_STRG_DEFAULT	0x10
> +
> +/* bit position */
> +#define PD_DRV_STRG_LSB		0
> +#define PD_SLW_RT_LSB		5
> +#define PU_DRV_STRG_LSB		8
> +#define PU_SLW_RT_LSB		13
> +#define WK_PU_LSB		16
> +#define INPUT_BUF_LSB		17
> +#define BIAS_TRIM_LSB		19
> +#define VOLTAGE_SEL_LSB		0
> +
> +#define ALT_SYSMGR_NOC_H2F_SET_MSK	0x00000001
> +#define ALT_SYSMGR_NOC_LWH2F_SET_MSK	0x00000010
> +#define ALT_SYSMGR_NOC_F2H_SET_MSK	0x00000100

BIT() ?

> +#define ALT_SYSMGR_NOC_F2SDR0_SET_MSK	0x00010000
> +#define ALT_SYSMGR_NOC_F2SDR1_SET_MSK	0x00100000
> +#define ALT_SYSMGR_NOC_F2SDR2_SET_MSK	0x01000000
> +#define ALT_SYSMGR_NOC_TMO_EN_SET_MSK	0x00000001
> +
> +#define ALT_SYSMGR_ECC_INTSTAT_SERR_OCRAM_SET_MSK	0x00000002
> +#define ALT_SYSMGR_ECC_INTSTAT_DERR_OCRAM_SET_MSK	0x00000002
> +
>  #if defined(CONFIG_TARGET_SOCFPGA_GEN5)
>  #include <asm/arch/system_manager_gen5.h>
> +#elif defined(CONFIG_TARGET_SOCFPGA_ARRIA10)
> +#include <asm/arch/system_manager_arria10.h>
>  #endif
>  
>  #endif /* _SYSTEM_MANAGER_H_ */
> diff --git a/arch/arm/mach-socfpga/include/mach/system_manager_arria10.h b/arch/arm/mach-socfpga/include/mach/system_manager_arria10.h
> new file mode 100644
> index 0000000..f235aba
> --- /dev/null
> +++ b/arch/arm/mach-socfpga/include/mach/system_manager_arria10.h
> @@ -0,0 +1,81 @@
> +/*
> + * Copyright (C) 2016-2017 Intel Corporation <www.intel.com>
> + *
> + * SPDX-License-Identifier:	GPL-2.0
> + */
> +
> +#ifndef _SYSTEM_MANAGER_ARRIA10_H_
> +#define _SYSTEM_MANAGER_ARRIA10_H_
> +
> +struct socfpga_system_manager {
> +	u32  siliconid1;
> +	u32  siliconid2;
> +	u32  wddbg;
> +	u32  bootinfo;
> +	u32  mpu_ctrl_l2_ecc;
> +	u32  _pad_0x14_0x1f[3];
> +	u32  dma;
> +	u32  dma_periph;
> +	u32  sdmmcgrp_ctrl;
> +	u32  sdmmc_l3master;
> +	u32  nand_bootstrap;
> +	u32  nand_l3master;
> +	u32  usb0_l3master;
> +	u32  usb1_l3master;
> +	u32  emac_global;
> +	u32  emac[3];
> +	u32  _pad_0x50_0x5f[4];
> +	u32  fpgaintf_en_global;
> +	u32  fpgaintf_en_0;
> +	u32  fpgaintf_en_1;
> +	u32  fpgaintf_en_2;
> +	u32  fpgaintf_en_3;
> +	u32  _pad_0x74_0x7f[3];
> +	u32  noc_addr_remap_value;
> +	u32  noc_addr_remap_set;
> +	u32  noc_addr_remap_clear;
> +	u32  _pad_0x8c_0x8f;
> +	u32  ecc_intmask_value;
> +	u32  ecc_intmask_set;
> +	u32  ecc_intmask_clr;
> +	u32  ecc_intstatus_serr;
> +	u32  ecc_intstatus_derr;
> +	u32  mpu_status_l2_ecc;
> +	u32  mpu_clear_l2_ecc;
> +	u32  mpu_status_l1_parity;
> +	u32  mpu_clear_l1_parity;
> +	u32  mpu_set_l1_parity;
> +	u32  _pad_0xb8_0xbf[2];
> +	u32  noc_timeout;
> +	u32  noc_idlereq_set;
> +	u32  noc_idlereq_clr;
> +	u32  noc_idlereq_value;
> +	u32  noc_idleack;
> +	u32  noc_idlestatus;
> +	u32  fpga2soc_ctrl;
> +	u32  _pad_0xdc_0xff[9];
> +	u32  tsmc_tsel_0;
> +	u32  tsmc_tsel_1;
> +	u32  tsmc_tsel_2;
> +	u32  tsmc_tsel_3;
> +	u32  _pad_0x110_0x200[60];
> +	u32  romhw_ctrl;
> +	u32  romcode_ctrl;
> +	u32  romcode_cpu1startaddr;
> +	u32  romcode_initswstate;
> +	u32  romcode_initswlastld;
> +	u32  _pad_0x214_0x217;
> +	u32  warmram_enable;
> +	u32  warmram_datastart;
> +	u32  warmram_length;
> +	u32  warmram_execution;
> +	u32  warmram_crc;
> +	u32  _pad_0x22c_0x22f;
> +	u32  isw_handoff[8];
> +	u32  romcode_bootromswstate[8];
> +};
> +
> +#define SYSMGR_SDMMC_SMPLSEL_SHIFT	4
> +#define SYSMGR_BOOTINFO_BSEL_SHIFT	12
> +
> +#endif /* _SYSTEM_MANAGER_ARRIA10_H_ */
> diff --git a/arch/arm/mach-socfpga/include/mach/system_manager_gen5.h b/arch/arm/mach-socfpga/include/mach/system_manager_gen5.h
> index 3ad4ca1..285c1a2 100644
> --- a/arch/arm/mach-socfpga/include/mach/system_manager_gen5.h
> +++ b/arch/arm/mach-socfpga/include/mach/system_manager_gen5.h
> @@ -117,5 +117,6 @@ struct socfpga_system_manager {
>  #endif
>  
>  #define SYSMGR_SDMMC_SMPLSEL_SHIFT	3
> +#define SYSMGR_BOOTINFO_BSEL_SHIFT	0
>  
>  #endif /* _SYSTEM_MANAGER_GEN5_H_ */
> 


-- 
Best regards,
Marek Vasut

^ permalink raw reply	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 11/20] arm: socfpga: Add misc support for Arria 10
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 11/20] arm: socfpga: Add misc support " Ley Foon Tan
@ 2017-03-10  1:49   ` Marek Vasut
  0 siblings, 0 replies; 60+ messages in thread
From: Marek Vasut @ 2017-03-10  1:49 UTC (permalink / raw)
  To: u-boot

On 03/09/2017 01:26 AM, Ley Foon Tan wrote:
> Add misc support for Arria 10 and minor fix on misc Gen5.
> 
> Signed-off-by: Tien Fong Chee <tien.fong.chee@intel.com>
> Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
> ---
>  arch/arm/mach-socfpga/Makefile            |   1 +
>  arch/arm/mach-socfpga/include/mach/misc.h |   6 +
>  arch/arm/mach-socfpga/misc_arria10.c      | 254 ++++++++++++++++++++++++++++++
>  arch/arm/mach-socfpga/misc_gen5.c         |   3 +-
>  4 files changed, 263 insertions(+), 1 deletion(-)
>  create mode 100644 arch/arm/mach-socfpga/misc_arria10.c
> 
> diff --git a/arch/arm/mach-socfpga/Makefile b/arch/arm/mach-socfpga/Makefile
> index c494930..9c4617f 100644
> --- a/arch/arm/mach-socfpga/Makefile
> +++ b/arch/arm/mach-socfpga/Makefile
> @@ -11,6 +11,7 @@ obj-y	+= misc.o timer.o reset_manager.o clock_manager.o \
>  	   fpga_manager.o board.o
>  
>  obj-$(CONFIG_TARGET_SOCFPGA_ARRIA10) += clock_manager_arria10.o \
> +					misc_arria10.o		\
>  					reset_manager_arria10.o
>  
>  obj-$(CONFIG_SPL_BUILD) += spl.o freeze_controller.o
> diff --git a/arch/arm/mach-socfpga/include/mach/misc.h b/arch/arm/mach-socfpga/include/mach/misc.h
> index 64f9b86..446ee0f 100644
> --- a/arch/arm/mach-socfpga/include/mach/misc.h
> +++ b/arch/arm/mach-socfpga/include/mach/misc.h
> @@ -23,4 +23,10 @@ void socfpga_fpga_add(void);
>  inline void socfpga_fpga_add(void) {}
>  #endif
>  
> +#if defined(CONFIG_TARGET_SOCFPGA_ARRIA10)
> +unsigned int dedicated_uart_com_port(const void *blob);
> +unsigned int shared_uart_com_port(const void *blob);
> +unsigned int uart_com_port(const void *blob);

Prefix them with socfpga_ if they're in the global namespace ...

> +#endif
> +
>  #endif /* _MISC_H_ */
> diff --git a/arch/arm/mach-socfpga/misc_arria10.c b/arch/arm/mach-socfpga/misc_arria10.c
> new file mode 100644
> index 0000000..d2bad13
> --- /dev/null
> +++ b/arch/arm/mach-socfpga/misc_arria10.c
> @@ -0,0 +1,254 @@
> +/*
> + * Copyright (C) 2016-2017 Intel Corporation
> + *
> + * SPDX-License-Identifier:    GPL-2.0
> + */
> +
> +#include <altera.h>
> +#include <common.h>
> +#include <errno.h>
> +#include <fdtdec.h>
> +#include <miiphy.h>
> +#include <netdev.h>
> +#include <ns16550.h>
> +#include <watchdog.h>
> +#include <asm/arch/misc.h>
> +#include <asm/arch/reset_manager.h>
> +#include <asm/arch/sdram_arria10.h>
> +#include <asm/arch/system_manager.h>
> +#include <asm/arch/nic301.h>
> +#include <asm/io.h>
> +#include <asm/pl310.h>
> +
> +#define PINMUX_UART0_TX_SHARED_IO_OFFSET_Q1_3	0x08
> +#define PINMUX_UART0_TX_SHARED_IO_OFFSET_Q2_11	0x58
> +#define PINMUX_UART0_TX_SHARED_IO_OFFSET_Q3_3	0x68
> +#define PINMUX_UART1_TX_SHARED_IO_OFFSET_Q1_7	0x18
> +#define PINMUX_UART1_TX_SHARED_IO_OFFSET_Q3_7	0x78
> +#define PINMUX_UART1_TX_SHARED_IO_OFFSET_Q4_3	0x98
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +static struct pl310_regs *const pl310 =
> +	(struct pl310_regs *)CONFIG_SYS_PL310_BASE;
> +static struct socfpga_system_manager *sysmgr_regs =
> +	(struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS;
> +static const struct socfpga_noc_fw_ocram *noc_fw_ocram_base =
> +	(void *)SOCFPGA_SDR_FIREWALL_OCRAM_ADDRESS;
> +static const struct socfpga_noc_fw_ddr_l3 *noc_fw_ddr_l3_base =
> +	(void *)SOCFPGA_SDR_FIREWALL_L3_ADDRESS;
> +
> +/*
> + * DesignWare Ethernet initialization
> + */
> +#ifdef CONFIG_ETH_DESIGNWARE
> +void dwmac_deassert_reset(const unsigned int of_reset_id,
> +				 const u32 phymode)
> +{
> +	u32 reset;
> +
> +	if (of_reset_id == EMAC0_RESET) {
> +		reset = SOCFPGA_RESET(EMAC0);
> +	} else if (of_reset_id == EMAC1_RESET) {
> +		reset = SOCFPGA_RESET(EMAC1);
> +	} else if (of_reset_id == EMAC2_RESET) {
> +		reset = SOCFPGA_RESET(EMAC2);
> +	} else {
> +		printf("GMAC: Invalid reset ID (%i)!\n", of_reset_id);
> +		return;
> +	}
> +
> +	clrsetbits_le32(&sysmgr_regs->emac[of_reset_id - EMAC0_RESET],
> +			SYSMGR_EMACGRP_CTRL_PHYSEL_MASK,
> +			phymode);
> +
> +	/* Release the EMAC controller from reset */
> +	socfpga_per_reset(reset, 0);
> +}
> +#endif
> +
> +/*
> ++ * This function initializes security policies to be consistent across
> ++ * all logic units in the Arria 10.
> ++ *
> ++ * The idea is to set all security policies to be normal, nonsecure
> ++ * for all units.
> ++ */
> +static void initialize_security_policies(void)
> +{
> +	/* Put OCRAM in non-secure */
> +	writel(0x003f0000, &noc_fw_ocram_base->region0);
> +	writel(0x1, &noc_fw_ocram_base->enable);
> +
> +	/* Put DDR in non-secure */
> +	writel(0xffff0000, &noc_fw_ddr_l3_base->hpsregion0addr);
> +	writel(0x1, &noc_fw_ddr_l3_base->enable);
> +}
> +
> +int arch_early_init_r(void)
> +{
> +	initialize_security_policies();
> +
> +	/* Configure the L2 controller to make SDRAM start at 0 */
> +	writel(0x1, &pl310->pl310_addr_filter_start);
> +
> +	/* assert reset to all except L4WD0 and L4TIMER0 */
> +	socfpga_per_reset_all();
> +
> +	/* configuring the clock based on handoff */
> +	/* TODO: Add call to cm_basic_init() */
> +
> +	/* Add device descriptor to FPGA device table */
> +	socfpga_fpga_add();
> +	return 0;
> +}
> +
> +/*
> + * This function looking the 1st encounter UART peripheral,
> + * and then return its offset of the dedicated/shared IO pin
> + * mux. offset value (zero and above).
> + */
> +static int find_peripheral_uart(const void *blob,
> +	int child, const char *node_name)
> +{
> +	int len;
> +	fdt_addr_t base_addr = 0;
> +	fdt_size_t size;
> +	const u32 *cell;
> +	u32 value, offset = 0;
> +
> +	base_addr = fdtdec_get_addr_size(blob, child, "reg", &size);
> +	if (base_addr != FDT_ADDR_T_NONE) {
> +		cell = fdt_getprop(blob, child, "pinctrl-single,pins",
> +			&len);
> +		if (cell != NULL) {

if (!cell)
  continue;

and remove one level of indent ...

> +			for (; len > 0; len -= (2 * sizeof(u32))) {
> +				offset = fdt32_to_cpu(*cell++);
> +				value = fdt32_to_cpu(*cell++);
> +				/* Found UART peripheral */
> +				if (value == 0x0D)
> +					return offset;
> +			}
> +		}
> +	}
> +	return -EINVAL;
> +}
> +
> +/*
> + * This function looks up the 1st encounter UART peripheral,
> + * and then return its offset of the dedicated/shared IO pin
> + * mux. UART peripheral is found if the offset is not in negative
> + * value.
> + */
> +static int is_peripheral_uart_true(const void *blob,
> +	int node, const char *child_name)
> +{
> +	int child, len;
> +	const char *node_name;
> +
> +	child = fdt_first_subnode(blob, node);
> +
> +	if (child < 0)
> +		return -EINVAL;
> +
> +	node_name = fdt_get_name(blob, child, &len);
> +
> +	while (node_name) {
> +		if (!strcmp(child_name, node_name))
> +			return find_peripheral_uart(blob, child, node_name);
> +
> +		child = fdt_next_subnode(blob, child);
> +		if (child < 0)
> +			break;
> +
> +		node_name = fdt_get_name(blob, child, &len);
> +	}
> +
> +	return -1;
> +}
> +
> +/*
> + * This function looking the 1st encounter UART dedicated IO peripheral,
> + * and then return based address of the 1st encounter UART dedicated
> + * IO peripheral.
> + */
> +unsigned int dedicated_uart_com_port(const void *blob)
> +{
> +	int node;
> +
> +	node = fdtdec_next_compatible(blob, 0,
> +		 COMPAT_ALTERA_SOCFPGA_PINCTRL_SINGLE);
> +	if (node < 0)
> +		return 0;
> +
> +	if (is_peripheral_uart_true(blob, node, "dedicated") >= 0)
> +		return SOCFPGA_UART1_ADDRESS;
> +
> +	return 0;
> +}
> +
> +/*
> + * This function looking the 1st encounter UART shared IO peripheral, and then
> + * return based address of the 1st encounter UART shared IO peripheral.
> + */
> +unsigned int shared_uart_com_port(const void *blob)
> +{
> +	int node, ret;
> +
> +	node = fdtdec_next_compatible(blob, 0,
> +		 COMPAT_ALTERA_SOCFPGA_PINCTRL_SINGLE);
> +	if (node < 0)
> +		return 0;
> +
> +	ret = is_peripheral_uart_true(blob, node, "shared");
> +
> +	if (ret == PINMUX_UART0_TX_SHARED_IO_OFFSET_Q1_3 ||
> +	    ret == PINMUX_UART0_TX_SHARED_IO_OFFSET_Q2_11 ||
> +	    ret == PINMUX_UART0_TX_SHARED_IO_OFFSET_Q3_3)
> +		return SOCFPGA_UART0_ADDRESS;
> +	else if (ret == PINMUX_UART1_TX_SHARED_IO_OFFSET_Q1_7 ||
> +		ret == PINMUX_UART1_TX_SHARED_IO_OFFSET_Q3_7 ||
> +		ret == PINMUX_UART1_TX_SHARED_IO_OFFSET_Q4_3)
> +		return SOCFPGA_UART1_ADDRESS;
> +
> +	return 0;
> +}
> +
> +/*
> + * This function looking the 1st encounter UART peripheral, and then return
> + * base address of the 1st encounter UART peripheral.
> + */
> +unsigned int uart_com_port(const void *blob)
> +{
> +	unsigned int ret;
> +
> +	ret = dedicated_uart_com_port(blob);
> +
> +	if (ret)
> +		return ret;
> +
> +	return shared_uart_com_port(blob);
> +}
> +
> +/*
> + * Print CPU information
> + */
> +#if defined(CONFIG_DISPLAY_CPUINFO)
> +int print_cpuinfo(void)
> +{
> +	const u32 bsel = (readl(&sysmgr_regs->bootinfo) >>
> +			  SYSMGR_BOOTINFO_BSEL_SHIFT) & 0x7;
> +
> +	puts("CPU:   Altera SoCFPGA Arria 10\n");
> +
> +	printf("BOOT:  %s\n", bsel_str[bsel].name);
> +	return 0;
> +}
> +#endif
> +
> +#ifdef CONFIG_ARCH_MISC_INIT
> +int arch_misc_init(void)
> +{
> +	return 0;
> +}
> +#endif
> diff --git a/arch/arm/mach-socfpga/misc_gen5.c b/arch/arm/mach-socfpga/misc_gen5.c
> index f870e1f..3b8ce11 100644
> --- a/arch/arm/mach-socfpga/misc_gen5.c
> +++ b/arch/arm/mach-socfpga/misc_gen5.c
> @@ -200,7 +200,8 @@ static int socfpga_fpga_id(const bool print_id)
>  #if defined(CONFIG_DISPLAY_CPUINFO)
>  int print_cpuinfo(void)
>  {
> -	const u32 bsel = readl(&sysmgr_regs->bootinfo) & 0x7;
> +	const u32 bsel = (readl(&sysmgr_regs->bootinfo) >>
> +			  SYSMGR_BOOTINFO_BSEL_SHIFT) & 0x7;
>  
>  	puts("CPU:   Altera SoCFPGA Platform\n");
>  	socfpga_fpga_id(1);
> 


-- 
Best regards,
Marek Vasut

^ permalink raw reply	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 12/20] arm: socfpga: Add pinmux for Arria 10
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 12/20] arm: socfpga: Add pinmux " Ley Foon Tan
@ 2017-03-10  1:50   ` Marek Vasut
  2017-03-22  6:26     ` Ley Foon Tan
  0 siblings, 1 reply; 60+ messages in thread
From: Marek Vasut @ 2017-03-10  1:50 UTC (permalink / raw)
  To: u-boot

On 03/09/2017 01:26 AM, Ley Foon Tan wrote:
> Add pinmux support for Arria 10.
> 
> Signed-off-by: Tien Fong Chee <tien.fong.chee@intel.com>
> Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
> ---
>  arch/arm/mach-socfpga/Makefile              |  1 +
>  arch/arm/mach-socfpga/include/mach/pinmux.h | 15 +++++
>  arch/arm/mach-socfpga/pinmux_arria10.c      | 96 +++++++++++++++++++++++++++++
>  3 files changed, 112 insertions(+)
>  create mode 100644 arch/arm/mach-socfpga/include/mach/pinmux.h
>  create mode 100644 arch/arm/mach-socfpga/pinmux_arria10.c
> 
> diff --git a/arch/arm/mach-socfpga/Makefile b/arch/arm/mach-socfpga/Makefile
> index 9c4617f..68d55e4 100644
> --- a/arch/arm/mach-socfpga/Makefile
> +++ b/arch/arm/mach-socfpga/Makefile
> @@ -12,6 +12,7 @@ obj-y	+= misc.o timer.o reset_manager.o clock_manager.o \
>  
>  obj-$(CONFIG_TARGET_SOCFPGA_ARRIA10) += clock_manager_arria10.o \
>  					misc_arria10.o		\
> +					pinmux_arria10.o	\
>  					reset_manager_arria10.o
>  
>  obj-$(CONFIG_SPL_BUILD) += spl.o freeze_controller.o
> diff --git a/arch/arm/mach-socfpga/include/mach/pinmux.h b/arch/arm/mach-socfpga/include/mach/pinmux.h
> new file mode 100644
> index 0000000..c5d5dd6
> --- /dev/null
> +++ b/arch/arm/mach-socfpga/include/mach/pinmux.h
> @@ -0,0 +1,15 @@
> +/*
> + * Copyright (C) 2016-2017 Intel Corporation <www.intel.com>
> + *
> + * SPDX-License-Identifier:	GPL-2.0
> + */
> +
> +#ifndef	_PINMUX_H_
> +#define	_PINMUX_H_

#ifndef[SPACE]FOO
#define[SPACE]FOO

please fix globally

> +#ifndef __ASSEMBLY__
> +int config_dedicated_pins(const void *blob);
> +int config_pins(const void *blob, const char *pin_grp);
> +#endif
> +
> +#endif /* _PINMUX_H_ */
> diff --git a/arch/arm/mach-socfpga/pinmux_arria10.c b/arch/arm/mach-socfpga/pinmux_arria10.c
> new file mode 100644
> index 0000000..47339ea
> --- /dev/null
> +++ b/arch/arm/mach-socfpga/pinmux_arria10.c
> @@ -0,0 +1,96 @@
> +/*
> + *  Copyright (C) 2016-2017 Intel Corporation <www.intel.com>
> + *
> + * SPDX-License-Identifier:	GPL-2.0
> + */
> +
> +#include <asm/arch/pinmux.h>
> +#include <asm/io.h>
> +#include <common.h>
> +#include <fdtdec.h>
> +
> +static int do_pinctr_pin(const void *blob, int child, const char *node_name)
> +{
> +	int len;
> +	fdt_addr_t base_addr;
> +	fdt_size_t size;
> +	const u32 *cell;
> +	u32 offset, value;
> +
> +	base_addr = fdtdec_get_addr_size(blob, child, "reg", &size);
> +	if (base_addr != FDT_ADDR_T_NONE) {
> +		cell = fdt_getprop(blob, child, "pinctrl-single,pins",
> +			&len);
> +		if (cell != NULL && len > 0) {

if (!cell)
 continue;
if (len <= 0)
 continue;

> +			debug("%p %d\n", cell, len);
> +			for (; len > 0; len -= (2 * sizeof(u32))) {
> +				offset = fdt32_to_cpu(*cell++);
> +				value = fdt32_to_cpu(*cell++);
> +				debug("<0x%x 0x%x>\n", offset, value);
> +				writel(value, base_addr + offset);
> +			}
> +			return 0;
> +		}
> +	}
> +	return -EFAULT;
> +}
> +
> +static int do_pinctrl_pins(const void *blob, int node, const char *child_name)
> +{
> +	int child, len;
> +	const char *node_name;
> +
> +	child = fdt_first_subnode(blob, node);
> +
> +	if (child < 0)
> +		return -EINVAL;
> +
> +	node_name = fdt_get_name(blob, child, &len);
> +
> +	while (node_name) {
> +		if (!strcmp(child_name, node_name))
> +			return do_pinctr_pin(blob, child, node_name);
> +
> +		child = fdt_next_subnode(blob, child);
> +
> +		if (child < 0)
> +			break;
> +
> +		node_name = fdt_get_name(blob, child, &len);
> +	}
> +
> +	return -EFAULT;
> +}
> +
> +int config_dedicated_pins(const void *blob)
> +{
> +	int node;
> +
> +	node = fdtdec_next_compatible(blob, 0,
> +			COMPAT_ALTERA_SOCFPGA_PINCTRL_SINGLE);
> +	if (node < 0)
> +		return -EINVAL;
> +
> +	if (do_pinctrl_pins(blob, node, "dedicated_cfg"))
> +		return -EFAULT;
> +
> +	if (do_pinctrl_pins(blob, node, "dedicated"))
> +		return -EFAULT;
> +
> +	return 0;
> +}
> +
> +int config_pins(const void *blob, const char *pin_grp)
> +{
> +	int node;
> +
> +	node = fdtdec_next_compatible(blob, 0,
> +			COMPAT_ALTERA_SOCFPGA_PINCTRL_SINGLE);
> +	if (node < 0)
> +		return -EINVAL;
> +
> +	if (do_pinctrl_pins(blob, node, pin_grp))
> +		return -EFAULT;
> +
> +	return 0;
> +}
> 


-- 
Best regards,
Marek Vasut

^ permalink raw reply	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 00/20] Add Intel Arria 10 SoC support
  2017-03-09 21:32 ` [U-Boot] [PATCH v2 00/20] Add Intel Arria 10 SoC support Dinh Nguyen
@ 2017-03-10  1:51   ` Marek Vasut
  0 siblings, 0 replies; 60+ messages in thread
From: Marek Vasut @ 2017-03-10  1:51 UTC (permalink / raw)
  To: u-boot

On 03/09/2017 10:32 PM, Dinh Nguyen wrote:
> On Wed, Mar 8, 2017 at 6:26 PM, Ley Foon Tan <ley.foon.tan@intel.com> wrote:
>> This is the 2nd version of patchset to adds support for Intel Arria 10 SoC.
>> This version mainly resolved comments from Marek in [v1].
>>
> 
> Can you please include me on this patchset? I'd like to help with the
> review process.

Appreciated, thanks.

-- 
Best regards,
Marek Vasut

^ permalink raw reply	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 15/20] arm: socfpga: Add SPL support for Arria 10
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 15/20] arm: socfpga: Add SPL support " Ley Foon Tan
@ 2017-03-10  1:52   ` Marek Vasut
  2017-03-22  8:28     ` Ley Foon Tan
  0 siblings, 1 reply; 60+ messages in thread
From: Marek Vasut @ 2017-03-10  1:52 UTC (permalink / raw)
  To: u-boot

On 03/09/2017 01:26 AM, Ley Foon Tan wrote:
> Add SPL support for Arria 10 and add reset_uart() to use in SPL.
> 
> Signed-off-by: Tien Fong Chee <tien.fong.chee@intel.com>
> Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
> ---
>  .../include/mach/reset_manager_arria10.h           |  1 +
>  arch/arm/mach-socfpga/reset_manager_arria10.c      | 18 +++++++
>  arch/arm/mach-socfpga/spl.c                        | 55 +++++++++++++++++++++-
>  3 files changed, 72 insertions(+), 2 deletions(-)
> 
> diff --git a/arch/arm/mach-socfpga/include/mach/reset_manager_arria10.h b/arch/arm/mach-socfpga/include/mach/reset_manager_arria10.h
> index e3171d1..d0711cf 100644
> --- a/arch/arm/mach-socfpga/include/mach/reset_manager_arria10.h
> +++ b/arch/arm/mach-socfpga/include/mach/reset_manager_arria10.h
> @@ -14,6 +14,7 @@ void emac_manage_reset(ulong emacbase, uint state);
>  int reset_deassert_bridges_handoff(void);
>  void reset_assert_fpga_connected_peripherals(void);
>  void reset_deassert_osc1wd0(void);
> +void reset_uart(int assert);
>  
>  struct socfpga_reset_manager {
>  	u32	stat;
> diff --git a/arch/arm/mach-socfpga/reset_manager_arria10.c b/arch/arm/mach-socfpga/reset_manager_arria10.c
> index 547a8bb..bbf54f0 100644
> --- a/arch/arm/mach-socfpga/reset_manager_arria10.c
> +++ b/arch/arm/mach-socfpga/reset_manager_arria10.c
> @@ -28,6 +28,24 @@ static const struct socfpga_system_manager *sysmgr_regs =
>  	ALT_RSTMGR_PER0MODRST_QSPIECC_SET_MSK | \
>  	ALT_RSTMGR_PER0MODRST_SDMMCECC_SET_MSK)

Should be part of reset manager patch ...

> +void reset_uart(int assert)
> +{
> +	u32 mask = 0;
> +	unsigned int com_port;
> +
> +	com_port = uart_com_port(gd->fdt_blob);
> +
> +	if (com_port == SOCFPGA_UART1_ADDRESS)
> +		mask |= ALT_RSTMGR_PER1MODRST_UART1_SET_MSK;
> +	else if (com_port == SOCFPGA_UART0_ADDRESS)
> +		mask |= ALT_RSTMGR_PER1MODRST_UART0_SET_MSK;
> +
> +	if (assert)
> +		setbits_le32(&reset_manager_base->per1modrst, mask);
> +	else
> +		clrbits_le32(&reset_manager_base->per1modrst, mask);
> +}
> +
>  static const u32 per0fpgamasks[] = {
>  	ALT_RSTMGR_PER0MODRST_EMACECC0_SET_MSK |
>  	ALT_RSTMGR_PER0MODRST_EMAC0_SET_MSK,
> diff --git a/arch/arm/mach-socfpga/spl.c b/arch/arm/mach-socfpga/spl.c
> index fec4c7a..5c0cc98 100644
> --- a/arch/arm/mach-socfpga/spl.c
> +++ b/arch/arm/mach-socfpga/spl.c
> @@ -19,23 +19,32 @@
>  #include <asm/arch/sdram.h>
>  #include <asm/arch/scu.h>
>  #include <asm/arch/nic301.h>
> +#include <asm/sections.h>
> +#include <fdtdec.h>
> +#include <watchdog.h>
> +#if defined(CONFIG_TARGET_SOCFPGA_ARRIA10)
> +#include <asm/arch/pinmux.h>
> +#endif
>  
>  DECLARE_GLOBAL_DATA_PTR;
>  
> +#if defined(CONFIG_TARGET_SOCFPGA_GEN5)
>  static struct pl310_regs *const pl310 =
>  	(struct pl310_regs *)CONFIG_SYS_PL310_BASE;
>  static struct scu_registers *scu_regs =
>  	(struct scu_registers *)SOCFPGA_MPUSCU_ADDRESS;
>  static struct nic301_registers *nic301_regs =
>  	(struct nic301_registers *)SOCFPGA_L3REGS_ADDRESS;
> -static struct socfpga_system_manager *sysmgr_regs =
> +#endif
> +
> +static const struct socfpga_system_manager *sysmgr_regs =
>  	(struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS;
>  
>  u32 spl_boot_device(void)
>  {
>  	const u32 bsel = readl(&sysmgr_regs->bootinfo);
>  
> -	switch (bsel & 0x7) {
> +	switch ((bsel >> SYSMGR_BOOTINFO_BSEL_SHIFT) & 0x7) {
>  	case 0x1:	/* FPGA (HPS2FPGA Bridge) */
>  		return BOOT_DEVICE_RAM;
>  	case 0x2:	/* NAND Flash (1.8V) */
> @@ -68,6 +77,7 @@ u32 spl_boot_mode(const u32 boot_device)
>  }
>  #endif
>  
> +#if defined(CONFIG_TARGET_SOCFPGA_GEN5)
>  static void socfpga_nic301_slave_ns(void)
>  {
>  	writel(0x1, &nic301_regs->lwhps2fpgaregs);
> @@ -182,3 +192,44 @@ void board_init_f(ulong dummy)
>  	/* Configure simple malloc base pointer into RAM. */
>  	gd->malloc_base = CONFIG_SYS_TEXT_BASE + (1024 * 1024);
>  }
> +#elif defined(CONFIG_TARGET_SOCFPGA_ARRIA10)
> +#ifdef CONFIG_SPL_BOARD_INIT
> +void spl_board_init(void)
> +{
> +	/* configuring the clock based on handoff */
> +	cm_basic_init(gd->fdt_blob);
> +	WATCHDOG_RESET();
> +
> +	config_dedicated_pins(gd->fdt_blob);
> +	WATCHDOG_RESET();
> +
> +	/* Release UART from reset */
> +	reset_uart(0);
> +
> +	/* enable console uart printing */
> +	preloader_console_init();
> +}
> +#endif
> +
> +void board_init_f(ulong dummy)
> +{
> +	/*
> +	 * Configure Clock Manager to use intosc clock instead external osc to
> +	 * ensure success watchdog operation. We do it as early as possible.
> +	 */
> +	cm_use_intosc();
> +
> +	watchdog_disable();
> +
> +	arch_early_init_r();
> +
> +#ifdef CONFIG_HW_WATCHDOG
> +	/* release osc1 watchdog timer 0 from reset */
> +	reset_deassert_osc1wd0();
> +
> +	/* reconfigure and enable the watchdog */
> +	hw_watchdog_init();
> +	WATCHDOG_RESET();
> +#endif /* CONFIG_HW_WATCHDOG */
> +}
> +#endif
> 


-- 
Best regards,
Marek Vasut

^ permalink raw reply	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 16/20] drivers: fpga: Add compile switch for Gen5 only registers
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 16/20] drivers: fpga: Add compile switch for Gen5 only registers Ley Foon Tan
@ 2017-03-10  1:53   ` Marek Vasut
  2017-03-22  8:30     ` Ley Foon Tan
  0 siblings, 1 reply; 60+ messages in thread
From: Marek Vasut @ 2017-03-10  1:53 UTC (permalink / raw)
  To: u-boot

On 03/09/2017 01:26 AM, Ley Foon Tan wrote:
> These registers only available for Gen5 device, excludes them

exclude

> if for Arria 10 build.

s/if for/from/

> Signed-off-by: Tien Fong Chee <tien.fong.chee@intel.com>
> Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
> ---
>  drivers/fpga/socfpga.c | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> diff --git a/drivers/fpga/socfpga.c b/drivers/fpga/socfpga.c
> index f1b2f2c..3751574 100644
> --- a/drivers/fpga/socfpga.c
> +++ b/drivers/fpga/socfpga.c
> @@ -19,8 +19,10 @@ DECLARE_GLOBAL_DATA_PTR;
>  
>  static struct socfpga_fpga_manager *fpgamgr_regs =
>  	(struct socfpga_fpga_manager *)SOCFPGA_FPGAMGRREGS_ADDRESS;
> +#if defined(CONFIG_TARGET_SOCFPGA_GEN5)
>  static struct socfpga_system_manager *sysmgr_regs =
>  	(struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS;
> +#endif
>  
>  /* Set CD ratio */
>  static void fpgamgr_set_cd_ratio(unsigned long ratio)
> @@ -268,8 +270,10 @@ int socfpga_load(Altera_desc *desc, const void *rbf_data, size_t rbf_size)
>  
>  	/* Prior programming the FPGA, all bridges need to be shut off */
>  
> +#if defined(CONFIG_TARGET_SOCFPGA_GEN5)
>  	/* Disable all signals from hps peripheral controller to fpga */
>  	writel(0, &sysmgr_regs->fpgaintfgrp_module);
> +#endif
>  
>  	/* Disable all signals from FPGA to HPS SDRAM */
>  #define SDR_CTRLGRP_FPGAPORTRST_ADDRESS	0x5080
> @@ -278,8 +282,10 @@ int socfpga_load(Altera_desc *desc, const void *rbf_data, size_t rbf_size)
>  	/* Disable all axi bridge (hps2fpga, lwhps2fpga & fpga2hps) */
>  	socfpga_bridges_reset(1);
>  
> +#if defined(CONFIG_TARGET_SOCFPGA_GEN5)
>  	/* Unmap the bridges from NIC-301 */
>  	writel(0x1, SOCFPGA_L3REGS_ADDRESS);
> +#endif
>  
>  	/* Initialize the FPGA Manager */
>  	status = fpgamgr_program_init();
> 


-- 
Best regards,
Marek Vasut

^ permalink raw reply	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 17/20] arm: socfpga: Convert Altera ddr driver to use Kconfig
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 17/20] arm: socfpga: Convert Altera ddr driver to use Kconfig Ley Foon Tan
@ 2017-03-10  1:53   ` Marek Vasut
  2017-03-22  9:45     ` Ley Foon Tan
  0 siblings, 1 reply; 60+ messages in thread
From: Marek Vasut @ 2017-03-10  1:53 UTC (permalink / raw)
  To: u-boot

On 03/09/2017 01:26 AM, Ley Foon Tan wrote:
> Convert Altera ddr driver to use Kconfig method. Enable ALTERA_SDRAM
> by default if it is on Gen5 target. Arria 10 will have different driver.
> 
> Signed-off-by: Tien Fong Chee <tien.fong.chee@intel.com>
> Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
> ---
>  drivers/Kconfig                  | 2 ++
>  drivers/ddr/Kconfig              | 1 +
>  drivers/ddr/altera/Kconfig       | 6 ++++++
>  include/configs/socfpga_common.h | 5 -----
>  4 files changed, 9 insertions(+), 5 deletions(-)
>  create mode 100644 drivers/ddr/Kconfig
>  create mode 100644 drivers/ddr/altera/Kconfig
> 
> diff --git a/drivers/Kconfig b/drivers/Kconfig
> index 0e5d97d..3e6bbac 100644
> --- a/drivers/Kconfig
> +++ b/drivers/Kconfig
> @@ -14,6 +14,8 @@ source "drivers/cpu/Kconfig"
>  
>  source "drivers/crypto/Kconfig"
>  
> +source "drivers/ddr/Kconfig"
> +
>  source "drivers/demo/Kconfig"
>  
>  source "drivers/ddr/fsl/Kconfig"
> diff --git a/drivers/ddr/Kconfig b/drivers/ddr/Kconfig
> new file mode 100644
> index 0000000..b764add
> --- /dev/null
> +++ b/drivers/ddr/Kconfig
> @@ -0,0 +1 @@
> +source "drivers/ddr/altera/Kconfig"
> diff --git a/drivers/ddr/altera/Kconfig b/drivers/ddr/altera/Kconfig
> new file mode 100644
> index 0000000..9554da7
> --- /dev/null
> +++ b/drivers/ddr/altera/Kconfig
> @@ -0,0 +1,6 @@
> +config ALTERA_SDRAM
> +	bool "SoCFPGA SDRAM for Arria5/Cyclone5 devices"

Does this controller even support SDRAM ? :)

> +	default y if TARGET_SOCFPGA_GEN5
> +	help
> +	  This is for building the SDRAM controller for the Arria5/Cyclone5
> +	  devices.
> diff --git a/include/configs/socfpga_common.h b/include/configs/socfpga_common.h
> index 55e0bf9..bc92a2c 100644
> --- a/include/configs/socfpga_common.h
> +++ b/include/configs/socfpga_common.h
> @@ -77,11 +77,6 @@
>  #define CONFIG_SYS_PL310_BASE		SOCFPGA_MPUL2_ADDRESS
>  
>  /*
> - * SDRAM controller
> - */
> -#define CONFIG_ALTERA_SDRAM
> -
> -/*
>   * EPCS/EPCQx1 Serial Flash Controller
>   */
>  #ifdef CONFIG_ALTERA_SPI
> 


-- 
Best regards,
Marek Vasut

^ permalink raw reply	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 18/20] arm: socfpga: Add config and defconfig for Arria 10
  2017-03-09  0:26 ` [U-Boot] [PATCH v2 18/20] arm: socfpga: Add config and defconfig for Arria 10 Ley Foon Tan
@ 2017-03-10  1:55   ` Marek Vasut
  2017-03-22  8:39     ` Ley Foon Tan
  0 siblings, 1 reply; 60+ messages in thread
From: Marek Vasut @ 2017-03-10  1:55 UTC (permalink / raw)
  To: u-boot

On 03/09/2017 01:26 AM, Ley Foon Tan wrote:
> Add config and defconfig for the Arria10 and update socfpga_common.h.
> 
> Signed-off-by: Tien Fong Chee <tien.fong.chee@intel.com>
> Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
> ---
>  configs/socfpga_arria10_defconfig       | 30 +++++++++++++++
>  include/configs/socfpga_arria10_socdk.h | 67 +++++++++++++++++++++++++++++++++
>  include/configs/socfpga_common.h        | 28 ++++++++++++--
>  3 files changed, 121 insertions(+), 4 deletions(-)
>  create mode 100644 configs/socfpga_arria10_defconfig
>  create mode 100644 include/configs/socfpga_arria10_socdk.h
> 
> diff --git a/configs/socfpga_arria10_defconfig b/configs/socfpga_arria10_defconfig
> new file mode 100644
> index 0000000..9e6bc1e0
> --- /dev/null
> +++ b/configs/socfpga_arria10_defconfig
> @@ -0,0 +1,30 @@
> +CONFIG_ARM=y
> +CONFIG_ARCH_SOCFPGA=y
> +CONFIG_SYS_MALLOC_F_LEN=0x2000
> +CONFIG_TARGET_SOCFPGA_ARRIA10_SOCDK=y
> +CONFIG_IDENT_STRING="socfpga_arria10"
> +CONFIG_DEFAULT_DEVICE_TREE="socfpga_arria10_socdk_sdmmc"
> +CONFIG_DEFAULT_FDT_FILE="socfpga_arria10_socdk_sdmmc.dtb"
> +CONFIG_SPL=y
> +CONFIG_CMD_BOOTZ=y
> +# CONFIG_CMD_IMLS is not set
> +CONFIG_CMD_ASKENV=y
> +CONFIG_CMD_GREPENV=y
> +# CONFIG_CMD_FLASH is not set
> +CONFIG_CMD_MMC=y
> +CONFIG_CMD_GPIO=y
> +CONFIG_CMD_PING=y
> +CONFIG_CMD_CACHE=y
> +CONFIG_CMD_EXT4=y
> +CONFIG_CMD_EXT4_WRITE=y
> +CONFIG_DOS_PARTITION=y
> +# CONFIG_SPL_DOS_PARTITION is not set
> +CONFIG_SPL_DM=y
> +CONFIG_SPL_DM_SEQ_ALIAS=y
> +CONFIG_DM_GPIO=y
> +CONFIG_DWAPB_GPIO=y
> +CONFIG_DM_MMC=y
> +CONFIG_SYS_NS16550=y
> +CONFIG_USE_TINY_PRINTF=y
> +CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION_TYPE=y
> +CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION_TYPE=0xa2
> diff --git a/include/configs/socfpga_arria10_socdk.h b/include/configs/socfpga_arria10_socdk.h
> new file mode 100644
> index 0000000..5b7d572
> --- /dev/null
> +++ b/include/configs/socfpga_arria10_socdk.h
> @@ -0,0 +1,67 @@
> +/*
> + *  Copyright (C) 2015-2017 Altera Corporation <www.altera.com>
> + *
> + * SPDX-License-Identifier:	GPL-2.0
> + */
> +
> +#ifndef __CONFIG_SOCFGPA_ARRIA10_H__
> +#define __CONFIG_SOCFGPA_ARRIA10_H__
> +
> +#include <asm/arch/base_addr_a10.h>
> +/* U-Boot Commands */
> +#define CONFIG_FAT_WRITE
> +#define CONFIG_HW_WATCHDOG
> +
> +

Drop this extra newline

> +/* Booting Linux */
> +#define CONFIG_LOADADDR		0x01000000
> +#define CONFIG_SYS_LOAD_ADDR	CONFIG_LOADADDR
> +
> +/*
> + * U-Boot general configurations
> + */
> +/* Cache options */
> +#define CONFIG_SYS_DCACHE_OFF
> +
> +/* Memory configurations  */
> +#define PHYS_SDRAM_1_SIZE		0x80000000
> +
> +/* Ethernet on SoC (EMAC) */
> +#if defined(CONFIG_CMD_NET)
> +#define CONFIG_PHY_MICREL
> +#define CONFIG_PHY_MICREL_KSZ9031
> +#endif
> +
> +/*
> + * U-Boot environment configurations
> + */
> +#define CONFIG_ENV_IS_IN_MMC
> +
> +/*
> + * arguments passed to the bootz command. The value of
> + * CONFIG_BOOTARGS goes into the environment value "bootargs".
> + * Do note the value will overide also the chosen node in FDT blob.
> + */
> +#define CONFIG_BOOTARGS "console=ttyS0," __stringify(CONFIG_BAUDRATE)
> +
> +/*
> + * Serial / UART configurations
> + */
> +#define CONFIG_SYS_NS16550_MEM32
> +#define CONFIG_SYS_BAUDRATE_TABLE {4800, 9600, 19200, 38400, 57600, 115200}
> +
> +/*
> + * L4 OSC1 Timer 0
> + */
> +/* reload value when timer count to zero */
> +#define TIMER_LOAD_VAL			0xFFFFFFFF
> +
> +/*
> + * Flash configurations
> + */
> +#define CONFIG_SYS_MAX_FLASH_BANKS     1
> +
> +/* The rest of the configuration is shared */
> +#include <configs/socfpga_common.h>
> +
> +#endif	/* __CONFIG_SOCFGPA_ARRIA10_H__ */
> diff --git a/include/configs/socfpga_common.h b/include/configs/socfpga_common.h
> index bc92a2c..a228ea5 100644
> --- a/include/configs/socfpga_common.h
> +++ b/include/configs/socfpga_common.h
> @@ -34,9 +34,13 @@
>  #define CONFIG_SYS_MALLOC_LEN		(64 * 1024 * 1024)
>  #define CONFIG_SYS_MEMTEST_START	PHYS_SDRAM_1
>  #define CONFIG_SYS_MEMTEST_END		PHYS_SDRAM_1_SIZE
> -
> +#if defined(CONFIG_TARGET_SOCFPGA_GEN5)
>  #define CONFIG_SYS_INIT_RAM_ADDR	0xFFFF0000
>  #define CONFIG_SYS_INIT_RAM_SIZE	0x10000
> +#elif defined(CONFIG_TARGET_SOCFPGA_ARRIA10)
> +#define CONFIG_SYS_INIT_RAM_ADDR	0xFFE00000
> +#define CONFIG_SYS_INIT_RAM_SIZE	0x40000 /* 256KB */
> +#endif
>  #define CONFIG_SYS_INIT_SP_OFFSET		\
>  	(CONFIG_SYS_INIT_RAM_SIZE - GENERATED_GBL_DATA_SIZE)
>  #define CONFIG_SYS_INIT_SP_ADDR			\
> @@ -67,8 +71,10 @@
>  #define CONFIG_SYS_HOSTNAME	CONFIG_SYS_BOARD
>  #endif
>  
> +#if defined(CONFIG_TARGET_SOCFPGA_GEN5)
>  #define CONFIG_CMD_PXE
>  #define CONFIG_MENU
> +#endif
>  
>  /*
>   * Cache
> @@ -103,13 +109,14 @@
>  /*
>   * FPGA Driver
>   */
> +#ifdef CONFIG_TARGET_SOCFPGA_GEN5
>  #ifdef CONFIG_CMD_FPGA
>  #define CONFIG_FPGA
>  #define CONFIG_FPGA_ALTERA
>  #define CONFIG_FPGA_SOCFPGA
>  #define CONFIG_FPGA_COUNT		1
>  #endif
> -
> +#endif
>  /*
>   * L4 OSC1 Timer 0
>   */
> @@ -209,11 +216,14 @@ unsigned int cm_get_qspi_controller_clk_hz(void);
>   */
>  #define CONFIG_SYS_NS16550_SERIAL
>  #define CONFIG_SYS_NS16550_REG_SIZE	-4
> -#define CONFIG_SYS_NS16550_COM1		SOCFPGA_UART0_ADDRESS
>  #ifdef CONFIG_SOCFPGA_VIRTUAL_TARGET
>  #define CONFIG_SYS_NS16550_CLK		1000000
> -#else
> +#elif defined(CONFIG_TARGET_SOCFPGA_GEN5)
> +#define CONFIG_SYS_NS16550_COM1		SOCFPGA_UART0_ADDRESS
>  #define CONFIG_SYS_NS16550_CLK		100000000
> +#elif defined(CONFIG_TARGET_SOCFPGA_ARRIA10)
> +#define CONFIG_SYS_NS16550_COM1        SOCFPGA_UART1_ADDRESS
> +#define CONFIG_SYS_NS16550_CLK		50000000
>  #endif
>  #define CONFIG_CONS_INDEX		1
>  #define CONFIG_BAUDRATE			115200
> @@ -301,7 +311,12 @@ unsigned int cm_get_qspi_controller_clk_hz(void);
>   */
>  #define CONFIG_SPL_FRAMEWORK
>  #define CONFIG_SPL_TEXT_BASE		CONFIG_SYS_INIT_RAM_ADDR
> +#if defined(CONFIG_TARGET_SOCFPGA_GEN5)
>  #define CONFIG_SPL_MAX_SIZE		(64 * 1024)

This should also be INIT_RAM_SIZE IMO   ^^

> +#elif defined(CONFIG_TARGET_SOCFPGA_ARRIA10)
> +#define CONFIG_SPL_MAX_SIZE		CONFIG_SYS_INIT_RAM_SIZE
> +#define CONFIG_SPL_BOARD_INIT
> +#endif
>  
>  /* SPL SDMMC boot support */
>  #ifdef CONFIG_SPL_MMC_SUPPORT
> @@ -349,10 +364,15 @@ unsigned int cm_get_qspi_controller_clk_hz(void);
>  #define BOOT_TARGET_DEVICES_MMC(func)
>  #endif
>  
> +#if defined(CONFIG_TARGET_SOCFPGA_GEN5)
>  #define BOOT_TARGET_DEVICES(func) \
>  	BOOT_TARGET_DEVICES_MMC(func) \
>  	BOOT_TARGET_DEVICES_PXE(func) \
>  	func(DHCP, dhcp, na)
> +#elif defined(CONFIG_TARGET_SOCFPGA_ARRIA10)
> +#define BOOT_TARGET_DEVICES(func) \
> +	BOOT_TARGET_DEVICES_MMC(func)
> +#endif
>  
>  #include <config_distro_bootcmd.h>
>  
> 


-- 
Best regards,
Marek Vasut

^ permalink raw reply	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 00/20] Add Intel Arria 10 SoC support
  2017-03-09  0:26 [U-Boot] [PATCH v2 00/20] Add Intel Arria 10 SoC support Ley Foon Tan
                   ` (20 preceding siblings ...)
  2017-03-09 21:32 ` [U-Boot] [PATCH v2 00/20] Add Intel Arria 10 SoC support Dinh Nguyen
@ 2017-03-16 21:56 ` Marek Vasut
  2017-03-17 12:25   ` Ley Foon Tan
  21 siblings, 1 reply; 60+ messages in thread
From: Marek Vasut @ 2017-03-16 21:56 UTC (permalink / raw)
  To: u-boot

On 03/09/2017 01:26 AM, Ley Foon Tan wrote:
> This is the 2nd version of patchset to adds support for Intel Arria 10 SoC.
> This version mainly resolved comments from Marek in [v1].
> 
> This is initial patchset enables the basic support for Arria 10 and other
> features will come after this.
> 
> This series is working on top of “arm: socfpga: Move to using distro boot”
> series [1] from Dalon Westergreen.
> 
> [1]: https://www.mail-archive.com/u-boot at lists.denx.de/msg239560.html

I have to wonder, will the A10 SoCDK be usable with mainline U-Boot with
just this patchset or is something else missing, like ie. the
DDR driver ?

-- 
Best regards,
Marek Vasut

^ permalink raw reply	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 00/20] Add Intel Arria 10 SoC support
  2017-03-16 21:56 ` Marek Vasut
@ 2017-03-17 12:25   ` Ley Foon Tan
  2017-03-17 12:28     ` Marek Vasut
  0 siblings, 1 reply; 60+ messages in thread
From: Ley Foon Tan @ 2017-03-17 12:25 UTC (permalink / raw)
  To: u-boot

Hi Marek

On Fri, Mar 17, 2017 at 5:56 AM, Marek Vasut <marex@denx.de> wrote:
> On 03/09/2017 01:26 AM, Ley Foon Tan wrote:
>> This is the 2nd version of patchset to adds support for Intel Arria 10 SoC.
>> This version mainly resolved comments from Marek in [v1].
>>
>> This is initial patchset enables the basic support for Arria 10 and other
>> features will come after this.
>>
>> This series is working on top of “arm: socfpga: Move to using distro boot”
>> series [1] from Dalon Westergreen.
>>
>> [1]: https://www.mail-archive.com/u-boot at lists.denx.de/msg239560.html
>
> I have to wonder, will the A10 SoCDK be usable with mainline U-Boot with
> just this patchset or is something else missing, like ie. the
> DDR driver ?

We want to get the basic upstream first and then will submit the
patchset for DDR and other components after this.

Regards
Ley Foon

^ permalink raw reply	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 00/20] Add Intel Arria 10 SoC support
  2017-03-17 12:25   ` Ley Foon Tan
@ 2017-03-17 12:28     ` Marek Vasut
  2017-03-20  7:33       ` Ley Foon Tan
  0 siblings, 1 reply; 60+ messages in thread
From: Marek Vasut @ 2017-03-17 12:28 UTC (permalink / raw)
  To: u-boot

On 03/17/2017 01:25 PM, Ley Foon Tan wrote:
> Hi Marek

Hi!

> On Fri, Mar 17, 2017 at 5:56 AM, Marek Vasut <marex@denx.de> wrote:
>> On 03/09/2017 01:26 AM, Ley Foon Tan wrote:
>>> This is the 2nd version of patchset to adds support for Intel Arria 10 SoC.
>>> This version mainly resolved comments from Marek in [v1].
>>>
>>> This is initial patchset enables the basic support for Arria 10 and other
>>> features will come after this.
>>>
>>> This series is working on top of “arm: socfpga: Move to using distro boot”
>>> series [1] from Dalon Westergreen.
>>>
>>> [1]: https://www.mail-archive.com/u-boot at lists.denx.de/msg239560.html
>>
>> I have to wonder, will the A10 SoCDK be usable with mainline U-Boot with
>> just this patchset or is something else missing, like ie. the
>> DDR driver ?
> 
> We want to get the basic upstream first and then will submit the
> patchset for DDR and other components after this.

Do you have the full patchset, which can be used to boot Arria10 SoCDK,
available somewhere ? I would like to know how the pieces fit together.

-- 
Best regards,
Marek Vasut

^ permalink raw reply	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 00/20] Add Intel Arria 10 SoC support
  2017-03-17 12:28     ` Marek Vasut
@ 2017-03-20  7:33       ` Ley Foon Tan
  2017-03-21  8:26         ` Marek Vasut
  0 siblings, 1 reply; 60+ messages in thread
From: Ley Foon Tan @ 2017-03-20  7:33 UTC (permalink / raw)
  To: u-boot

On Fri, Mar 17, 2017 at 8:28 PM, Marek Vasut <marex@denx.de> wrote:
> On 03/17/2017 01:25 PM, Ley Foon Tan wrote:
>> Hi Marek
>
> Hi!
>
>> On Fri, Mar 17, 2017 at 5:56 AM, Marek Vasut <marex@denx.de> wrote:
>>> On 03/09/2017 01:26 AM, Ley Foon Tan wrote:
>>>> This is the 2nd version of patchset to adds support for Intel Arria 10 SoC.
>>>> This version mainly resolved comments from Marek in [v1].
>>>>
>>>> This is initial patchset enables the basic support for Arria 10 and other
>>>> features will come after this.
>>>>
>>>> This series is working on top of “arm: socfpga: Move to using distro boot”
>>>> series [1] from Dalon Westergreen.
>>>>
>>>> [1]: https://www.mail-archive.com/u-boot at lists.denx.de/msg239560.html
>>>
>>> I have to wonder, will the A10 SoCDK be usable with mainline U-Boot with
>>> just this patchset or is something else missing, like ie. the
>>> DDR driver ?
>>
>> We want to get the basic upstream first and then will submit the
>> patchset for DDR and other components after this.
>
> Do you have the full patchset, which can be used to boot Arria10 SoCDK,
> available somewhere ? I would like to know how the pieces fit together.
Tien Foong is working on the sub sequence patchset, eg: for FPGA
manager and DDR.
He already got these 2 drivers, but still trying to get it boot to
U-boot stage with mainline U-boot.
We can send to you if you want take a look.

Thanks.

Regards
Ley Foon

^ permalink raw reply	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 01/20] arm: socfpga: Restructure clock manager driver
  2017-03-09 16:29   ` Dinh Nguyen
@ 2017-03-21  7:26     ` Ley Foon Tan
  0 siblings, 0 replies; 60+ messages in thread
From: Ley Foon Tan @ 2017-03-21  7:26 UTC (permalink / raw)
  To: u-boot

On Fri, Mar 10, 2017 at 12:29 AM, Dinh Nguyen <dinguyen@kernel.org> wrote:
>
>
> On 03/08/2017 06:26 PM, Ley Foon Tan wrote:
>> Restructure clock manager driver in the preparation to support A10.
>> Move the Gen5 specific code to _gen5 files. No functional change.
>>
>> Change all uint32_t to u32 and change to use macro BIT(n) for bit shift.
>>
>> Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
>> ---
>>  arch/arm/mach-socfpga/Makefile                     |   3 +-
>>  arch/arm/mach-socfpga/clock_manager.c              | 510 +--------------------
>>  arch/arm/mach-socfpga/clock_manager_gen5.c         | 510 +++++++++++++++++++++
>>  arch/arm/mach-socfpga/include/mach/clock_manager.h | 312 +------------
>>  .../mach-socfpga/include/mach/clock_manager_gen5.h | 322 +++++++++++++
>>  5 files changed, 846 insertions(+), 811 deletions(-)
>>  create mode 100644 arch/arm/mach-socfpga/clock_manager_gen5.c
>>  create mode 100644 arch/arm/mach-socfpga/include/mach/clock_manager_gen5.h
>>
>
> Please add a -C when you run format-patch, you'll get something like this:
>
>  5 files changed, 104 insertions(+), 947 deletions(-)
>  copy arch/arm/mach-socfpga/{clock_manager.c => clock_manager_gen5.c} (88%)
>  copy arch/arm/mach-socfpga/include/mach/{clock_manager.h =>
> clock_manager_gen5.h} (87%)
>
> It it make things a bit smaller to review for simple file copies.
>
Okay, will do it next revision.
Thanks.

Regards
Ley Foon

^ permalink raw reply	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 04/20] arm: socfpga: Restructure misc driver
  2017-03-10  1:36   ` Marek Vasut
@ 2017-03-21  7:44     ` Ley Foon Tan
  2017-03-21  8:25       ` Marek Vasut
  0 siblings, 1 reply; 60+ messages in thread
From: Ley Foon Tan @ 2017-03-21  7:44 UTC (permalink / raw)
  To: u-boot

On Fri, Mar 10, 2017 at 9:36 AM, Marek Vasut <marex@denx.de> wrote:
> On 03/09/2017 01:26 AM, Ley Foon Tan wrote:
>> Restructure misc driver in the preparation to support A10.
>> Move the Gen5 specific code to _gen5 file. No functional change.
>>
>> Change all uint32_t_to u32.
>>
>> Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
>> ---
>>  arch/arm/mach-socfpga/Makefile            |   3 +-
>>  arch/arm/mach-socfpga/include/mach/misc.h |  26 +++
>>  arch/arm/mach-socfpga/misc.c              | 361 ++----------------------------
>>  arch/arm/mach-socfpga/misc_gen5.c         | 355 +++++++++++++++++++++++++++++
>>  4 files changed, 398 insertions(+), 347 deletions(-)
>>  create mode 100644 arch/arm/mach-socfpga/include/mach/misc.h
>>  create mode 100644 arch/arm/mach-socfpga/misc_gen5.c
>>
>> diff --git a/arch/arm/mach-socfpga/Makefile b/arch/arm/mach-socfpga/Makefile
>> index 97819ac..5b09ea9 100644
>> --- a/arch/arm/mach-socfpga/Makefile
>> +++ b/arch/arm/mach-socfpga/Makefile
>> @@ -14,7 +14,8 @@ obj-$(CONFIG_SPL_BUILD) += spl.o freeze_controller.o
>>
>>  # QTS-generated config file wrappers
>>  obj-$(CONFIG_TARGET_SOCFPGA_GEN5)    += scan_manager.o wrap_pll_config.o \
>> -                                        clock_manager_gen5.o reset_manager_gen5.o
>> +                                        clock_manager_gen5.o reset_manager_gen5.o \
>> +                                        misc_gen5.o
>>  obj-$(CONFIG_SPL_BUILD) += wrap_iocsr_config.o wrap_pinmux_config.o  \
>>                          wrap_sdram_config.o
>>  CFLAGS_wrap_iocsr_config.o   += -I$(srctree)/board/$(BOARDDIR)
>> diff --git a/arch/arm/mach-socfpga/include/mach/misc.h b/arch/arm/mach-socfpga/include/mach/misc.h
>> new file mode 100644
>> index 0000000..64f9b86
>> --- /dev/null
>> +++ b/arch/arm/mach-socfpga/include/mach/misc.h
>> @@ -0,0 +1,26 @@
>> +/*
>> + * Copyright (C) 2016-2017 Intel Corporation
>> + *
>> + * SPDX-License-Identifier:    GPL-2.0
>> + */
>> +
>> +#ifndef _MISC_H_
>> +#define _MISC_H_
>> +
>> +void dwmac_deassert_reset(const unsigned int of_reset_id,
>> +                              const u32 phymode);
>> +
>> +struct bsel {
>> +     const char      *mode;
>> +     const char      *name;
>> +};
>> +
>> +extern struct bsel bsel_str[];
>
> I'm really not a big fan of extern variables, can we get rid of this?
For public variable, we need extern keyword here. Only function
prototype doesn't need the extern.

>
>> +#ifdef CONFIG_FPGA
>> +void socfpga_fpga_add(void);
>> +#else
>> +inline void socfpga_fpga_add(void) {}
>
> static
>
Okay.

[...]

Regards
Ley Foon

^ permalink raw reply	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 06/20] arm: socfpga: Add A10 defines
  2017-03-10  1:38   ` Marek Vasut
@ 2017-03-21  8:05     ` Ley Foon Tan
  0 siblings, 0 replies; 60+ messages in thread
From: Ley Foon Tan @ 2017-03-21  8:05 UTC (permalink / raw)
  To: u-boot

On Fri, Mar 10, 2017 at 9:38 AM, Marek Vasut <marex@denx.de> wrote:
> On 03/09/2017 01:26 AM, Ley Foon Tan wrote:
>> Add i2c, timer and other A10 defines.
>
> macros ... btw. you're defining macro with their address.
>
Okay.

Thanks.
Regards
Ley Foon

^ permalink raw reply	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 04/20] arm: socfpga: Restructure misc driver
  2017-03-21  7:44     ` Ley Foon Tan
@ 2017-03-21  8:25       ` Marek Vasut
  2017-03-22  8:16         ` Ley Foon Tan
  0 siblings, 1 reply; 60+ messages in thread
From: Marek Vasut @ 2017-03-21  8:25 UTC (permalink / raw)
  To: u-boot

On 03/21/2017 08:44 AM, Ley Foon Tan wrote:
> On Fri, Mar 10, 2017 at 9:36 AM, Marek Vasut <marex@denx.de> wrote:
>> On 03/09/2017 01:26 AM, Ley Foon Tan wrote:
>>> Restructure misc driver in the preparation to support A10.
>>> Move the Gen5 specific code to _gen5 file. No functional change.
>>>
>>> Change all uint32_t_to u32.
>>>
>>> Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
>>> ---
>>>  arch/arm/mach-socfpga/Makefile            |   3 +-
>>>  arch/arm/mach-socfpga/include/mach/misc.h |  26 +++
>>>  arch/arm/mach-socfpga/misc.c              | 361 ++----------------------------
>>>  arch/arm/mach-socfpga/misc_gen5.c         | 355 +++++++++++++++++++++++++++++
>>>  4 files changed, 398 insertions(+), 347 deletions(-)
>>>  create mode 100644 arch/arm/mach-socfpga/include/mach/misc.h
>>>  create mode 100644 arch/arm/mach-socfpga/misc_gen5.c
>>>
>>> diff --git a/arch/arm/mach-socfpga/Makefile b/arch/arm/mach-socfpga/Makefile
>>> index 97819ac..5b09ea9 100644
>>> --- a/arch/arm/mach-socfpga/Makefile
>>> +++ b/arch/arm/mach-socfpga/Makefile
>>> @@ -14,7 +14,8 @@ obj-$(CONFIG_SPL_BUILD) += spl.o freeze_controller.o
>>>
>>>  # QTS-generated config file wrappers
>>>  obj-$(CONFIG_TARGET_SOCFPGA_GEN5)    += scan_manager.o wrap_pll_config.o \
>>> -                                        clock_manager_gen5.o reset_manager_gen5.o
>>> +                                        clock_manager_gen5.o reset_manager_gen5.o \
>>> +                                        misc_gen5.o
>>>  obj-$(CONFIG_SPL_BUILD) += wrap_iocsr_config.o wrap_pinmux_config.o  \
>>>                          wrap_sdram_config.o
>>>  CFLAGS_wrap_iocsr_config.o   += -I$(srctree)/board/$(BOARDDIR)
>>> diff --git a/arch/arm/mach-socfpga/include/mach/misc.h b/arch/arm/mach-socfpga/include/mach/misc.h
>>> new file mode 100644
>>> index 0000000..64f9b86
>>> --- /dev/null
>>> +++ b/arch/arm/mach-socfpga/include/mach/misc.h
>>> @@ -0,0 +1,26 @@
>>> +/*
>>> + * Copyright (C) 2016-2017 Intel Corporation
>>> + *
>>> + * SPDX-License-Identifier:    GPL-2.0
>>> + */
>>> +
>>> +#ifndef _MISC_H_
>>> +#define _MISC_H_
>>> +
>>> +void dwmac_deassert_reset(const unsigned int of_reset_id,
>>> +                              const u32 phymode);
>>> +
>>> +struct bsel {
>>> +     const char      *mode;
>>> +     const char      *name;
>>> +};
>>> +
>>> +extern struct bsel bsel_str[];
>>
>> I'm really not a big fan of extern variables, can we get rid of this?
> For public variable, we need extern keyword here. Only function
> prototype doesn't need the extern.

Why does this have to be in public namespace anyway ?

-- 
Best regards,
Marek Vasut

^ permalink raw reply	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 00/20] Add Intel Arria 10 SoC support
  2017-03-20  7:33       ` Ley Foon Tan
@ 2017-03-21  8:26         ` Marek Vasut
  0 siblings, 0 replies; 60+ messages in thread
From: Marek Vasut @ 2017-03-21  8:26 UTC (permalink / raw)
  To: u-boot

On 03/20/2017 08:33 AM, Ley Foon Tan wrote:
> On Fri, Mar 17, 2017 at 8:28 PM, Marek Vasut <marex@denx.de> wrote:
>> On 03/17/2017 01:25 PM, Ley Foon Tan wrote:
>>> Hi Marek
>>
>> Hi!
>>
>>> On Fri, Mar 17, 2017 at 5:56 AM, Marek Vasut <marex@denx.de> wrote:
>>>> On 03/09/2017 01:26 AM, Ley Foon Tan wrote:
>>>>> This is the 2nd version of patchset to adds support for Intel Arria 10 SoC.
>>>>> This version mainly resolved comments from Marek in [v1].
>>>>>
>>>>> This is initial patchset enables the basic support for Arria 10 and other
>>>>> features will come after this.
>>>>>
>>>>> This series is working on top of “arm: socfpga: Move to using distro boot”
>>>>> series [1] from Dalon Westergreen.
>>>>>
>>>>> [1]: https://www.mail-archive.com/u-boot at lists.denx.de/msg239560.html
>>>>
>>>> I have to wonder, will the A10 SoCDK be usable with mainline U-Boot with
>>>> just this patchset or is something else missing, like ie. the
>>>> DDR driver ?
>>>
>>> We want to get the basic upstream first and then will submit the
>>> patchset for DDR and other components after this.
>>
>> Do you have the full patchset, which can be used to boot Arria10 SoCDK,
>> available somewhere ? I would like to know how the pieces fit together.
> Tien Foong is working on the sub sequence patchset, eg: for FPGA
> manager and DDR.
> He already got these 2 drivers, but still trying to get it boot to
> U-boot stage with mainline U-boot.
> We can send to you if you want take a look.

That'd be real nice, thanks !

-- 
Best regards,
Marek Vasut

^ permalink raw reply	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 08/20] arm: socfpga: Add clock driver for Arria 10
  2017-03-10  1:47   ` Marek Vasut
@ 2017-03-22  6:14     ` Ley Foon Tan
  0 siblings, 0 replies; 60+ messages in thread
From: Ley Foon Tan @ 2017-03-22  6:14 UTC (permalink / raw)
  To: u-boot

On Fri, Mar 10, 2017 at 9:47 AM, Marek Vasut <marex@denx.de> wrote:
> On 03/09/2017 01:26 AM, Ley Foon Tan wrote:
>> Add clock driver support for Arria 10.
>>
>> Signed-off-by: Tien Fong Chee <tien.fong.chee@intel.com>
>> Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
>> ---
>>  arch/arm/mach-socfpga/Makefile                     |    3 +-
>>  arch/arm/mach-socfpga/clock_manager.c              |   18 +-
>>  arch/arm/mach-socfpga/clock_manager_arria10.c      | 1104 ++++++++++++++++++++
>>  arch/arm/mach-socfpga/include/mach/clock_manager.h |    6 +
>>  .../include/mach/clock_manager_arria10.h           |  222 ++++
>>  5 files changed, 1350 insertions(+), 3 deletions(-)
>>  create mode 100644 arch/arm/mach-socfpga/clock_manager_arria10.c
>>  create mode 100644 arch/arm/mach-socfpga/include/mach/clock_manager_arria10.h
>>
>> diff --git a/arch/arm/mach-socfpga/Makefile b/arch/arm/mach-socfpga/Makefile
>> index d81f003..c494930 100644
>> --- a/arch/arm/mach-socfpga/Makefile
>> +++ b/arch/arm/mach-socfpga/Makefile
>> @@ -10,7 +10,8 @@
>>  obj-y        += misc.o timer.o reset_manager.o clock_manager.o \
>>          fpga_manager.o board.o
>>
>> -obj-$(CONFIG_TARGET_SOCFPGA_ARRIA10) += reset_manager_arria10.o
>> +obj-$(CONFIG_TARGET_SOCFPGA_ARRIA10) += clock_manager_arria10.o \
>> +                                     reset_manager_arria10.o
>>
>>  obj-$(CONFIG_SPL_BUILD) += spl.o freeze_controller.o
>>
>> diff --git a/arch/arm/mach-socfpga/clock_manager.c b/arch/arm/mach-socfpga/clock_manager.c
>> index c2af6f3..ad602c8 100644
>> --- a/arch/arm/mach-socfpga/clock_manager.c
>> +++ b/arch/arm/mach-socfpga/clock_manager.c
>> @@ -5,6 +5,8 @@
>>   */
>>
>>  #include <common.h>
>> +#include <fdtdec.h>
>> +#include <wait_bit.h>
>>  #include <asm/io.h>
>>  #include <asm/arch/clock_manager.h>
>>
>> @@ -18,7 +20,12 @@ void cm_wait_for_lock(u32 mask)
>>       u32 inter_val;
>>       u32 retry = 0;
>>       do {
>> +#if defined(CONFIG_TARGET_SOCFPGA_GEN5)
>>               inter_val = readl(&clock_manager_base->inter) & mask;
>> +#elif defined(CONFIG_TARGET_SOCFPGA_ARRIA10)
>> +             inter_val = readl(&clock_manager_base->stat) & mask;
>> +#endif
>> +             /* Wait for stable lock */
>>               if (inter_val == mask)
>>                       retry++;
>>               else
>> @@ -31,8 +38,10 @@ void cm_wait_for_lock(u32 mask)
>>  /* function to poll in the fsm busy bit */
>>  void cm_wait_for_fsm(void)
>>  {
>> -     while (readl(&clock_manager_base->stat) & CLKMGR_STAT_BUSY)
>> -             ;
>> +     wait_for_bit(__func__, (const u32 *)&clock_manager_base->stat,
>> +                  CLKMGR_CLKMGR_STAT_BUSY_SET_MSK,
>> +                  false, 20000, false);
>
> Please do test this change on CV or AV if you didn't already.
>
>> +
>>  }
>>
>>  int set_cpu_clk_info(void)
>> @@ -43,7 +52,12 @@ int set_cpu_clk_info(void)
>>
>>       gd->bd->bi_arm_freq = cm_get_mpu_clk_hz() / 1000000;
>>       gd->bd->bi_dsp_freq = 0;
>> +
>> +#if defined(CONFIG_TARGET_SOCFPGA_GEN5)
>>       gd->bd->bi_ddr_freq = cm_get_sdram_clk_hz() / 1000000;
>> +#elif defined(CONFIG_TARGET_SOCFPGA_ARRIA10)
>> +     gd->bd->bi_ddr_freq = 0;
>> +#endif
>>
>>       return 0;
>>  }
>> diff --git a/arch/arm/mach-socfpga/clock_manager_arria10.c b/arch/arm/mach-socfpga/clock_manager_arria10.c
>> new file mode 100644
>> index 0000000..67b3e58
>> --- /dev/null
>> +++ b/arch/arm/mach-socfpga/clock_manager_arria10.c
>> @@ -0,0 +1,1104 @@
>> +/*
>> + * Copyright (C) 2016-2017 Intel Corporation
>> + *
>> + * SPDX-License-Identifier:    GPL-2.0
>> + */
>> +
>> +#include <common.h>
>> +#include <fdtdec.h>
>> +#include <asm/io.h>
>> +#include <asm/arch/clock_manager.h>
>> +
>> +DECLARE_GLOBAL_DATA_PTR;
>> +
>> +static u32 eosc1_hz;
>> +static u32 cb_intosc_hz;
>> +static u32 f2s_free_hz;
>> +static u32 cm_l4_main_clk_hz;
>> +static u32 cm_l4_sp_clk_hz;
>> +static u32 cm_l4_mp_clk_hz;
>> +static u32 cm_l4_sys_free_clk_hz;
>> +
>> +struct mainpll_cfg {
>> +     u32 vco0_psrc;
>> +     u32 vco1_denom;
>> +     u32 vco1_numer;
>> +     u32 mpuclk;
>> +     u32 mpuclk_cnt;
>> +     u32 mpuclk_src;
>> +     u32 nocclk;
>> +     u32 nocclk_cnt;
>> +     u32 nocclk_src;
>> +     u32 cntr2clk_cnt;
>> +     u32 cntr3clk_cnt;
>> +     u32 cntr4clk_cnt;
>> +     u32 cntr5clk_cnt;
>> +     u32 cntr6clk_cnt;
>> +     u32 cntr7clk_cnt;
>> +     u32 cntr7clk_src;
>> +     u32 cntr8clk_cnt;
>> +     u32 cntr9clk_cnt;
>> +     u32 cntr9clk_src;
>> +     u32 cntr15clk_cnt;
>> +     u32 nocdiv_l4mainclk;
>> +     u32 nocdiv_l4mpclk;
>> +     u32 nocdiv_l4spclk;
>> +     u32 nocdiv_csatclk;
>> +     u32 nocdiv_cstraceclk;
>> +     u32 nocdiv_cspdbclk;
>> +};
>> +
>> +struct perpll_cfg {
>> +     u32 vco0_psrc;
>> +     u32 vco1_denom;
>> +     u32 vco1_numer;
>> +     u32 cntr2clk_cnt;
>> +     u32 cntr2clk_src;
>> +     u32 cntr3clk_cnt;
>> +     u32 cntr3clk_src;
>> +     u32 cntr4clk_cnt;
>> +     u32 cntr4clk_src;
>> +     u32 cntr5clk_cnt;
>> +     u32 cntr5clk_src;
>> +     u32 cntr6clk_cnt;
>> +     u32 cntr6clk_src;
>> +     u32 cntr7clk_cnt;
>> +     u32 cntr8clk_cnt;
>> +     u32 cntr8clk_src;
>> +     u32 cntr9clk_cnt;
>> +     u32 emacctl_emac0sel;
>> +     u32 emacctl_emac1sel;
>> +     u32 emacctl_emac2sel;
>> +     u32 gpiodiv_gpiodbclk;
>> +};
>> +
>> +struct alteragrp_cfg {
>> +     u32 nocclk;
>> +     u32 mpuclk;
>> +};
>> +
>> +static const struct socfpga_clock_manager *clock_manager_base =
>> +     (struct socfpga_clock_manager *)SOCFPGA_CLKMGR_ADDRESS;
>> +
>> +static int of_to_struct(const void *blob, int node, int cfg_len, void *cfg)
>> +{
>> +     if (fdtdec_get_int_array(blob, node, "altr,of_reg_value",
>> +                              (u32 *)cfg, cfg_len)) {
>> +             /* could not find required property */
>> +             return -EINVAL;
>> +     }
>> +
>> +     return 0;
>> +}
>> +
>> +static int of_get_input_clks(const void *blob, int node, u32 *val)
>> +{
>> +     *val = fdtdec_get_uint(blob, node, "clock-frequency", 0);
>> +     if (!*val)
>> +             return -EINVAL;
>> +
>> +     return 0;
>> +}
>> +
>> +static int of_get_clk_cfg(const void *blob, struct mainpll_cfg *main_cfg,
>> +                       struct perpll_cfg *per_cfg,
>> +                       struct alteragrp_cfg *altrgrp_cfg)
>> +{
>> +     int node, child, len;
>> +     const char *node_name;
>> +
>> +     node = fdtdec_next_compatible(blob, 0, COMPAT_ALTERA_SOCFPGA_CLK);
>> +     if (node < 0)
>> +             return -EINVAL;
>> +
>> +     child = fdt_first_subnode(blob, node);
>> +     if (child < 0)
>> +             return -EINVAL;
>> +
>> +     child = fdt_first_subnode(blob, child);
>> +     if (child < 0)
>> +             return -EINVAL;
>> +
>> +     node_name = fdt_get_name(blob, child, &len);
>> +
>> +     while (node_name) {
>> +             if (!strcmp(node_name, "osc1")) {
>> +                     if (of_get_input_clks(blob, child, &eosc1_hz))
>> +                             return -EINVAL;
>> +             } else if (!strcmp(node_name, "cb_intosc_ls_clk")) {
>> +                     if (of_get_input_clks(blob, child, &cb_intosc_hz))
>> +                             return -EINVAL;
>> +             } else if (!strcmp(node_name, "f2s_free_clk")) {
>> +                     if (of_get_input_clks(blob, child, &f2s_free_hz))
>> +                             return -EINVAL;
>> +             } else if (!strcmp(node_name, "main_pll")) {
>> +                     if (of_to_struct(blob, child,
>> +                                      sizeof(*main_cfg)/sizeof(u32),
>> +                                      main_cfg))
>> +                             return -EINVAL;
>> +             } else if (!strcmp(node_name, "periph_pll")) {
>> +                     if (of_to_struct(blob, child,
>> +                                      sizeof(*per_cfg)/sizeof(u32),
>> +                                      per_cfg))
>> +                             return -EINVAL;
>> +             } else if (!strcmp(node_name, "altera")) {
>> +                     if (of_to_struct(blob, child,
>> +                                      sizeof(*altrgrp_cfg)/sizeof(u32),
>> +                                      altrgrp_cfg))
>> +                             return -EINVAL;
>> +
>> +                     main_cfg->mpuclk = altrgrp_cfg->mpuclk;
>> +                     main_cfg->nocclk = altrgrp_cfg->nocclk;
>> +             }
>> +             child = fdt_next_subnode(blob, child);
>> +
>> +             if (child < 0)
>> +                     break;
>> +
>> +             node_name = fdt_get_name(blob, child, &len);
>> +     }
>> +
>> +     return 0;
>> +}
>> +
>> +/* calculate the intended main VCO frequency based on handoff */
>> +static unsigned int cm_calc_handoff_main_vco_clk_hz
>> +                                     (struct mainpll_cfg *main_cfg)
>> +{
>> +     unsigned int clk_hz;
>> +
>> +     /* Check main VCO clock source: eosc, intosc or f2s? */
>> +     switch (main_cfg->vco0_psrc) {
>> +     case CLKMGR_MAINPLL_VCO0_PSRC_EOSC:
>> +             clk_hz = eosc1_hz;
>> +             break;
>> +     case CLKMGR_MAINPLL_VCO0_PSRC_E_INTOSC:
>> +             clk_hz = cb_intosc_hz;
>> +             break;
>> +     case CLKMGR_MAINPLL_VCO0_PSRC_F2S:
>> +             clk_hz = f2s_free_hz;
>> +             break;
>> +     default:
>> +             return 0;
>> +     }
>> +
>> +     /* calculate the VCO frequency */
>> +     clk_hz /= (1 + main_cfg->vco1_denom);
>> +     clk_hz *= (1 + main_cfg->vco1_numer);
>> +
>> +     return clk_hz;
>> +}
>> +
>> +/* calculate the intended periph VCO frequency based on handoff */
>> +static unsigned int cm_calc_handoff_periph_vco_clk_hz(
>> +             struct mainpll_cfg *main_cfg, struct perpll_cfg *per_cfg)
>> +{
>> +     unsigned int clk_hz;
>> +
>> +     /* Check periph VCO clock source: eosc, intosc, f2s or mainpll? */
>> +     switch (per_cfg->vco0_psrc) {
>> +     case CLKMGR_PERPLL_VCO0_PSRC_EOSC:
>> +             clk_hz = eosc1_hz;
>> +             break;
>> +     case CLKMGR_PERPLL_VCO0_PSRC_E_INTOSC:
>> +             clk_hz = cb_intosc_hz;
>> +             break;
>> +     case CLKMGR_PERPLL_VCO0_PSRC_F2S:
>> +             clk_hz = f2s_free_hz;
>> +             break;
>> +     case CLKMGR_PERPLL_VCO0_PSRC_MAIN:
>> +             clk_hz = cm_calc_handoff_main_vco_clk_hz(main_cfg);
>> +             clk_hz /= main_cfg->cntr15clk_cnt;
>> +             break;
>> +     default:
>> +             return 0;
>> +     }
>> +
>> +     /* calculate the VCO frequency */
>> +     clk_hz /= (1 + per_cfg->vco1_denom);
>> +     clk_hz *= (1 + per_cfg->vco1_numer);
>
> Extra parenthesis around statement not needed, fix globally.
Okay.
>
>> +     return clk_hz;
>> +}
>> +
>> +/* calculate the intended MPU clock frequency based on handoff */
>> +static unsigned int cm_calc_handoff_mpu_clk_hz(struct mainpll_cfg *main_cfg,
>> +                                            struct perpll_cfg *per_cfg)
>> +{
>> +     unsigned int clk_hz;
>> +
>> +     /* Check MPU clock source: main, periph, osc1, intosc or f2s? */
>> +     switch (main_cfg->mpuclk_src) {
>> +     case CLKMGR_MAINPLL_MPUCLK_SRC_MAIN:
>> +             clk_hz = cm_calc_handoff_main_vco_clk_hz(main_cfg);
>> +             clk_hz /= ((main_cfg->mpuclk & CLKMGR_MAINPLL_MPUCLK_CNT_MSK)
>> +                        + 1);
>
> DTTO
>
>> +             break;
>> +     case CLKMGR_MAINPLL_MPUCLK_SRC_PERI:
>> +             clk_hz = cm_calc_handoff_periph_vco_clk_hz(main_cfg, per_cfg);
>> +             clk_hz /= (((main_cfg->mpuclk >>
>> +                        CLKMGR_MAINPLL_MPUCLK_PERICNT_LSB) &
>> +                        CLKMGR_MAINPLL_MPUCLK_CNT_MSK) + 1);
>
> DTTO
>
>> +             break;
>> +     case CLKMGR_MAINPLL_MPUCLK_SRC_OSC1:
>> +             clk_hz = eosc1_hz;
>> +             break;
>> +     case CLKMGR_MAINPLL_MPUCLK_SRC_INTOSC:
>> +             clk_hz = cb_intosc_hz;
>> +             break;
>> +     case CLKMGR_MAINPLL_MPUCLK_SRC_FPGA:
>> +             clk_hz = f2s_free_hz;
>> +             break;
>> +     default:
>> +             return 0;
>> +     }
>> +
>> +     clk_hz /= (main_cfg->mpuclk_cnt + 1);
>> +     return clk_hz;
>> +}
>> +
>> +/* calculate the intended NOC clock frequency based on handoff */
>> +static unsigned int cm_calc_handoff_noc_clk_hz(struct mainpll_cfg *main_cfg,
>> +                                            struct perpll_cfg *per_cfg)
>> +{
>> +     unsigned int clk_hz;
>> +
>> +     /* Check MPU clock source: main, periph, osc1, intosc or f2s? */
>> +     switch (main_cfg->nocclk_src) {
>> +     case CLKMGR_MAINPLL_NOCCLK_SRC_MAIN:
>> +             clk_hz = cm_calc_handoff_main_vco_clk_hz(main_cfg);
>> +             clk_hz /= ((main_cfg->nocclk & CLKMGR_MAINPLL_NOCCLK_CNT_MSK)
>> +                        + 1);
>
> DTTO
>
>> +             break;
>> +     case CLKMGR_MAINPLL_NOCCLK_SRC_PERI:
>> +             clk_hz = cm_calc_handoff_periph_vco_clk_hz(main_cfg, per_cfg);
>> +             clk_hz /= (((main_cfg->nocclk >>
>> +                        CLKMGR_MAINPLL_NOCCLK_PERICNT_LSB) &
>> +                        CLKMGR_MAINPLL_NOCCLK_CNT_MSK) + 1);
>
> DTTO
>
>> +             break;
>> +     case CLKMGR_MAINPLL_NOCCLK_SRC_OSC1:
>> +             clk_hz = eosc1_hz;
>> +             break;
>> +     case CLKMGR_MAINPLL_NOCCLK_SRC_INTOSC:
>> +             clk_hz = cb_intosc_hz;
>> +             break;
>> +     case CLKMGR_MAINPLL_NOCCLK_SRC_FPGA:
>> +             clk_hz = f2s_free_hz;
>> +             break;
>> +     default:
>> +             return 0;
>> +     }
>> +
>> +     clk_hz /= (main_cfg->nocclk_cnt + 1);
>> +     return clk_hz;
>> +}
>> +
>> +/* return 1 if PLL ramp is required */
>> +static int cm_is_pll_ramp_required(int main0periph1,
>> +                                struct mainpll_cfg *main_cfg,
>> +                                struct perpll_cfg *per_cfg)
>> +{
>> +     /* Check for main PLL */
>> +     if (main0periph1 == 0) {
>> +             /*
>> +              * PLL ramp is not required if both MPU clock and NOC clock are
>> +              * not sourced from main PLL
>> +              */
>> +             if (main_cfg->mpuclk_src != CLKMGR_MAINPLL_MPUCLK_SRC_MAIN &&
>> +                 main_cfg->nocclk_src != CLKMGR_MAINPLL_NOCCLK_SRC_MAIN)
>> +                     return 0;
>> +
>> +             /*
>> +              * PLL ramp is required if MPU clock is sourced from main PLL
>> +              * and MPU clock is over 900MHz (as advised by HW team)
>> +              */
>> +             if (main_cfg->mpuclk_src == CLKMGR_MAINPLL_MPUCLK_SRC_MAIN &&
>> +                 (cm_calc_handoff_mpu_clk_hz(main_cfg, per_cfg) >
>> +                  CLKMGR_PLL_RAMP_MPUCLK_THRESHOLD_HZ))
>> +                     return 1;
>> +
>> +             /*
>> +              * PLL ramp is required if NOC clock is sourced from main PLL
>> +              * and NOC clock is over 300MHz (as advised by HW team)
>> +              */
>> +             if (main_cfg->nocclk_src == CLKMGR_MAINPLL_NOCCLK_SRC_MAIN &&
>> +                 (cm_calc_handoff_noc_clk_hz(main_cfg, per_cfg) >
>> +                  CLKMGR_PLL_RAMP_NOCCLK_THRESHOLD_HZ))
>> +                     return 2;
>> +
>> +     } else if (main0periph1 == 1) {
>> +             /*
>> +              * PLL ramp is not required if both MPU clock and NOC clock are
>> +              * not sourced from periph PLL
>> +              */
>> +             if (main_cfg->mpuclk_src != CLKMGR_MAINPLL_MPUCLK_SRC_PERI &&
>> +                 main_cfg->nocclk_src != CLKMGR_MAINPLL_NOCCLK_SRC_PERI)
>> +                     return 0;
>> +
>> +             /*
>> +              * PLL ramp is required if MPU clock are source from periph PLL
>> +              * and MPU clock is over 900MHz (as advised by HW team)
>> +              */
>> +             if (main_cfg->mpuclk_src == CLKMGR_MAINPLL_MPUCLK_SRC_PERI &&
>> +                 (cm_calc_handoff_mpu_clk_hz(main_cfg, per_cfg) >
>> +                  CLKMGR_PLL_RAMP_MPUCLK_THRESHOLD_HZ))
>> +                     return 1;
>> +
>> +             /*
>> +              * PLL ramp is required if NOC clock are source from periph PLL
>> +              * and NOC clock is over 300MHz (as advised by HW team)
>> +              */
>> +             if (main_cfg->nocclk_src == CLKMGR_MAINPLL_NOCCLK_SRC_PERI &&
>> +                 (cm_calc_handoff_noc_clk_hz(main_cfg, per_cfg) >
>> +                  CLKMGR_PLL_RAMP_NOCCLK_THRESHOLD_HZ))
>> +                     return 2;
>> +     }
>> +
>> +     return 0;
>> +}
>> +
>> +/*
>> + * Calculate the new PLL numerator which is based on existing DTS hand off and
>> + * intended safe frequency (safe_hz). Note that PLL ramp is only modifying the
>> + * numerator while maintaining denominator as denominator will influence the
>> + * jitter condition. Please refer A10 HPS TRM for the jitter guide. Note final
>> + * value for numerator is minus with 1 to cater our register value
>> + * representation.
>> + */
>> +static unsigned int cm_calc_safe_pll_numer(int main0periph1,
>> +                                        struct mainpll_cfg *main_cfg,
>> +                                        struct perpll_cfg *per_cfg,
>> +                                        unsigned int safe_hz)
>> +{
>> +     unsigned int clk_hz = 0;
>> +
>> +     /* Check for main PLL */
>> +     if (main0periph1 == 0) {
>> +             /* Check main VCO clock source: eosc, intosc or f2s? */
>> +             switch (main_cfg->vco0_psrc) {
>> +             case CLKMGR_MAINPLL_VCO0_PSRC_EOSC:
>> +                     clk_hz = eosc1_hz;
>> +                     break;
>> +             case CLKMGR_MAINPLL_VCO0_PSRC_E_INTOSC:
>> +                     clk_hz = cb_intosc_hz;
>> +                     break;
>> +             case CLKMGR_MAINPLL_VCO0_PSRC_F2S:
>> +                     clk_hz = f2s_free_hz;
>> +                     break;
>> +             default:
>> +                     return 0;
>> +             }
>> +
>> +             /* Applicable if MPU clock is from main PLL */
>> +             if (main_cfg->mpuclk_src == CLKMGR_MAINPLL_MPUCLK_SRC_MAIN) {
>> +                     /* calculate the safe numer value */
>> +                     clk_hz = (safe_hz / clk_hz) *
>> +                             (main_cfg->mpuclk_cnt + 1) *
>> +                             ((main_cfg->mpuclk &
>> +                               CLKMGR_MAINPLL_MPUCLK_CNT_MSK) + 1) *
>> +                             (1 + main_cfg->vco1_denom) - 1;
>
> Maybe you can factor out this awful equation into a function somehow ?
Okay, will refactor this part.
>
>> +             }
>> +             /* Reach here if MPU clk not from main PLL but NOC clk is */
>> +             else if (main_cfg->nocclk_src ==
>> +                      CLKMGR_MAINPLL_NOCCLK_SRC_MAIN) {
>> +                     /* calculate the safe numer value */
>> +                     clk_hz = (safe_hz / clk_hz) *
>> +                             (main_cfg->nocclk_cnt + 1) *
>> +                             ((main_cfg->nocclk &
>> +                               CLKMGR_MAINPLL_NOCCLK_CNT_MSK) + 1) *
>> +                             (1 + main_cfg->vco1_denom) - 1;
>> +             } else
>> +                     clk_hz = 0;
>> +
>> +     } else if (main0periph1 == 1) {
>> +             /* Check periph VCO clock source: eosc, intosc, f2s, mainpll */
>> +             switch (per_cfg->vco0_psrc) {
>> +             case CLKMGR_PERPLL_VCO0_PSRC_EOSC:
>> +                     clk_hz = eosc1_hz;
>> +                     break;
>> +             case CLKMGR_PERPLL_VCO0_PSRC_E_INTOSC:
>> +                     clk_hz = cb_intosc_hz;
>> +                     break;
>> +             case CLKMGR_PERPLL_VCO0_PSRC_F2S:
>> +                     clk_hz = f2s_free_hz;
>> +                     break;
>> +             case CLKMGR_PERPLL_VCO0_PSRC_MAIN:
>> +                     clk_hz = cm_calc_handoff_main_vco_clk_hz(
>> +                              main_cfg);
>> +                     clk_hz /= main_cfg->cntr15clk_cnt;
>> +                     break;
>> +             default:
>> +                     return 0;
>> +             }
>> +             /* Applicable if MPU clock is from periph PLL */
>> +             if (main_cfg->mpuclk_src == CLKMGR_MAINPLL_MPUCLK_SRC_PERI) {
>> +                     /* calculate the safe numer value */
>> +                     clk_hz = (safe_hz / clk_hz) *
>> +                             (main_cfg->mpuclk_cnt + 1) *
>> +                             (((main_cfg->mpuclk >>
>> +                               CLKMGR_MAINPLL_MPUCLK_PERICNT_LSB) &
>> +                               CLKMGR_MAINPLL_MPUCLK_CNT_MSK) + 1) *
>> +                             (1 + per_cfg->vco1_denom) - 1;
>> +             }
>> +             /* Reach here if MPU clk not from periph PLL but NOC clk is */
>> +             else if (main_cfg->nocclk_src ==
>> +                      CLKMGR_MAINPLL_NOCCLK_SRC_PERI) {
>> +                     /* calculate the safe numer value */
>> +                     clk_hz = (safe_hz / clk_hz) *
>> +                             (main_cfg->nocclk_cnt + 1) *
>> +                             (((main_cfg->nocclk >>
>> +                               CLKMGR_MAINPLL_NOCCLK_PERICNT_LSB) &
>> +                               CLKMGR_MAINPLL_NOCCLK_CNT_MSK) + 1) *
>> +                             (1 + per_cfg->vco1_denom) - 1;
>> +             } else
>> +                     clk_hz = 0;
>> +     }
>> +     return clk_hz;
>> +}
>
> [...]
>
>> +unsigned int cm_get_per_vco_clk_hz(void)
>> +{
>> +     u32 src_hz = 0;
>> +     u32 clk_src = 0;
>> +     u32 numer = 0;
>> +     u32 denom = 0;
>> +     u32 vco = 0;
>> +
>> +     clk_src = readl(&clock_manager_base->per_pll.vco0);
>> +
>> +     clk_src = (clk_src >> CLKMGR_PERPLL_VCO0_PSRC_LSB) &
>> +             CLKMGR_PERPLL_VCO0_PSRC_MSK;
>> +
>> +     if (clk_src == CLKMGR_PERPLL_VCO0_PSRC_EOSC) {
>> +             src_hz = eosc1_hz;
>> +     } else if (clk_src == CLKMGR_PERPLL_VCO0_PSRC_E_INTOSC) {
>> +             src_hz = cb_intosc_hz;
>> +     } else if (clk_src == CLKMGR_PERPLL_VCO0_PSRC_F2S) {
>> +             src_hz = f2s_free_hz;
>> +     } else if (clk_src == CLKMGR_PERPLL_VCO0_PSRC_MAIN) {
>> +             src_hz = cm_get_main_vco_clk_hz();
>> +             src_hz /= (readl
>> +                     (&clock_manager_base->main_pll.cntr15clk) &
>> +                     CLKMGR_MAINPLL_CNTRCLK_MSK) + 1;
>> +     } else {
>> +             printf("cm_get_per_vco_clk_hz invalid clk_src %d\n", clk_src);
>> +             return 0;
>> +     }
>> +
>> +     vco = readl(&clock_manager_base->per_pll.vco1);
>> +
>> +     numer = vco & CLKMGR_PERPLL_VCO1_NUMER_MSK;
>> +
>> +     denom = (vco >> CLKMGR_PERPLL_VCO1_DENOM_LSB) &
>> +                     CLKMGR_PERPLL_VCO1_DENOM_MSK;
>> +
>> +     vco = src_hz;
>> +     vco /= (1 + denom);
>> +     vco *= (1 + numer);
>
> Extra parenthesis, not needed ...
>
>> +     return vco;
>> +}
>> +
>> +unsigned int cm_get_main_vco_clk_hz(void)
>> +{
>> +     u32 src_hz, numer, denom, vco;
>> +
>> +     u32 clk_src = readl(&clock_manager_base->main_pll.vco0);
>> +
>> +     clk_src = (clk_src >> CLKMGR_MAINPLL_VCO0_PSRC_LSB) &
>> +             CLKMGR_MAINPLL_VCO0_PSRC_MSK;
>> +
>> +     if (clk_src == CLKMGR_MAINPLL_VCO0_PSRC_EOSC) {
>> +             src_hz = eosc1_hz;
>> +     } else if (clk_src == CLKMGR_MAINPLL_VCO0_PSRC_E_INTOSC) {
>> +             src_hz = cb_intosc_hz;
>> +     } else if (clk_src == CLKMGR_MAINPLL_VCO0_PSRC_F2S) {
>> +             src_hz = f2s_free_hz;
>> +     } else {
>> +             printf("cm_get_main_vco_clk_hz invalid clk_src %d\n", clk_src);
>> +             return 0;
>> +     }
>> +
>> +     vco = readl(&clock_manager_base->main_pll.vco1);
>> +
>> +     numer = vco & CLKMGR_MAINPLL_VCO1_NUMER_MSK;
>> +
>> +     denom = (vco >> CLKMGR_MAINPLL_VCO1_DENOM_LSB) &
>> +                     CLKMGR_MAINPLL_VCO1_DENOM_MSK;
>> +
>> +     vco = src_hz;
>> +     vco /= (1 + denom);
>> +     vco *= (1 + numer);
>
> DTTO
>
> btw this function looks just like the previous one ...
Similar but there are some differences.
>
>> +     return vco;
>> +}
>> +
>> +unsigned int cm_get_l4_sp_clk_hz(void)
>> +{
>> +     return cm_get_l4_noc_hz(CLKMGR_MAINPLL_NOCDIV_L4SPCLK_LSB);
>> +}
>> +
>> +unsigned int cm_get_mmc_controller_clk_hz(void)
>> +{
>> +     u32 clk_hz = 0;
>> +     u32 clk_input = 0;
>> +
>> +     clk_input = readl(&clock_manager_base->per_pll.cntr6clk);
>> +     clk_input = (clk_input >> CLKMGR_PERPLL_CNTR6CLK_SRC_LSB) &
>> +             CLKMGR_PERPLLGRP_SRC_MSK;
>> +
>> +     switch (clk_input) {
>> +     case CLKMGR_PERPLLGRP_SRC_MAIN:
>> +             clk_hz = cm_get_main_vco_clk_hz();
>> +             clk_hz /= 1 +
>> +                     (readl
>> +                     (&clock_manager_base->main_pll.cntr6clk) &
>> +                     CLKMGR_MAINPLL_CNTRCLK_MSK);
>> +             break;
>> +
>> +     case CLKMGR_PERPLLGRP_SRC_PERI:
>> +             clk_hz = cm_get_per_vco_clk_hz();
>> +             clk_hz /= 1 + (readl
>> +                     (&clock_manager_base->per_pll.cntr6clk) &
>> +                     CLKMGR_PERPLL_CNTRCLK_MSK);
>> +             break;
>> +
>> +     case CLKMGR_PERPLLGRP_SRC_OSC1:
>> +             clk_hz = eosc1_hz;
>> +             break;
>> +
>> +     case CLKMGR_PERPLLGRP_SRC_INTOSC:
>> +             clk_hz = cb_intosc_hz;
>> +             break;
>> +
>> +     case CLKMGR_PERPLLGRP_SRC_FPGA:
>> +             clk_hz = f2s_free_hz;
>> +             break;
>> +     }
>> +
>> +     return clk_hz / 4;
>> +}
>> +
>> +unsigned int cm_get_spi_controller_clk_hz(void)
>> +{
>> +     return cm_get_l4_noc_hz(CLKMGR_MAINPLL_NOCDIV_L4MPCLK_LSB);
>> +}
>> +
>> +unsigned int cm_get_qspi_controller_clk_hz(void)
>> +{
>> +     return  cm_get_l4_noc_hz(CLKMGR_MAINPLL_NOCDIV_L4MAINCLK_LSB);
>> +}
>> +
>> +void cm_print_clock_quick_summary(void)
>> +{
>> +     printf("MPU       %10ld kHz\n", cm_get_mpu_clk_hz() / 1000);
>> +     printf("MMC         %8d kHz\n", cm_get_mmc_controller_clk_hz() / 1000);
>> +     printf("QSPI        %8d kHz\n",
>> +            cm_get_qspi_controller_clk_hz() / 1000);
>> +     printf("SPI         %8d kHz\n", cm_get_spi_controller_clk_hz() / 1000);
>> +     printf("EOSC1       %8d kHz\n", eosc1_hz / 1000);
>> +     printf("cb_intosc   %8d kHz\n", cb_intosc_hz / 1000);
>> +     printf("f2s_free    %8d kHz\n", f2s_free_hz / 1000);
>> +     printf("Main VCO    %8d kHz\n", cm_get_main_vco_clk_hz() / 1000);
>> +     printf("NOC         %8d kHz\n", cm_get_noc_clk_hz() / 1000);
>> +     printf("L4 Main     %8d kHz\n",
>> +            cm_get_l4_noc_hz(CLKMGR_MAINPLL_NOCDIV_L4MAINCLK_LSB) / 1000);
>> +     printf("L4 MP       %8d kHz\n",
>> +            cm_get_l4_noc_hz(CLKMGR_MAINPLL_NOCDIV_L4MPCLK_LSB) / 1000);
>> +     printf("L4 SP       %8d kHz\n",
>> +            cm_get_l4_sp_clk_hz() / 1000);
>> +     printf("L4 sys free %8d kHz\n", cm_l4_sys_free_clk_hz / 1000);
>
> This should be part of the clock command ... see CV clock command.
Yes, it is part of the clock command. do_showclocks() in
clock_manager.c will call to this function.
>
>> +}
>> diff --git a/arch/arm/mach-socfpga/include/mach/clock_manager.h b/arch/arm/mach-socfpga/include/mach/clock_manager.h
>> index d0d0487..ec067ae 100644
>> --- a/arch/arm/mach-socfpga/include/mach/clock_manager.h
>> +++ b/arch/arm/mach-socfpga/include/mach/clock_manager.h
>> @@ -13,7 +13,13 @@ void cm_wait_for_fsm(void);
>>  void cm_print_clock_quick_summary(void);
>>  #endif
>>
>> +/* Common mask */
>> +#define CLKMGR_CLKMGR_STAT_BUSY_SET_MSK                      0x00000001
>
> BIT(0) ?
Okay.
>
>>  #if defined(CONFIG_TARGET_SOCFPGA_GEN5)
>>  #include <asm/arch/clock_manager_gen5.h>
>> +#elif defined(CONFIG_TARGET_SOCFPGA_ARRIA10)
>> +#include <asm/arch/clock_manager_arria10.h>
>>  #endif
>> +
>>  #endif /* _CLOCK_MANAGER_H_ */
>
> [...]
>
>> +/* mask */
>> +#define CLKMGR_MAINPLL_EN_S2FUSER0CLKEN_SET_MSK              0x00000040
>
> Looks more like a BIT() to me ...
Yes, will change this and the rest.
>
>> +#define CLKMGR_MAINPLL_EN_HMCPLLREFCLKEN_SET_MSK     0x00000080
>> +#define CLKMGR_CLKMGR_STAT_MAINPLLLOCKED_SET_MSK     0x00000100
>> +#define CLKMGR_CLKMGR_STAT_PERPLLLOCKED_SET_MSK              0x00000200
>> +#define CLKMGR_CLKMGR_STAT_BOOTCLKSRC_SET_MSK                0x00020000
>> +#define CLKMGR_MAINPLL_VCO0_BGPWRDN_SET_MSK          0x00000001
>> +#define CLKMGR_MAINPLL_VCO0_PWRDN_SET_MSK            0x00000002
>> +#define CLKMGR_MAINPLL_VCO0_EN_SET_MSK                       0x00000004
>> +#define CLKMGR_MAINPLL_VCO0_OUTRSTALL_SET_MSK                0x00000008
>> +#define CLKMGR_MAINPLL_VCO0_REGEXTSEL_SET_MSK                0x00000010
>> +#define CLKMGR_PERPLL_VCO0_BGPWRDN_SET_MSK           0x00000001
>> +#define CLKMGR_PERPLL_VCO0_PWRDN_SET_MSK             0x00000002
>> +#define CLKMGR_PERPLL_VCO0_EN_SET_MSK                        0x00000004
>> +#define CLKMGR_PERPLL_VCO0_OUTRSTALL_SET_MSK         0x00000008
>> +#define CLKMGR_PERPLL_VCO0_REGEXTSEL_SET_MSK         0x00000010
>> +#define CLKMGR_CLKMGR_INTR_PERPLLFBSLIP_SET_MSK              0x00000800
>> +#define CLKMGR_CLKMGR_INTR_MAINPLLFBSLIP_SET_MSK     0x00000400
>> +#define CLKMGR_CLKMGR_INTR_PERPLLRFSLIP_SET_MSK              0x00000200
>> +#define CLKMGR_CLKMGR_INTR_MAINPLLRFSLIP_SET_MSK     0x00000100
>> +#define CLKMGR_CLKMGR_INTR_PERPLLLOST_SET_MSK                0x00000008
>> +#define CLKMGR_CLKMGR_INTR_MAINPLLLOST_SET_MSK               0x00000004
>> +#define CLKMGR_CLKMGR_INTR_MAINPLLACHIEVED_SET_MSK   0x00000001
>> +#define CLKMGR_CLKMGR_INTR_PERPLLACHIEVED_SET_MSK    0x00000002
>> +#define CLKMGR_CLKMGR_CTL_BOOTMOD_SET_MSK            0x00000001
>> +#define CLKMGR_CLKMGR_CTL_BOOTCLK_INTOSC_SET_MSK     0x00000300
>> +#define CLKMGR_PERPLL_EN_RESET                               0x00000f7f
>> +#define CLKMGR_PERPLLGRP_EN_SDMMCCLK_MASK            0x00000020
>> +#define CLKMGR_MAINPLL_VCO0_PSRC_MSK                 0x00000003
>> +#define CLKMGR_MAINPLL_VCO1_NUMER_MSK                        0x00001fff
>> +#define CLKMGR_MAINPLL_VCO1_DENOM_MSK                        0x0000003f
>> +#define CLKMGR_MAINPLL_CNTRCLK_MSK                   0x000003ff
>> +#define CLKMGR_PERPLL_VCO0_PSRC_MSK                  0x00000003
>> +#define CLKMGR_PERPLL_VCO1_NUMER_MSK                 0x00001fff
>> +#define CLKMGR_PERPLL_VCO1_DENOM_MSK                 0x0000003f
>> +#define CLKMGR_PERPLL_CNTRCLK_MSK                    0x000003ff
>> +#define CLKMGR_MAINPLL_MPUCLK_SRC_MSK                        0x00000007
>> +#define CLKMGR_MAINPLL_MPUCLK_CNT_MSK                        0x000003ff
>> +#define CLKMGR_MAINPLL_MPUCLK_SRC_MAIN                       0
>> +#define CLKMGR_MAINPLL_MPUCLK_SRC_PERI                       1
>> +#define CLKMGR_MAINPLL_MPUCLK_SRC_OSC1                       2
>> +#define CLKMGR_MAINPLL_MPUCLK_SRC_INTOSC             3
>> +#define CLKMGR_MAINPLL_MPUCLK_SRC_FPGA                       4
>> +#define CLKMGR_MAINPLL_NOCDIV_MSK                    0x00000003
>> +#define CLKMGR_MAINPLL_NOCCLK_CNT_MSK                        0x000003ff
>> +#define CLKMGR_MAINPLL_NOCCLK_SRC_MSK                        0x00000007
>> +#define CLKMGR_MAINPLL_NOCCLK_SRC_MAIN                       0
>> +#define CLKMGR_MAINPLL_NOCCLK_SRC_PERI                       1
>> +#define CLKMGR_MAINPLL_NOCCLK_SRC_OSC1                       2
>> +#define CLKMGR_MAINPLL_NOCCLK_SRC_INTOSC             3
>> +#define CLKMGR_MAINPLL_NOCCLK_SRC_FPGA                       4
>> +
>> +#define CLKMGR_PERPLLGRP_SRC_MSK                     0x00000007
>> +#define CLKMGR_PERPLLGRP_SRC_MAIN                    0
>> +#define CLKMGR_PERPLLGRP_SRC_PERI                    1
>> +#define CLKMGR_PERPLLGRP_SRC_OSC1                    2
>> +#define CLKMGR_PERPLLGRP_SRC_INTOSC                  3
>> +#define CLKMGR_PERPLLGRP_SRC_FPGA                    4
>> +
>> +/* bit shifting macro */
>> +#define CLKMGR_MAINPLL_VCO0_PSRC_LSB         8
>> +#define CLKMGR_PERPLL_VCO0_PSRC_LSB          8
>> +#define CLKMGR_MAINPLL_VCO1_DENOM_LSB                16
>> +#define CLKMGR_PERPLL_VCO1_DENOM_LSB         16
>> +#define CLKMGR_MAINPLL_NOCCLK_PERICNT_LSB    16
>> +#define CLKMGR_MAINPLL_NOCCLK_SRC_LSB                16
>> +#define CLKMGR_MAINPLL_NOCDIV_L4MAINCLK_LSB  0
>> +#define CLKMGR_MAINPLL_NOCDIV_L4MPCLK_LSB    8
>> +#define CLKMGR_MAINPLL_NOCDIV_L4SPCLK_LSB    16
>> +#define CLKMGR_MAINPLL_NOCDIV_CSATCLK_LSB    24
>> +#define CLKMGR_MAINPLL_NOCDIV_CSTRACECLK_LSB 26
>> +#define CLKMGR_MAINPLL_NOCDIV_CSPDBGCLK_LSB  28
>> +#define CLKMGR_MAINPLL_MPUCLK_SRC_LSB                16
>> +#define CLKMGR_MAINPLL_MPUCLK_PERICNT_LSB    16
>> +#define CLKMGR_MAINPLL_NOCCLK_SRC_LSB                16
>> +#define CLKMGR_MAINPLL_CNTR7CLK_SRC_LSB              16
>> +#define CLKMGR_MAINPLL_CNTR9CLK_SRC_LSB              16
>> +#define CLKMGR_PERPLL_CNTR2CLK_SRC_LSB               16
>> +#define CLKMGR_PERPLL_CNTR3CLK_SRC_LSB               16
>> +#define CLKMGR_PERPLL_CNTR4CLK_SRC_LSB               16
>> +#define CLKMGR_PERPLL_CNTR5CLK_SRC_LSB               16
>> +#define CLKMGR_PERPLL_CNTR6CLK_SRC_LSB               16
>> +#define CLKMGR_PERPLL_CNTR8CLK_SRC_LSB               16
>> +#define CLKMGR_PERPLL_EMACCTL_EMAC0SEL_LSB   26
>> +#define CLKMGR_PERPLL_EMACCTL_EMAC1SEL_LSB   27
>> +#define CLKMGR_PERPLL_EMACCTL_EMAC2SEL_LSB   28
>> +

Regards
Ley Foon

^ permalink raw reply	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 12/20] arm: socfpga: Add pinmux for Arria 10
  2017-03-10  1:50   ` Marek Vasut
@ 2017-03-22  6:26     ` Ley Foon Tan
  0 siblings, 0 replies; 60+ messages in thread
From: Ley Foon Tan @ 2017-03-22  6:26 UTC (permalink / raw)
  To: u-boot

On Fri, Mar 10, 2017 at 9:50 AM, Marek Vasut <marex@denx.de> wrote:
> On 03/09/2017 01:26 AM, Ley Foon Tan wrote:
>> Add pinmux support for Arria 10.
>>
>> Signed-off-by: Tien Fong Chee <tien.fong.chee@intel.com>
>> Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
>> ---
>>  arch/arm/mach-socfpga/Makefile              |  1 +
>>  arch/arm/mach-socfpga/include/mach/pinmux.h | 15 +++++
>>  arch/arm/mach-socfpga/pinmux_arria10.c      | 96 +++++++++++++++++++++++++++++
>>  3 files changed, 112 insertions(+)
>>  create mode 100644 arch/arm/mach-socfpga/include/mach/pinmux.h
>>  create mode 100644 arch/arm/mach-socfpga/pinmux_arria10.c
>>
>> diff --git a/arch/arm/mach-socfpga/Makefile b/arch/arm/mach-socfpga/Makefile
>> index 9c4617f..68d55e4 100644
>> --- a/arch/arm/mach-socfpga/Makefile
>> +++ b/arch/arm/mach-socfpga/Makefile
>> @@ -12,6 +12,7 @@ obj-y       += misc.o timer.o reset_manager.o clock_manager.o \
>>
>>  obj-$(CONFIG_TARGET_SOCFPGA_ARRIA10) += clock_manager_arria10.o \
>>                                       misc_arria10.o          \
>> +                                     pinmux_arria10.o        \
>>                                       reset_manager_arria10.o
>>
>>  obj-$(CONFIG_SPL_BUILD) += spl.o freeze_controller.o
>> diff --git a/arch/arm/mach-socfpga/include/mach/pinmux.h b/arch/arm/mach-socfpga/include/mach/pinmux.h
>> new file mode 100644
>> index 0000000..c5d5dd6
>> --- /dev/null
>> +++ b/arch/arm/mach-socfpga/include/mach/pinmux.h
>> @@ -0,0 +1,15 @@
>> +/*
>> + * Copyright (C) 2016-2017 Intel Corporation <www.intel.com>
>> + *
>> + * SPDX-License-Identifier:  GPL-2.0
>> + */
>> +
>> +#ifndef      _PINMUX_H_
>> +#define      _PINMUX_H_
>
> #ifndef[SPACE]FOO
> #define[SPACE]FOO
>
> please fix globally
Okay.
>
>> +#ifndef __ASSEMBLY__
>> +int config_dedicated_pins(const void *blob);
>> +int config_pins(const void *blob, const char *pin_grp);
>> +#endif
>> +
>> +#endif /* _PINMUX_H_ */
>> diff --git a/arch/arm/mach-socfpga/pinmux_arria10.c b/arch/arm/mach-socfpga/pinmux_arria10.c
>> new file mode 100644
>> index 0000000..47339ea
>> --- /dev/null
>> +++ b/arch/arm/mach-socfpga/pinmux_arria10.c
>> @@ -0,0 +1,96 @@
>> +/*
>> + *  Copyright (C) 2016-2017 Intel Corporation <www.intel.com>
>> + *
>> + * SPDX-License-Identifier:  GPL-2.0
>> + */
>> +
>> +#include <asm/arch/pinmux.h>
>> +#include <asm/io.h>
>> +#include <common.h>
>> +#include <fdtdec.h>
>> +
>> +static int do_pinctr_pin(const void *blob, int child, const char *node_name)
>> +{
>> +     int len;
>> +     fdt_addr_t base_addr;
>> +     fdt_size_t size;
>> +     const u32 *cell;
>> +     u32 offset, value;
>> +
>> +     base_addr = fdtdec_get_addr_size(blob, child, "reg", &size);
>> +     if (base_addr != FDT_ADDR_T_NONE) {
>> +             cell = fdt_getprop(blob, child, "pinctrl-single,pins",
>> +                     &len);
>> +             if (cell != NULL && len > 0) {
>
> if (!cell)
>  continue;
> if (len <= 0)
>  continue;

Will change to something like this:
if (!cell || len <= 0)
        return -EFAULT;

[...]

Regards
Ley Foon

^ permalink raw reply	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 04/20] arm: socfpga: Restructure misc driver
  2017-03-21  8:25       ` Marek Vasut
@ 2017-03-22  8:16         ` Ley Foon Tan
  0 siblings, 0 replies; 60+ messages in thread
From: Ley Foon Tan @ 2017-03-22  8:16 UTC (permalink / raw)
  To: u-boot

On Tue, Mar 21, 2017 at 4:25 PM, Marek Vasut <marex@denx.de> wrote:
> On 03/21/2017 08:44 AM, Ley Foon Tan wrote:
>> On Fri, Mar 10, 2017 at 9:36 AM, Marek Vasut <marex@denx.de> wrote:
>>> On 03/09/2017 01:26 AM, Ley Foon Tan wrote:
>>>> Restructure misc driver in the preparation to support A10.
>>>> Move the Gen5 specific code to _gen5 file. No functional change.
>>>>
>>>> Change all uint32_t_to u32.
>>>>
>>>> Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
>>>> ---
>>>>  arch/arm/mach-socfpga/Makefile            |   3 +-
>>>>  arch/arm/mach-socfpga/include/mach/misc.h |  26 +++
>>>>  arch/arm/mach-socfpga/misc.c              | 361 ++----------------------------
>>>>  arch/arm/mach-socfpga/misc_gen5.c         | 355 +++++++++++++++++++++++++++++
>>>>  4 files changed, 398 insertions(+), 347 deletions(-)
>>>>  create mode 100644 arch/arm/mach-socfpga/include/mach/misc.h
>>>>  create mode 100644 arch/arm/mach-socfpga/misc_gen5.c
>>>>
>>>> diff --git a/arch/arm/mach-socfpga/Makefile b/arch/arm/mach-socfpga/Makefile
>>>> index 97819ac..5b09ea9 100644
>>>> --- a/arch/arm/mach-socfpga/Makefile
>>>> +++ b/arch/arm/mach-socfpga/Makefile
>>>> @@ -14,7 +14,8 @@ obj-$(CONFIG_SPL_BUILD) += spl.o freeze_controller.o
>>>>
>>>>  # QTS-generated config file wrappers
>>>>  obj-$(CONFIG_TARGET_SOCFPGA_GEN5)    += scan_manager.o wrap_pll_config.o \
>>>> -                                        clock_manager_gen5.o reset_manager_gen5.o
>>>> +                                        clock_manager_gen5.o reset_manager_gen5.o \
>>>> +                                        misc_gen5.o
>>>>  obj-$(CONFIG_SPL_BUILD) += wrap_iocsr_config.o wrap_pinmux_config.o  \
>>>>                          wrap_sdram_config.o
>>>>  CFLAGS_wrap_iocsr_config.o   += -I$(srctree)/board/$(BOARDDIR)
>>>> diff --git a/arch/arm/mach-socfpga/include/mach/misc.h b/arch/arm/mach-socfpga/include/mach/misc.h
>>>> new file mode 100644
>>>> index 0000000..64f9b86
>>>> --- /dev/null
>>>> +++ b/arch/arm/mach-socfpga/include/mach/misc.h
>>>> @@ -0,0 +1,26 @@
>>>> +/*
>>>> + * Copyright (C) 2016-2017 Intel Corporation
>>>> + *
>>>> + * SPDX-License-Identifier:    GPL-2.0
>>>> + */
>>>> +
>>>> +#ifndef _MISC_H_
>>>> +#define _MISC_H_
>>>> +
>>>> +void dwmac_deassert_reset(const unsigned int of_reset_id,
>>>> +                              const u32 phymode);
>>>> +
>>>> +struct bsel {
>>>> +     const char      *mode;
>>>> +     const char      *name;
>>>> +};
>>>> +
>>>> +extern struct bsel bsel_str[];
>>>
>>> I'm really not a big fan of extern variables, can we get rid of this?
>> For public variable, we need extern keyword here. Only function
>> prototype doesn't need the extern.
>
> Why does this have to be in public namespace anyway ?
We have same bsel_str[] array shared by both Gen5 and A10.
It used by both misc_gen5.c and misc_arria10.c.


Regards
Ley Foon

^ permalink raw reply	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 15/20] arm: socfpga: Add SPL support for Arria 10
  2017-03-10  1:52   ` Marek Vasut
@ 2017-03-22  8:28     ` Ley Foon Tan
  2017-03-22  8:41       ` Marek Vasut
  0 siblings, 1 reply; 60+ messages in thread
From: Ley Foon Tan @ 2017-03-22  8:28 UTC (permalink / raw)
  To: u-boot

On Fri, Mar 10, 2017 at 9:52 AM, Marek Vasut <marex@denx.de> wrote:
> On 03/09/2017 01:26 AM, Ley Foon Tan wrote:
>> Add SPL support for Arria 10 and add reset_uart() to use in SPL.
>>
>> Signed-off-by: Tien Fong Chee <tien.fong.chee@intel.com>
>> Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
>> ---
>>  .../include/mach/reset_manager_arria10.h           |  1 +
>>  arch/arm/mach-socfpga/reset_manager_arria10.c      | 18 +++++++
>>  arch/arm/mach-socfpga/spl.c                        | 55 +++++++++++++++++++++-
>>  3 files changed, 72 insertions(+), 2 deletions(-)
>>
>> diff --git a/arch/arm/mach-socfpga/include/mach/reset_manager_arria10.h b/arch/arm/mach-socfpga/include/mach/reset_manager_arria10.h
>> index e3171d1..d0711cf 100644
>> --- a/arch/arm/mach-socfpga/include/mach/reset_manager_arria10.h
>> +++ b/arch/arm/mach-socfpga/include/mach/reset_manager_arria10.h
>> @@ -14,6 +14,7 @@ void emac_manage_reset(ulong emacbase, uint state);
>>  int reset_deassert_bridges_handoff(void);
>>  void reset_assert_fpga_connected_peripherals(void);
>>  void reset_deassert_osc1wd0(void);
>> +void reset_uart(int assert);
>>
>>  struct socfpga_reset_manager {
>>       u32     stat;
>> diff --git a/arch/arm/mach-socfpga/reset_manager_arria10.c b/arch/arm/mach-socfpga/reset_manager_arria10.c
>> index 547a8bb..bbf54f0 100644
>> --- a/arch/arm/mach-socfpga/reset_manager_arria10.c
>> +++ b/arch/arm/mach-socfpga/reset_manager_arria10.c
>> @@ -28,6 +28,24 @@ static const struct socfpga_system_manager *sysmgr_regs =
>>       ALT_RSTMGR_PER0MODRST_QSPIECC_SET_MSK | \
>>       ALT_RSTMGR_PER0MODRST_SDMMCECC_SET_MSK)
>
> Should be part of reset manager patch ...
Do you mean by the reset_uart() below? In the last review, you comment
that uart_com_port() is in later patch (misc path) of reset manager
patch. So, I moved this function to this here. Let me know if you
prefer a new patch this reset_uart().

>
>> +void reset_uart(int assert)
>> +{
>> +     u32 mask = 0;
>> +     unsigned int com_port;
>> +
>> +     com_port = uart_com_port(gd->fdt_blob);
>> +
>> +     if (com_port == SOCFPGA_UART1_ADDRESS)
>> +             mask |= ALT_RSTMGR_PER1MODRST_UART1_SET_MSK;
>> +     else if (com_port == SOCFPGA_UART0_ADDRESS)
>> +             mask |= ALT_RSTMGR_PER1MODRST_UART0_SET_MSK;
>> +
>> +     if (assert)
>> +             setbits_le32(&reset_manager_base->per1modrst, mask);
>> +     else
>> +             clrbits_le32(&reset_manager_base->per1modrst, mask);
>> +}
>> +
>>  static const u32 per0fpgamasks[] = {
>>       ALT_RSTMGR_PER0MODRST_EMACECC0_SET_MSK |
>>       ALT_RSTMGR_PER0MODRST_EMAC0_SET_MSK,
>> diff --git a/arch/arm/mach-socfpga/spl.c b/arch/arm/mach-socfpga/spl.c
>> index fec4c7a..5c0cc98 100644
>> --- a/arch/arm/mach-socfpga/spl.c
>> +++ b/arch/arm/mach-socfpga/spl.c
>> @@ -19,23 +19,32 @@
>>  #include <asm/arch/sdram.h>
>>  #include <asm/arch/scu.h>
>>  #include <asm/arch/nic301.h>
>> +#include <asm/sections.h>
>> +#include <fdtdec.h>
>> +#include <watchdog.h>
>> +#if defined(CONFIG_TARGET_SOCFPGA_ARRIA10)
>> +#include <asm/arch/pinmux.h>
>> +#endif
>>
>>  DECLARE_GLOBAL_DATA_PTR;
>>
>> +#if defined(CONFIG_TARGET_SOCFPGA_GEN5)
>>  static struct pl310_regs *const pl310 =
>>       (struct pl310_regs *)CONFIG_SYS_PL310_BASE;
>>  static struct scu_registers *scu_regs =
>>       (struct scu_registers *)SOCFPGA_MPUSCU_ADDRESS;
>>  static struct nic301_registers *nic301_regs =
>>       (struct nic301_registers *)SOCFPGA_L3REGS_ADDRESS;
>> -static struct socfpga_system_manager *sysmgr_regs =
>> +#endif
>> +
>> +static const struct socfpga_system_manager *sysmgr_regs =
>>       (struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS;
>>
>>  u32 spl_boot_device(void)
>>  {
>>       const u32 bsel = readl(&sysmgr_regs->bootinfo);
>>
>> -     switch (bsel & 0x7) {
>> +     switch ((bsel >> SYSMGR_BOOTINFO_BSEL_SHIFT) & 0x7) {
>>       case 0x1:       /* FPGA (HPS2FPGA Bridge) */
>>               return BOOT_DEVICE_RAM;
>>       case 0x2:       /* NAND Flash (1.8V) */
>> @@ -68,6 +77,7 @@ u32 spl_boot_mode(const u32 boot_device)
>>  }
>>  #endif
>>
>> +#if defined(CONFIG_TARGET_SOCFPGA_GEN5)
>>  static void socfpga_nic301_slave_ns(void)
>>  {
>>       writel(0x1, &nic301_regs->lwhps2fpgaregs);
>> @@ -182,3 +192,44 @@ void board_init_f(ulong dummy)
>>       /* Configure simple malloc base pointer into RAM. */
>>       gd->malloc_base = CONFIG_SYS_TEXT_BASE + (1024 * 1024);
>>  }
>> +#elif defined(CONFIG_TARGET_SOCFPGA_ARRIA10)
>> +#ifdef CONFIG_SPL_BOARD_INIT
>> +void spl_board_init(void)
>> +{
>> +     /* configuring the clock based on handoff */
>> +     cm_basic_init(gd->fdt_blob);
>> +     WATCHDOG_RESET();
>> +
>> +     config_dedicated_pins(gd->fdt_blob);
>> +     WATCHDOG_RESET();
>> +
>> +     /* Release UART from reset */
>> +     reset_uart(0);
>> +
>> +     /* enable console uart printing */
>> +     preloader_console_init();
>> +}
>> +#endif
>> +
>> +void board_init_f(ulong dummy)
>> +{
>> +     /*
>> +      * Configure Clock Manager to use intosc clock instead external osc to
>> +      * ensure success watchdog operation. We do it as early as possible.
>> +      */
>> +     cm_use_intosc();
>> +
>> +     watchdog_disable();
>> +
>> +     arch_early_init_r();
>> +
>> +#ifdef CONFIG_HW_WATCHDOG
>> +     /* release osc1 watchdog timer 0 from reset */
>> +     reset_deassert_osc1wd0();
>> +
>> +     /* reconfigure and enable the watchdog */
>> +     hw_watchdog_init();
>> +     WATCHDOG_RESET();
>> +#endif /* CONFIG_HW_WATCHDOG */
>> +}
>> +#endif

Regards
Ley Foon

^ permalink raw reply	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 16/20] drivers: fpga: Add compile switch for Gen5 only registers
  2017-03-10  1:53   ` Marek Vasut
@ 2017-03-22  8:30     ` Ley Foon Tan
  0 siblings, 0 replies; 60+ messages in thread
From: Ley Foon Tan @ 2017-03-22  8:30 UTC (permalink / raw)
  To: u-boot

On Fri, Mar 10, 2017 at 9:53 AM, Marek Vasut <marex@denx.de> wrote:
> On 03/09/2017 01:26 AM, Ley Foon Tan wrote:
>> These registers only available for Gen5 device, excludes them
>
> exclude
Okay.
>
>> if for Arria 10 build.
>
> s/if for/from/
Okay.

>
>> Signed-off-by: Tien Fong Chee <tien.fong.chee@intel.com>
>> Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
>> ---
>>  drivers/fpga/socfpga.c | 6 ++++++
>>  1 file changed, 6 insertions(+)
>>
>> diff --git a/drivers/fpga/socfpga.c b/drivers/fpga/socfpga.c
>> index f1b2f2c..3751574 100644
>> --- a/drivers/fpga/socfpga.c
>> +++ b/drivers/fpga/socfpga.c
>> @@ -19,8 +19,10 @@ DECLARE_GLOBAL_DATA_PTR;
>>
>>  static struct socfpga_fpga_manager *fpgamgr_regs =
>>       (struct socfpga_fpga_manager *)SOCFPGA_FPGAMGRREGS_ADDRESS;
>> +#if defined(CONFIG_TARGET_SOCFPGA_GEN5)
>>  static struct socfpga_system_manager *sysmgr_regs =
>>       (struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS;
>> +#endif
>>
>>  /* Set CD ratio */
>>  static void fpgamgr_set_cd_ratio(unsigned long ratio)
>> @@ -268,8 +270,10 @@ int socfpga_load(Altera_desc *desc, const void *rbf_data, size_t rbf_size)
>>
>>       /* Prior programming the FPGA, all bridges need to be shut off */
>>
>> +#if defined(CONFIG_TARGET_SOCFPGA_GEN5)
>>       /* Disable all signals from hps peripheral controller to fpga */
>>       writel(0, &sysmgr_regs->fpgaintfgrp_module);
>> +#endif
>>
>>       /* Disable all signals from FPGA to HPS SDRAM */
>>  #define SDR_CTRLGRP_FPGAPORTRST_ADDRESS      0x5080
>> @@ -278,8 +282,10 @@ int socfpga_load(Altera_desc *desc, const void *rbf_data, size_t rbf_size)
>>       /* Disable all axi bridge (hps2fpga, lwhps2fpga & fpga2hps) */
>>       socfpga_bridges_reset(1);
>>
>> +#if defined(CONFIG_TARGET_SOCFPGA_GEN5)
>>       /* Unmap the bridges from NIC-301 */
>>       writel(0x1, SOCFPGA_L3REGS_ADDRESS);
>> +#endif
>>
>>       /* Initialize the FPGA Manager */
>>       status = fpgamgr_program_init();
>>
Regards
Ley Foon

^ permalink raw reply	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 18/20] arm: socfpga: Add config and defconfig for Arria 10
  2017-03-10  1:55   ` Marek Vasut
@ 2017-03-22  8:39     ` Ley Foon Tan
  0 siblings, 0 replies; 60+ messages in thread
From: Ley Foon Tan @ 2017-03-22  8:39 UTC (permalink / raw)
  To: u-boot

On Fri, Mar 10, 2017 at 9:55 AM, Marek Vasut <marex@denx.de> wrote:
> On 03/09/2017 01:26 AM, Ley Foon Tan wrote:
>> Add config and defconfig for the Arria10 and update socfpga_common.h.
>>
>> Signed-off-by: Tien Fong Chee <tien.fong.chee@intel.com>
>> Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
>> ---
>>  configs/socfpga_arria10_defconfig       | 30 +++++++++++++++
>>  include/configs/socfpga_arria10_socdk.h | 67 +++++++++++++++++++++++++++++++++
>>  include/configs/socfpga_common.h        | 28 ++++++++++++--
>>  3 files changed, 121 insertions(+), 4 deletions(-)
>>  create mode 100644 configs/socfpga_arria10_defconfig
>>  create mode 100644 include/configs/socfpga_arria10_socdk.h
>>
>> diff --git a/configs/socfpga_arria10_defconfig b/configs/socfpga_arria10_defconfig
>> new file mode 100644
>> index 0000000..9e6bc1e0
>> --- /dev/null
>> +++ b/configs/socfpga_arria10_defconfig
>> @@ -0,0 +1,30 @@
>> +CONFIG_ARM=y
>> +CONFIG_ARCH_SOCFPGA=y
>> +CONFIG_SYS_MALLOC_F_LEN=0x2000
>> +CONFIG_TARGET_SOCFPGA_ARRIA10_SOCDK=y
>> +CONFIG_IDENT_STRING="socfpga_arria10"
>> +CONFIG_DEFAULT_DEVICE_TREE="socfpga_arria10_socdk_sdmmc"
>> +CONFIG_DEFAULT_FDT_FILE="socfpga_arria10_socdk_sdmmc.dtb"
>> +CONFIG_SPL=y
>> +CONFIG_CMD_BOOTZ=y
>> +# CONFIG_CMD_IMLS is not set
>> +CONFIG_CMD_ASKENV=y
>> +CONFIG_CMD_GREPENV=y
>> +# CONFIG_CMD_FLASH is not set
>> +CONFIG_CMD_MMC=y
>> +CONFIG_CMD_GPIO=y
>> +CONFIG_CMD_PING=y
>> +CONFIG_CMD_CACHE=y
>> +CONFIG_CMD_EXT4=y
>> +CONFIG_CMD_EXT4_WRITE=y
>> +CONFIG_DOS_PARTITION=y
>> +# CONFIG_SPL_DOS_PARTITION is not set
>> +CONFIG_SPL_DM=y
>> +CONFIG_SPL_DM_SEQ_ALIAS=y
>> +CONFIG_DM_GPIO=y
>> +CONFIG_DWAPB_GPIO=y
>> +CONFIG_DM_MMC=y
>> +CONFIG_SYS_NS16550=y
>> +CONFIG_USE_TINY_PRINTF=y
>> +CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION_TYPE=y
>> +CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION_TYPE=0xa2
>> diff --git a/include/configs/socfpga_arria10_socdk.h b/include/configs/socfpga_arria10_socdk.h
>> new file mode 100644
>> index 0000000..5b7d572
>> --- /dev/null
>> +++ b/include/configs/socfpga_arria10_socdk.h
>> @@ -0,0 +1,67 @@
>> +/*
>> + *  Copyright (C) 2015-2017 Altera Corporation <www.altera.com>
>> + *
>> + * SPDX-License-Identifier:  GPL-2.0
>> + */
>> +
>> +#ifndef __CONFIG_SOCFGPA_ARRIA10_H__
>> +#define __CONFIG_SOCFGPA_ARRIA10_H__
>> +
>> +#include <asm/arch/base_addr_a10.h>
>> +/* U-Boot Commands */
>> +#define CONFIG_FAT_WRITE
>> +#define CONFIG_HW_WATCHDOG
>> +
>> +
>
> Drop this extra newline
Okay.
>
>> +/* Booting Linux */
>> +#define CONFIG_LOADADDR              0x01000000
>> +#define CONFIG_SYS_LOAD_ADDR CONFIG_LOADADDR
>> +
>> +/*
>> + * U-Boot general configurations
>> + */
>> +/* Cache options */
>> +#define CONFIG_SYS_DCACHE_OFF
>> +
>> +/* Memory configurations  */
>> +#define PHYS_SDRAM_1_SIZE            0x80000000
>> +
>> +/* Ethernet on SoC (EMAC) */
>> +#if defined(CONFIG_CMD_NET)
>> +#define CONFIG_PHY_MICREL
>> +#define CONFIG_PHY_MICREL_KSZ9031
>> +#endif
>> +
>> +/*
>> + * U-Boot environment configurations
>> + */
>> +#define CONFIG_ENV_IS_IN_MMC
>> +
>> +/*
>> + * arguments passed to the bootz command. The value of
>> + * CONFIG_BOOTARGS goes into the environment value "bootargs".
>> + * Do note the value will overide also the chosen node in FDT blob.
>> + */
>> +#define CONFIG_BOOTARGS "console=ttyS0," __stringify(CONFIG_BAUDRATE)
>> +
>> +/*
>> + * Serial / UART configurations
>> + */
>> +#define CONFIG_SYS_NS16550_MEM32
>> +#define CONFIG_SYS_BAUDRATE_TABLE {4800, 9600, 19200, 38400, 57600, 115200}
>> +
>> +/*
>> + * L4 OSC1 Timer 0
>> + */
>> +/* reload value when timer count to zero */
>> +#define TIMER_LOAD_VAL                       0xFFFFFFFF
>> +
>> +/*
>> + * Flash configurations
>> + */
>> +#define CONFIG_SYS_MAX_FLASH_BANKS     1
>> +
>> +/* The rest of the configuration is shared */
>> +#include <configs/socfpga_common.h>
>> +
>> +#endif       /* __CONFIG_SOCFGPA_ARRIA10_H__ */
>> diff --git a/include/configs/socfpga_common.h b/include/configs/socfpga_common.h
>> index bc92a2c..a228ea5 100644
>> --- a/include/configs/socfpga_common.h
>> +++ b/include/configs/socfpga_common.h
>> @@ -34,9 +34,13 @@
>>  #define CONFIG_SYS_MALLOC_LEN                (64 * 1024 * 1024)
>>  #define CONFIG_SYS_MEMTEST_START     PHYS_SDRAM_1
>>  #define CONFIG_SYS_MEMTEST_END               PHYS_SDRAM_1_SIZE
>> -
>> +#if defined(CONFIG_TARGET_SOCFPGA_GEN5)
>>  #define CONFIG_SYS_INIT_RAM_ADDR     0xFFFF0000
>>  #define CONFIG_SYS_INIT_RAM_SIZE     0x10000
>> +#elif defined(CONFIG_TARGET_SOCFPGA_ARRIA10)
>> +#define CONFIG_SYS_INIT_RAM_ADDR     0xFFE00000
>> +#define CONFIG_SYS_INIT_RAM_SIZE     0x40000 /* 256KB */
>> +#endif
>>  #define CONFIG_SYS_INIT_SP_OFFSET            \
>>       (CONFIG_SYS_INIT_RAM_SIZE - GENERATED_GBL_DATA_SIZE)
>>  #define CONFIG_SYS_INIT_SP_ADDR                      \
>> @@ -67,8 +71,10 @@
>>  #define CONFIG_SYS_HOSTNAME  CONFIG_SYS_BOARD
>>  #endif
>>
>> +#if defined(CONFIG_TARGET_SOCFPGA_GEN5)
>>  #define CONFIG_CMD_PXE
>>  #define CONFIG_MENU
>> +#endif
>>
>>  /*
>>   * Cache
>> @@ -103,13 +109,14 @@
>>  /*
>>   * FPGA Driver
>>   */
>> +#ifdef CONFIG_TARGET_SOCFPGA_GEN5
>>  #ifdef CONFIG_CMD_FPGA
>>  #define CONFIG_FPGA
>>  #define CONFIG_FPGA_ALTERA
>>  #define CONFIG_FPGA_SOCFPGA
>>  #define CONFIG_FPGA_COUNT            1
>>  #endif
>> -
>> +#endif
>>  /*
>>   * L4 OSC1 Timer 0
>>   */
>> @@ -209,11 +216,14 @@ unsigned int cm_get_qspi_controller_clk_hz(void);
>>   */
>>  #define CONFIG_SYS_NS16550_SERIAL
>>  #define CONFIG_SYS_NS16550_REG_SIZE  -4
>> -#define CONFIG_SYS_NS16550_COM1              SOCFPGA_UART0_ADDRESS
>>  #ifdef CONFIG_SOCFPGA_VIRTUAL_TARGET
>>  #define CONFIG_SYS_NS16550_CLK               1000000
>> -#else
>> +#elif defined(CONFIG_TARGET_SOCFPGA_GEN5)
>> +#define CONFIG_SYS_NS16550_COM1              SOCFPGA_UART0_ADDRESS
>>  #define CONFIG_SYS_NS16550_CLK               100000000
>> +#elif defined(CONFIG_TARGET_SOCFPGA_ARRIA10)
>> +#define CONFIG_SYS_NS16550_COM1        SOCFPGA_UART1_ADDRESS
>> +#define CONFIG_SYS_NS16550_CLK               50000000
>>  #endif
>>  #define CONFIG_CONS_INDEX            1
>>  #define CONFIG_BAUDRATE                      115200
>> @@ -301,7 +311,12 @@ unsigned int cm_get_qspi_controller_clk_hz(void);
>>   */
>>  #define CONFIG_SPL_FRAMEWORK
>>  #define CONFIG_SPL_TEXT_BASE         CONFIG_SYS_INIT_RAM_ADDR
>> +#if defined(CONFIG_TARGET_SOCFPGA_GEN5)
>>  #define CONFIG_SPL_MAX_SIZE          (64 * 1024)
>
> This should also be INIT_RAM_SIZE IMO   ^^
Yes, you are right. Will change this.
>
>> +#elif defined(CONFIG_TARGET_SOCFPGA_ARRIA10)
>> +#define CONFIG_SPL_MAX_SIZE          CONFIG_SYS_INIT_RAM_SIZE
>> +#define CONFIG_SPL_BOARD_INIT
>> +#endif
>>
>>  /* SPL SDMMC boot support */
>>  #ifdef CONFIG_SPL_MMC_SUPPORT
>> @@ -349,10 +364,15 @@ unsigned int cm_get_qspi_controller_clk_hz(void);
>>  #define BOOT_TARGET_DEVICES_MMC(func)
>>  #endif
>>
>> +#if defined(CONFIG_TARGET_SOCFPGA_GEN5)
>>  #define BOOT_TARGET_DEVICES(func) \
>>       BOOT_TARGET_DEVICES_MMC(func) \
>>       BOOT_TARGET_DEVICES_PXE(func) \
>>       func(DHCP, dhcp, na)
>> +#elif defined(CONFIG_TARGET_SOCFPGA_ARRIA10)
>> +#define BOOT_TARGET_DEVICES(func) \
>> +     BOOT_TARGET_DEVICES_MMC(func)
>> +#endif
>>
>>  #include <config_distro_bootcmd.h>
>>

Regards
Ley Foon

^ permalink raw reply	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 15/20] arm: socfpga: Add SPL support for Arria 10
  2017-03-22  8:28     ` Ley Foon Tan
@ 2017-03-22  8:41       ` Marek Vasut
  2017-03-22  9:21         ` Ley Foon Tan
  0 siblings, 1 reply; 60+ messages in thread
From: Marek Vasut @ 2017-03-22  8:41 UTC (permalink / raw)
  To: u-boot

On 03/22/2017 09:28 AM, Ley Foon Tan wrote:
> On Fri, Mar 10, 2017 at 9:52 AM, Marek Vasut <marex@denx.de> wrote:
>> On 03/09/2017 01:26 AM, Ley Foon Tan wrote:
>>> Add SPL support for Arria 10 and add reset_uart() to use in SPL.
>>>
>>> Signed-off-by: Tien Fong Chee <tien.fong.chee@intel.com>
>>> Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
>>> ---
>>>  .../include/mach/reset_manager_arria10.h           |  1 +
>>>  arch/arm/mach-socfpga/reset_manager_arria10.c      | 18 +++++++
>>>  arch/arm/mach-socfpga/spl.c                        | 55 +++++++++++++++++++++-
>>>  3 files changed, 72 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/arch/arm/mach-socfpga/include/mach/reset_manager_arria10.h b/arch/arm/mach-socfpga/include/mach/reset_manager_arria10.h
>>> index e3171d1..d0711cf 100644
>>> --- a/arch/arm/mach-socfpga/include/mach/reset_manager_arria10.h
>>> +++ b/arch/arm/mach-socfpga/include/mach/reset_manager_arria10.h
>>> @@ -14,6 +14,7 @@ void emac_manage_reset(ulong emacbase, uint state);
>>>  int reset_deassert_bridges_handoff(void);
>>>  void reset_assert_fpga_connected_peripherals(void);
>>>  void reset_deassert_osc1wd0(void);
>>> +void reset_uart(int assert);
>>>
>>>  struct socfpga_reset_manager {
>>>       u32     stat;
>>> diff --git a/arch/arm/mach-socfpga/reset_manager_arria10.c b/arch/arm/mach-socfpga/reset_manager_arria10.c
>>> index 547a8bb..bbf54f0 100644
>>> --- a/arch/arm/mach-socfpga/reset_manager_arria10.c
>>> +++ b/arch/arm/mach-socfpga/reset_manager_arria10.c
>>> @@ -28,6 +28,24 @@ static const struct socfpga_system_manager *sysmgr_regs =
>>>       ALT_RSTMGR_PER0MODRST_QSPIECC_SET_MSK | \
>>>       ALT_RSTMGR_PER0MODRST_SDMMCECC_SET_MSK)
>>
>> Should be part of reset manager patch ...
> Do you mean by the reset_uart() below? In the last review, you comment
> that uart_com_port() is in later patch (misc path) of reset manager
> patch. So, I moved this function to this here. Let me know if you
> prefer a new patch this reset_uart().

It just doesn't seem right to have reset-manager code bits in SPL patch,
that's all . Do you mean you have the uart_com_port() function
in misc.c and this reset manager bit depends on it ? Then swap patches
3 and 4 and you can wrap this function into the reset manager part, no?

>>> +void reset_uart(int assert)
>>> +{
>>> +     u32 mask = 0;
>>> +     unsigned int com_port;
>>> +
>>> +     com_port = uart_com_port(gd->fdt_blob);
>>> +
>>> +     if (com_port == SOCFPGA_UART1_ADDRESS)
>>> +             mask |= ALT_RSTMGR_PER1MODRST_UART1_SET_MSK;
>>> +     else if (com_port == SOCFPGA_UART0_ADDRESS)
>>> +             mask |= ALT_RSTMGR_PER1MODRST_UART0_SET_MSK;
>>> +
>>> +     if (assert)
>>> +             setbits_le32(&reset_manager_base->per1modrst, mask);
>>> +     else
>>> +             clrbits_le32(&reset_manager_base->per1modrst, mask);
>>> +}
>>> +

[...]

-- 
Best regards,
Marek Vasut

^ permalink raw reply	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 15/20] arm: socfpga: Add SPL support for Arria 10
  2017-03-22  8:41       ` Marek Vasut
@ 2017-03-22  9:21         ` Ley Foon Tan
  2017-03-22 14:46           ` Marek Vasut
  0 siblings, 1 reply; 60+ messages in thread
From: Ley Foon Tan @ 2017-03-22  9:21 UTC (permalink / raw)
  To: u-boot

On Wed, Mar 22, 2017 at 4:41 PM, Marek Vasut <marex@denx.de> wrote:
> On 03/22/2017 09:28 AM, Ley Foon Tan wrote:
>> On Fri, Mar 10, 2017 at 9:52 AM, Marek Vasut <marex@denx.de> wrote:
>>> On 03/09/2017 01:26 AM, Ley Foon Tan wrote:
>>>> Add SPL support for Arria 10 and add reset_uart() to use in SPL.
>>>>
>>>> Signed-off-by: Tien Fong Chee <tien.fong.chee@intel.com>
>>>> Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
>>>> ---
>>>>  .../include/mach/reset_manager_arria10.h           |  1 +
>>>>  arch/arm/mach-socfpga/reset_manager_arria10.c      | 18 +++++++
>>>>  arch/arm/mach-socfpga/spl.c                        | 55 +++++++++++++++++++++-
>>>>  3 files changed, 72 insertions(+), 2 deletions(-)
>>>>
>>>> diff --git a/arch/arm/mach-socfpga/include/mach/reset_manager_arria10.h b/arch/arm/mach-socfpga/include/mach/reset_manager_arria10.h
>>>> index e3171d1..d0711cf 100644
>>>> --- a/arch/arm/mach-socfpga/include/mach/reset_manager_arria10.h
>>>> +++ b/arch/arm/mach-socfpga/include/mach/reset_manager_arria10.h
>>>> @@ -14,6 +14,7 @@ void emac_manage_reset(ulong emacbase, uint state);
>>>>  int reset_deassert_bridges_handoff(void);
>>>>  void reset_assert_fpga_connected_peripherals(void);
>>>>  void reset_deassert_osc1wd0(void);
>>>> +void reset_uart(int assert);
>>>>
>>>>  struct socfpga_reset_manager {
>>>>       u32     stat;
>>>> diff --git a/arch/arm/mach-socfpga/reset_manager_arria10.c b/arch/arm/mach-socfpga/reset_manager_arria10.c
>>>> index 547a8bb..bbf54f0 100644
>>>> --- a/arch/arm/mach-socfpga/reset_manager_arria10.c
>>>> +++ b/arch/arm/mach-socfpga/reset_manager_arria10.c
>>>> @@ -28,6 +28,24 @@ static const struct socfpga_system_manager *sysmgr_regs =
>>>>       ALT_RSTMGR_PER0MODRST_QSPIECC_SET_MSK | \
>>>>       ALT_RSTMGR_PER0MODRST_SDMMCECC_SET_MSK)
>>>
>>> Should be part of reset manager patch ...
>> Do you mean by the reset_uart() below? In the last review, you comment
>> that uart_com_port() is in later patch (misc path) of reset manager
>> patch. So, I moved this function to this here. Let me know if you
>> prefer a new patch this reset_uart().
>
> It just doesn't seem right to have reset-manager code bits in SPL patch,
> that's all . Do you mean you have the uart_com_port() function
> in misc.c and this reset manager bit depends on it ? Then swap patches
> 3 and 4 and you can wrap this function into the reset manager part, no?

uart_com_port() is in patch 10 (misc arria10). I can't swap reset
arria 10 and misc arria 10 because misc arria 10 got dependency on
reset arria 10 patch too..:(
What I mean is add a new patch just before this SPL patch to add reset_uart().

>
>>>> +void reset_uart(int assert)
>>>> +{
>>>> +     u32 mask = 0;
>>>> +     unsigned int com_port;
>>>> +
>>>> +     com_port = uart_com_port(gd->fdt_blob);
>>>> +
>>>> +     if (com_port == SOCFPGA_UART1_ADDRESS)
>>>> +             mask |= ALT_RSTMGR_PER1MODRST_UART1_SET_MSK;
>>>> +     else if (com_port == SOCFPGA_UART0_ADDRESS)
>>>> +             mask |= ALT_RSTMGR_PER1MODRST_UART0_SET_MSK;
>>>> +
>>>> +     if (assert)
>>>> +             setbits_le32(&reset_manager_base->per1modrst, mask);
>>>> +     else
>>>> +             clrbits_le32(&reset_manager_base->per1modrst, mask);
>>>> +}
>>>> +

Regards
Ley Foon

^ permalink raw reply	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 17/20] arm: socfpga: Convert Altera ddr driver to use Kconfig
  2017-03-10  1:53   ` Marek Vasut
@ 2017-03-22  9:45     ` Ley Foon Tan
  2017-03-22 14:26       ` Marek Vasut
  0 siblings, 1 reply; 60+ messages in thread
From: Ley Foon Tan @ 2017-03-22  9:45 UTC (permalink / raw)
  To: u-boot

On Fri, Mar 10, 2017 at 9:53 AM, Marek Vasut <marex@denx.de> wrote:
> On 03/09/2017 01:26 AM, Ley Foon Tan wrote:
>> Convert Altera ddr driver to use Kconfig method. Enable ALTERA_SDRAM
>> by default if it is on Gen5 target. Arria 10 will have different driver.
>>
>> Signed-off-by: Tien Fong Chee <tien.fong.chee@intel.com>
>> Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
>> ---
>>  drivers/Kconfig                  | 2 ++
>>  drivers/ddr/Kconfig              | 1 +
>>  drivers/ddr/altera/Kconfig       | 6 ++++++
>>  include/configs/socfpga_common.h | 5 -----
>>  4 files changed, 9 insertions(+), 5 deletions(-)
>>  create mode 100644 drivers/ddr/Kconfig
>>  create mode 100644 drivers/ddr/altera/Kconfig
>>
>> diff --git a/drivers/Kconfig b/drivers/Kconfig
>> index 0e5d97d..3e6bbac 100644
>> --- a/drivers/Kconfig
>> +++ b/drivers/Kconfig
>> @@ -14,6 +14,8 @@ source "drivers/cpu/Kconfig"
>>
>>  source "drivers/crypto/Kconfig"
>>
>> +source "drivers/ddr/Kconfig"
>> +
>>  source "drivers/demo/Kconfig"
>>
>>  source "drivers/ddr/fsl/Kconfig"
>> diff --git a/drivers/ddr/Kconfig b/drivers/ddr/Kconfig
>> new file mode 100644
>> index 0000000..b764add
>> --- /dev/null
>> +++ b/drivers/ddr/Kconfig
>> @@ -0,0 +1 @@
>> +source "drivers/ddr/altera/Kconfig"
>> diff --git a/drivers/ddr/altera/Kconfig b/drivers/ddr/altera/Kconfig
>> new file mode 100644
>> index 0000000..9554da7
>> --- /dev/null
>> +++ b/drivers/ddr/altera/Kconfig
>> @@ -0,0 +1,6 @@
>> +config ALTERA_SDRAM
>> +     bool "SoCFPGA SDRAM for Arria5/Cyclone5 devices"
>
> Does this controller even support SDRAM ? :)
The existing DDR driver is for Gen5 only. We will have new DDR driver
for Arria 10 in later patchset.

>
>> +     default y if TARGET_SOCFPGA_GEN5
>> +     help
>> +       This is for building the SDRAM controller for the Arria5/Cyclone5
>> +       devices.
>> diff --git a/include/configs/socfpga_common.h b/include/configs/socfpga_common.h
>> index 55e0bf9..bc92a2c 100644
>> --- a/include/configs/socfpga_common.h
>> +++ b/include/configs/socfpga_common.h
>> @@ -77,11 +77,6 @@
>>  #define CONFIG_SYS_PL310_BASE                SOCFPGA_MPUL2_ADDRESS
>>
>>  /*
>> - * SDRAM controller
>> - */
>> -#define CONFIG_ALTERA_SDRAM
>> -
>> -/*
>>   * EPCS/EPCQx1 Serial Flash Controller
>>   */
>>  #ifdef CONFIG_ALTERA_SPI
>>
Regards
Ley Foon

^ permalink raw reply	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 17/20] arm: socfpga: Convert Altera ddr driver to use Kconfig
  2017-03-22  9:45     ` Ley Foon Tan
@ 2017-03-22 14:26       ` Marek Vasut
  2017-03-23  5:36         ` Ley Foon Tan
  0 siblings, 1 reply; 60+ messages in thread
From: Marek Vasut @ 2017-03-22 14:26 UTC (permalink / raw)
  To: u-boot

On 03/22/2017 10:45 AM, Ley Foon Tan wrote:
> On Fri, Mar 10, 2017 at 9:53 AM, Marek Vasut <marex@denx.de> wrote:
>> On 03/09/2017 01:26 AM, Ley Foon Tan wrote:
>>> Convert Altera ddr driver to use Kconfig method. Enable ALTERA_SDRAM
>>> by default if it is on Gen5 target. Arria 10 will have different driver.
>>>
>>> Signed-off-by: Tien Fong Chee <tien.fong.chee@intel.com>
>>> Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
>>> ---
>>>  drivers/Kconfig                  | 2 ++
>>>  drivers/ddr/Kconfig              | 1 +
>>>  drivers/ddr/altera/Kconfig       | 6 ++++++
>>>  include/configs/socfpga_common.h | 5 -----
>>>  4 files changed, 9 insertions(+), 5 deletions(-)
>>>  create mode 100644 drivers/ddr/Kconfig
>>>  create mode 100644 drivers/ddr/altera/Kconfig
>>>
>>> diff --git a/drivers/Kconfig b/drivers/Kconfig
>>> index 0e5d97d..3e6bbac 100644
>>> --- a/drivers/Kconfig
>>> +++ b/drivers/Kconfig
>>> @@ -14,6 +14,8 @@ source "drivers/cpu/Kconfig"
>>>
>>>  source "drivers/crypto/Kconfig"
>>>
>>> +source "drivers/ddr/Kconfig"
>>> +
>>>  source "drivers/demo/Kconfig"
>>>
>>>  source "drivers/ddr/fsl/Kconfig"
>>> diff --git a/drivers/ddr/Kconfig b/drivers/ddr/Kconfig
>>> new file mode 100644
>>> index 0000000..b764add
>>> --- /dev/null
>>> +++ b/drivers/ddr/Kconfig
>>> @@ -0,0 +1 @@
>>> +source "drivers/ddr/altera/Kconfig"
>>> diff --git a/drivers/ddr/altera/Kconfig b/drivers/ddr/altera/Kconfig
>>> new file mode 100644
>>> index 0000000..9554da7
>>> --- /dev/null
>>> +++ b/drivers/ddr/altera/Kconfig
>>> @@ -0,0 +1,6 @@
>>> +config ALTERA_SDRAM
>>> +     bool "SoCFPGA SDRAM for Arria5/Cyclone5 devices"
>>
>> Does this controller even support SDRAM ? :)
> The existing DDR driver is for Gen5 only. We will have new DDR driver
> for Arria 10 in later patchset.

I was asking about the SDRAM support in Gen5 controller though :)


-- 
Best regards,
Marek Vasut

^ permalink raw reply	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 15/20] arm: socfpga: Add SPL support for Arria 10
  2017-03-22  9:21         ` Ley Foon Tan
@ 2017-03-22 14:46           ` Marek Vasut
  0 siblings, 0 replies; 60+ messages in thread
From: Marek Vasut @ 2017-03-22 14:46 UTC (permalink / raw)
  To: u-boot

On 03/22/2017 10:21 AM, Ley Foon Tan wrote:
> On Wed, Mar 22, 2017 at 4:41 PM, Marek Vasut <marex@denx.de> wrote:
>> On 03/22/2017 09:28 AM, Ley Foon Tan wrote:
>>> On Fri, Mar 10, 2017 at 9:52 AM, Marek Vasut <marex@denx.de> wrote:
>>>> On 03/09/2017 01:26 AM, Ley Foon Tan wrote:
>>>>> Add SPL support for Arria 10 and add reset_uart() to use in SPL.
>>>>>
>>>>> Signed-off-by: Tien Fong Chee <tien.fong.chee@intel.com>
>>>>> Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
>>>>> ---
>>>>>  .../include/mach/reset_manager_arria10.h           |  1 +
>>>>>  arch/arm/mach-socfpga/reset_manager_arria10.c      | 18 +++++++
>>>>>  arch/arm/mach-socfpga/spl.c                        | 55 +++++++++++++++++++++-
>>>>>  3 files changed, 72 insertions(+), 2 deletions(-)
>>>>>
>>>>> diff --git a/arch/arm/mach-socfpga/include/mach/reset_manager_arria10.h b/arch/arm/mach-socfpga/include/mach/reset_manager_arria10.h
>>>>> index e3171d1..d0711cf 100644
>>>>> --- a/arch/arm/mach-socfpga/include/mach/reset_manager_arria10.h
>>>>> +++ b/arch/arm/mach-socfpga/include/mach/reset_manager_arria10.h
>>>>> @@ -14,6 +14,7 @@ void emac_manage_reset(ulong emacbase, uint state);
>>>>>  int reset_deassert_bridges_handoff(void);
>>>>>  void reset_assert_fpga_connected_peripherals(void);
>>>>>  void reset_deassert_osc1wd0(void);
>>>>> +void reset_uart(int assert);
>>>>>
>>>>>  struct socfpga_reset_manager {
>>>>>       u32     stat;
>>>>> diff --git a/arch/arm/mach-socfpga/reset_manager_arria10.c b/arch/arm/mach-socfpga/reset_manager_arria10.c
>>>>> index 547a8bb..bbf54f0 100644
>>>>> --- a/arch/arm/mach-socfpga/reset_manager_arria10.c
>>>>> +++ b/arch/arm/mach-socfpga/reset_manager_arria10.c
>>>>> @@ -28,6 +28,24 @@ static const struct socfpga_system_manager *sysmgr_regs =
>>>>>       ALT_RSTMGR_PER0MODRST_QSPIECC_SET_MSK | \
>>>>>       ALT_RSTMGR_PER0MODRST_SDMMCECC_SET_MSK)
>>>>
>>>> Should be part of reset manager patch ...
>>> Do you mean by the reset_uart() below? In the last review, you comment
>>> that uart_com_port() is in later patch (misc path) of reset manager
>>> patch. So, I moved this function to this here. Let me know if you
>>> prefer a new patch this reset_uart().
>>
>> It just doesn't seem right to have reset-manager code bits in SPL patch,
>> that's all . Do you mean you have the uart_com_port() function
>> in misc.c and this reset manager bit depends on it ? Then swap patches
>> 3 and 4 and you can wrap this function into the reset manager part, no?
> 
> uart_com_port() is in patch 10 (misc arria10). I can't swap reset
> arria 10 and misc arria 10 because misc arria 10 got dependency on
> reset arria 10 patch too..:(
> What I mean is add a new patch just before this SPL patch to add reset_uart().
> 

Well uh, I have to admit I'm a bit lost in the series and the
discussion. Is there any chance you can make the series bisectable ?
That's what I'd like to see.

-- 
Best regards,
Marek Vasut

^ permalink raw reply	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 17/20] arm: socfpga: Convert Altera ddr driver to use Kconfig
  2017-03-22 14:26       ` Marek Vasut
@ 2017-03-23  5:36         ` Ley Foon Tan
  2017-03-23  7:39           ` Marek Vasut
  0 siblings, 1 reply; 60+ messages in thread
From: Ley Foon Tan @ 2017-03-23  5:36 UTC (permalink / raw)
  To: u-boot

On Wed, Mar 22, 2017 at 10:26 PM, Marek Vasut <marex@denx.de> wrote:
> On 03/22/2017 10:45 AM, Ley Foon Tan wrote:
>> On Fri, Mar 10, 2017 at 9:53 AM, Marek Vasut <marex@denx.de> wrote:
>>> On 03/09/2017 01:26 AM, Ley Foon Tan wrote:
>>>> Convert Altera ddr driver to use Kconfig method. Enable ALTERA_SDRAM
>>>> by default if it is on Gen5 target. Arria 10 will have different driver.
>>>>
>>>> Signed-off-by: Tien Fong Chee <tien.fong.chee@intel.com>
>>>> Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
>>>> ---
>>>>  drivers/Kconfig                  | 2 ++
>>>>  drivers/ddr/Kconfig              | 1 +
>>>>  drivers/ddr/altera/Kconfig       | 6 ++++++
>>>>  include/configs/socfpga_common.h | 5 -----
>>>>  4 files changed, 9 insertions(+), 5 deletions(-)
>>>>  create mode 100644 drivers/ddr/Kconfig
>>>>  create mode 100644 drivers/ddr/altera/Kconfig
>>>>
>>>> diff --git a/drivers/Kconfig b/drivers/Kconfig
>>>> index 0e5d97d..3e6bbac 100644
>>>> --- a/drivers/Kconfig
>>>> +++ b/drivers/Kconfig
>>>> @@ -14,6 +14,8 @@ source "drivers/cpu/Kconfig"
>>>>
>>>>  source "drivers/crypto/Kconfig"
>>>>
>>>> +source "drivers/ddr/Kconfig"
>>>> +
>>>>  source "drivers/demo/Kconfig"
>>>>
>>>>  source "drivers/ddr/fsl/Kconfig"
>>>> diff --git a/drivers/ddr/Kconfig b/drivers/ddr/Kconfig
>>>> new file mode 100644
>>>> index 0000000..b764add
>>>> --- /dev/null
>>>> +++ b/drivers/ddr/Kconfig
>>>> @@ -0,0 +1 @@
>>>> +source "drivers/ddr/altera/Kconfig"
>>>> diff --git a/drivers/ddr/altera/Kconfig b/drivers/ddr/altera/Kconfig
>>>> new file mode 100644
>>>> index 0000000..9554da7
>>>> --- /dev/null
>>>> +++ b/drivers/ddr/altera/Kconfig
>>>> @@ -0,0 +1,6 @@
>>>> +config ALTERA_SDRAM
>>>> +     bool "SoCFPGA SDRAM for Arria5/Cyclone5 devices"
>>>
>>> Does this controller even support SDRAM ? :)
>> The existing DDR driver is for Gen5 only. We will have new DDR driver
>> for Arria 10 in later patchset.
>
> I was asking about the SDRAM support in Gen5 controller though :)
Yes, it support for double data rate 2 (DDR2), DDR3, and low-power
DDR2 (LPDDR2) SDRAM.

Regards
Ley Foon

^ permalink raw reply	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 07/20] arm: socfpga: Add reset driver support for Arria 10
  2017-03-10  1:40   ` Marek Vasut
@ 2017-03-23  5:55     ` Ley Foon Tan
  0 siblings, 0 replies; 60+ messages in thread
From: Ley Foon Tan @ 2017-03-23  5:55 UTC (permalink / raw)
  To: u-boot

On Fri, Mar 10, 2017 at 9:40 AM, Marek Vasut <marex@denx.de> wrote:
> On 03/09/2017 01:26 AM, Ley Foon Tan wrote:
>> Add reset driver support for Arria 10.
>>
>> Signed-off-by: Tien Fong Chee <tien.fong.chee@intel.com>
>> Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
>> ---
>>  arch/arm/mach-socfpga/Makefile                     |   2 +
>>  arch/arm/mach-socfpga/include/mach/reset_manager.h |   2 +
>>  .../include/mach/reset_manager_arria10.h           | 143 ++++++++
>>  arch/arm/mach-socfpga/reset_manager_arria10.c      | 362 +++++++++++++++++++++
>>  include/dt-bindings/reset/altr,rst-mgr-a10.h       | 103 ++++++
>>  5 files changed, 612 insertions(+)
>>  create mode 100644 arch/arm/mach-socfpga/include/mach/reset_manager_arria10.h
>>  create mode 100644 arch/arm/mach-socfpga/reset_manager_arria10.c
>>  create mode 100644 include/dt-bindings/reset/altr,rst-mgr-a10.h
>>
>> diff --git a/arch/arm/mach-socfpga/Makefile b/arch/arm/mach-socfpga/Makefile
>> index e83da2e..d81f003 100644
>> --- a/arch/arm/mach-socfpga/Makefile
>> +++ b/arch/arm/mach-socfpga/Makefile
>> @@ -10,6 +10,8 @@
>>  obj-y        += misc.o timer.o reset_manager.o clock_manager.o \
>>          fpga_manager.o board.o
>>
>> +obj-$(CONFIG_TARGET_SOCFPGA_ARRIA10) += reset_manager_arria10.o
>> +
>>  obj-$(CONFIG_SPL_BUILD) += spl.o freeze_controller.o
>>
>>  # QTS-generated config file wrappers
>> diff --git a/arch/arm/mach-socfpga/include/mach/reset_manager.h b/arch/arm/mach-socfpga/include/mach/reset_manager.h
>> index 9e253bf..57dc034 100644
>> --- a/arch/arm/mach-socfpga/include/mach/reset_manager.h
>> +++ b/arch/arm/mach-socfpga/include/mach/reset_manager.h
>> @@ -45,6 +45,8 @@ void socfpga_per_reset_all(void);
>>
>>  #if defined(CONFIG_TARGET_SOCFPGA_GEN5)
>>  #include <asm/arch/reset_manager_gen5.h>
>> +#elif defined(CONFIG_TARGET_SOCFPGA_ARRIA10)
>> +#include <asm/arch/reset_manager_arria10.h>
>>  #endif
>>
>>  #endif /* _RESET_MANAGER_H_ */
>> diff --git a/arch/arm/mach-socfpga/include/mach/reset_manager_arria10.h b/arch/arm/mach-socfpga/include/mach/reset_manager_arria10.h
>> new file mode 100644
>> index 0000000..e3171d1
>> --- /dev/null
>> +++ b/arch/arm/mach-socfpga/include/mach/reset_manager_arria10.h
>> @@ -0,0 +1,143 @@
>> +/*
>> + * Copyright (C) 2016-2017 Intel Corporation
>> + *
>> + * SPDX-License-Identifier:  GPL-2.0
>> + */
>> +
>> +#ifndef _RESET_MANAGER_ARRIA10_H_
>> +#define _RESET_MANAGER_ARRIA10_H_
>> +
>> +void watchdog_disable(void);
>> +void reset_deassert_noc_ddr_scheduler(void);
>> +int is_wdt_in_reset(void);
>> +void emac_manage_reset(ulong emacbase, uint state);
>> +int reset_deassert_bridges_handoff(void);
>> +void reset_assert_fpga_connected_peripherals(void);
>> +void reset_deassert_osc1wd0(void);
>
> Nit, it'd be nice to prefix all exported functions with socfpga_ , so
> it's obvious where they come from if you debug u-boot .
Okay.
>
>> +struct socfpga_reset_manager {
>> +     u32     stat;
>> +     u32     ramstat;
>> +     u32     miscstat;
>> +     u32     ctrl;
>> +     u32     hdsken;
>> +     u32     hdskreq;
>> +     u32     hdskack;
>> +     u32     counts;
>> +     u32     mpumodrst;
>> +     u32     per0modrst;
>> +     u32     per1modrst;
>> +     u32     brgmodrst;
>> +     u32     sysmodrst;
>> +     u32     coldmodrst;
>> +     u32     nrstmodrst;
>> +     u32     dbgmodrst;
>> +     u32     mpuwarmmask;
>> +     u32     per0warmmask;
>> +     u32     per1warmmask;
>> +     u32     brgwarmmask;
>> +     u32     syswarmmask;
>> +     u32     nrstwarmmask;
>> +     u32     l3warmmask;
>> +     u32     tststa;
>> +     u32     tstscratch;
>> +     u32     hdsktimeout;
>> +     u32     hmcintr;
>> +     u32     hmcintren;
>> +     u32     hmcintrens;
>> +     u32     hmcintrenr;
>> +     u32     hmcgpout;
>> +     u32     hmcgpin;
>> +};
>> +
>> +/*
>> + * SocFPGA Arria10 reset IDs, bank mapping is as follows:
>> + * 0 ... mpumodrst
>> + * 1 ... per0modrst
>> + * 2 ... per1modrst
>> + * 3 ... brgmodrst
>> + * 4 ... sysmodrst
>> + */
>> +#define RSTMGR_EMAC0         RSTMGR_DEFINE(1, 0)
>> +#define RSTMGR_EMAC1         RSTMGR_DEFINE(1, 1)
>> +#define RSTMGR_EMAC2         RSTMGR_DEFINE(1, 2)
>> +#define RSTMGR_NAND          RSTMGR_DEFINE(1, 5)
>> +#define RSTMGR_QSPI          RSTMGR_DEFINE(1, 6)
>> +#define RSTMGR_SDMMC         RSTMGR_DEFINE(1, 7)
>> +#define RSTMGR_DMA           RSTMGR_DEFINE(1, 16)
>> +#define RSTMGR_SPIM0         RSTMGR_DEFINE(1, 17)
>> +#define RSTMGR_SPIM1         RSTMGR_DEFINE(1, 18)
>> +#define RSTMGR_L4WD0         RSTMGR_DEFINE(2, 0)
>> +#define RSTMGR_L4WD1         RSTMGR_DEFINE(2, 1)
>> +#define RSTMGR_L4SYSTIMER0   RSTMGR_DEFINE(2, 2)
>> +#define RSTMGR_L4SYSTIMER1   RSTMGR_DEFINE(2, 3)
>> +#define RSTMGR_SPTIMER0              RSTMGR_DEFINE(2, 4)
>> +#define RSTMGR_SPTIMER1              RSTMGR_DEFINE(2, 5)
>> +#define RSTMGR_UART0         RSTMGR_DEFINE(2, 16)
>> +#define RSTMGR_UART1         RSTMGR_DEFINE(2, 17)
>> +#define RSTMGR_DDRSCH                RSTMGR_DEFINE(3, 6)
>> +
>> +#define ALT_RSTMGR_CTL_SWWARMRSTREQ_SET_MSK  BIT(1)
>> +#define ALT_RSTMGR_PER0MODRST_EMAC0_SET_MSK  BIT(0)
>> +#define ALT_RSTMGR_PER0MODRST_EMAC1_SET_MSK  BIT(1)
>> +#define ALT_RSTMGR_PER0MODRST_EMAC2_SET_MSK  BIT(2)
>> +#define ALT_RSTMGR_PER0MODRST_USB0_SET_MSK   BIT(3)
>> +#define ALT_RSTMGR_PER0MODRST_USB1_SET_MSK   BIT(4)
>> +#define ALT_RSTMGR_PER0MODRST_NAND_SET_MSK   BIT(5)
>> +#define ALT_RSTMGR_PER0MODRST_QSPI_SET_MSK   BIT(6)
>> +#define ALT_RSTMGR_PER0MODRST_SDMMC_SET_MSK  BIT(7)
>> +#define ALT_RSTMGR_PER0MODRST_EMACECC0_SET_MSK       BIT(8)
>> +#define ALT_RSTMGR_PER0MODRST_EMACECC1_SET_MSK       BIT(9)
>> +#define ALT_RSTMGR_PER0MODRST_EMACECC2_SET_MSK       BIT(10)
>> +#define ALT_RSTMGR_PER0MODRST_USBECC0_SET_MSK        BIT(11)
>> +#define ALT_RSTMGR_PER0MODRST_USBECC1_SET_MSK        BIT(12)
>> +#define ALT_RSTMGR_PER0MODRST_NANDECC_SET_MSK        BIT(13)
>> +#define ALT_RSTMGR_PER0MODRST_QSPIECC_SET_MSK        BIT(14)
>> +#define ALT_RSTMGR_PER0MODRST_SDMMCECC_SET_MSK       BIT(15)
>> +#define ALT_RSTMGR_PER0MODRST_DMA_SET_MSK    BIT(16)
>> +#define ALT_RSTMGR_PER0MODRST_SPIM0_SET_MSK  BIT(17)
>> +#define ALT_RSTMGR_PER0MODRST_SPIM1_SET_MSK  BIT(18)
>> +#define ALT_RSTMGR_PER0MODRST_SPIS0_SET_MSK  BIT(19)
>> +#define ALT_RSTMGR_PER0MODRST_SPIS1_SET_MSK  BIT(20)
>> +#define ALT_RSTMGR_PER0MODRST_DMAECC_SET_MSK BIT(21)
>> +#define ALT_RSTMGR_PER0MODRST_EMACPTP_SET_MSK        BIT(22)
>> +#define ALT_RSTMGR_PER0MODRST_DMAIF0_SET_MSK BIT(24)
>> +#define ALT_RSTMGR_PER0MODRST_DMAIF1_SET_MSK BIT(25)
>> +#define ALT_RSTMGR_PER0MODRST_DMAIF2_SET_MSK BIT(26)
>> +#define ALT_RSTMGR_PER0MODRST_DMAIF3_SET_MSK BIT(27)
>> +#define ALT_RSTMGR_PER0MODRST_DMAIF4_SET_MSK BIT(28)
>> +#define ALT_RSTMGR_PER0MODRST_DMAIF5_SET_MSK BIT(29)
>> +#define ALT_RSTMGR_PER0MODRST_DMAIF6_SET_MSK BIT(30)
>> +#define ALT_RSTMGR_PER0MODRST_DMAIF7_SET_MSK BIT(31)
>> +
>> +#define ALT_RSTMGR_PER1MODRST_WD0_SET_MSK    BIT(0)
>> +#define ALT_RSTMGR_PER1MODRST_WD1_SET_MSK    BIT(1)
>> +#define ALT_RSTMGR_PER1MODRST_L4SYSTMR0_SET_MSK      BIT(2)
>> +#define ALT_RSTMGR_PER1MODRST_L4SYSTMR1_SET_MSK      BIT(3)
>> +#define ALT_RSTMGR_PER1MODRST_SPTMR0_SET_MSK BIT(4)
>> +#define ALT_RSTMGR_PER1MODRST_SPTMR1_SET_MSK BIT(5)
>> +#define ALT_RSTMGR_PER1MODRST_I2C0_SET_MSK   BIT(8)
>> +#define ALT_RSTMGR_PER1MODRST_I2C1_SET_MSK   BIT(9)
>> +#define ALT_RSTMGR_PER1MODRST_I2C2_SET_MSK   BIT(10)
>> +#define ALT_RSTMGR_PER1MODRST_I2C3_SET_MSK   BIT(11)
>> +#define ALT_RSTMGR_PER1MODRST_I2C4_SET_MSK   BIT(12)
>> +#define ALT_RSTMGR_PER1MODRST_UART0_SET_MSK  BIT(16)
>> +#define ALT_RSTMGR_PER1MODRST_UART1_SET_MSK  BIT(17)
>> +#define ALT_RSTMGR_PER1MODRST_GPIO0_SET_MSK  BIT(24)
>> +#define ALT_RSTMGR_PER1MODRST_GPIO1_SET_MSK  BIT(25)
>> +#define ALT_RSTMGR_PER1MODRST_GPIO2_SET_MSK  BIT(26)
>> +
>> +#define ALT_RSTMGR_BRGMODRST_H2F_SET_MSK     BIT(0)
>> +#define ALT_RSTMGR_BRGMODRST_LWH2F_SET_MSK   BIT(1)
>> +#define ALT_RSTMGR_BRGMODRST_F2H_SET_MSK     BIT(2)
>> +#define ALT_RSTMGR_BRGMODRST_F2SSDRAM0_SET_MSK       BIT(3)
>> +#define ALT_RSTMGR_BRGMODRST_F2SSDRAM1_SET_MSK       BIT(4)
>> +#define ALT_RSTMGR_BRGMODRST_F2SSDRAM2_SET_MSK       BIT(5)
>> +#define ALT_RSTMGR_BRGMODRST_DDRSCH_SET_MSK  BIT(6)
>> +
>> +#define ALT_RSTMGR_HDSKEN_SDRSELFREFEN_SET_MSK       BIT(0)
>> +#define ALT_RSTMGR_HDSKEN_FPGAMGRHSEN_SET_MSK        BIT(1)
>> +#define ALT_RSTMGR_HDSKEN_FPGAHSEN_SET_MSK   BIT(2)
>> +#define ALT_RSTMGR_HDSKEN_ETRSTALLEN_SET_MSK BIT(3)
>> +
>> +#endif /* _RESET_MANAGER_ARRIA10_H_ */
>> diff --git a/arch/arm/mach-socfpga/reset_manager_arria10.c b/arch/arm/mach-socfpga/reset_manager_arria10.c
>> new file mode 100644
>> index 0000000..547a8bb
>> --- /dev/null
>> +++ b/arch/arm/mach-socfpga/reset_manager_arria10.c
>> @@ -0,0 +1,362 @@
>> +/*
>> + * Copyright (C) 2016-2017 Intel Corporation
>> + *
>> + * SPDX-License-Identifier:    GPL-2.0
>> + */
>> +
>> +#include <asm/io.h>
>> +#include <asm/arch/fpga_manager.h>
>> +#include <asm/arch/misc.h>
>> +#include <asm/arch/reset_manager.h>
>> +#include <asm/arch/system_manager.h>
>> +#include <common.h>
>> +#include <errno.h>
>> +#include <fdtdec.h>
>> +#include <wait_bit.h>
>> +
>> +DECLARE_GLOBAL_DATA_PTR;
>> +
>> +static const struct socfpga_reset_manager *reset_manager_base =
>> +             (void *)SOCFPGA_RSTMGR_ADDRESS;
>> +static const struct socfpga_system_manager *sysmgr_regs =
>> +             (struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS;
>> +
>> +#define ECC_MASK (ALT_RSTMGR_PER0MODRST_EMACECC0_SET_MSK | \
>> +     ALT_RSTMGR_PER0MODRST_EMACECC1_SET_MSK | \
>> +     ALT_RSTMGR_PER0MODRST_EMACECC2_SET_MSK | \
>> +     ALT_RSTMGR_PER0MODRST_NANDECC_SET_MSK | \
>> +     ALT_RSTMGR_PER0MODRST_QSPIECC_SET_MSK | \
>> +     ALT_RSTMGR_PER0MODRST_SDMMCECC_SET_MSK)
>> +
>> +static const u32 per0fpgamasks[] = {
>> +     ALT_RSTMGR_PER0MODRST_EMACECC0_SET_MSK |
>> +     ALT_RSTMGR_PER0MODRST_EMAC0_SET_MSK,
>> +     ALT_RSTMGR_PER0MODRST_EMACECC1_SET_MSK |
>> +     ALT_RSTMGR_PER0MODRST_EMAC1_SET_MSK,
>> +     ALT_RSTMGR_PER0MODRST_EMACECC2_SET_MSK |
>> +     ALT_RSTMGR_PER0MODRST_EMAC2_SET_MSK,
>> +     0, /* i2c0 per1mod */
>> +     0, /* i2c1 per1mod */
>> +     0, /* i2c0_emac */
>> +     0, /* i2c1_emac */
>> +     0, /* i2c2_emac */
>> +     ALT_RSTMGR_PER0MODRST_NANDECC_SET_MSK |
>> +     ALT_RSTMGR_PER0MODRST_NAND_SET_MSK,
>> +     ALT_RSTMGR_PER0MODRST_QSPIECC_SET_MSK |
>> +     ALT_RSTMGR_PER0MODRST_QSPI_SET_MSK,
>> +     ALT_RSTMGR_PER0MODRST_SDMMCECC_SET_MSK |
>> +     ALT_RSTMGR_PER0MODRST_SDMMC_SET_MSK,
>> +     ALT_RSTMGR_PER0MODRST_SPIM0_SET_MSK,
>> +     ALT_RSTMGR_PER0MODRST_SPIM1_SET_MSK,
>> +     ALT_RSTMGR_PER0MODRST_SPIS0_SET_MSK,
>> +     ALT_RSTMGR_PER0MODRST_SPIS1_SET_MSK,
>> +     0, /* uart0 per1mod */
>> +     0, /* uart1 per1mod */
>> +};
>> +
>> +static const u32 per1fpgamasks[] = {
>> +     0, /* emac0 per0mod */
>> +     0, /* emac1 per0mod */
>> +     0, /* emac2 per0mod */
>> +     ALT_RSTMGR_PER1MODRST_I2C0_SET_MSK,
>> +     ALT_RSTMGR_PER1MODRST_I2C1_SET_MSK,
>> +     ALT_RSTMGR_PER1MODRST_I2C2_SET_MSK, /* i2c0_emac */
>> +     ALT_RSTMGR_PER1MODRST_I2C3_SET_MSK, /* i2c1_emac */
>> +     ALT_RSTMGR_PER1MODRST_I2C4_SET_MSK, /* i2c2_emac */
>> +     0, /* nand per0mod */
>> +     0, /* qspi per0mod */
>> +     0, /* sdmmc per0mod */
>> +     0, /* spim0 per0mod */
>> +     0, /* spim1 per0mod */
>> +     0, /* spis0 per0mod */
>> +     0, /* spis1 per0mod */
>> +     ALT_RSTMGR_PER1MODRST_UART0_SET_MSK,
>> +     ALT_RSTMGR_PER1MODRST_UART1_SET_MSK,
>> +};
>> +
>> +struct bridge_cfg {
>> +     int compat_id;
>> +     u32  mask_noc;
>> +     u32  mask_rstmgr;
>> +};
>> +
>> +static const struct bridge_cfg bridge_cfg_tbl[] = {
>> +     {
>> +             COMPAT_ALTERA_SOCFPGA_H2F_BRG,
>> +             ALT_SYSMGR_NOC_H2F_SET_MSK,
>> +             ALT_RSTMGR_BRGMODRST_H2F_SET_MSK,
>> +     },
>> +     {
>> +             COMPAT_ALTERA_SOCFPGA_LWH2F_BRG,
>> +             ALT_SYSMGR_NOC_LWH2F_SET_MSK,
>> +             ALT_RSTMGR_BRGMODRST_LWH2F_SET_MSK,
>> +     },
>> +     {
>> +             COMPAT_ALTERA_SOCFPGA_F2H_BRG,
>> +             ALT_SYSMGR_NOC_F2H_SET_MSK,
>> +             ALT_RSTMGR_BRGMODRST_F2H_SET_MSK,
>> +     },
>> +     {
>> +             COMPAT_ALTERA_SOCFPGA_F2SDR0,
>> +             ALT_SYSMGR_NOC_F2SDR0_SET_MSK,
>> +             ALT_RSTMGR_BRGMODRST_F2SSDRAM0_SET_MSK,
>> +     },
>> +     {
>> +             COMPAT_ALTERA_SOCFPGA_F2SDR1,
>> +             ALT_SYSMGR_NOC_F2SDR1_SET_MSK,
>> +             ALT_RSTMGR_BRGMODRST_F2SSDRAM1_SET_MSK,
>> +     },
>> +     {
>> +             COMPAT_ALTERA_SOCFPGA_F2SDR2,
>> +             ALT_SYSMGR_NOC_F2SDR2_SET_MSK,
>> +             ALT_RSTMGR_BRGMODRST_F2SSDRAM2_SET_MSK,
>> +     },
>> +};
>> +
>> +/* Disable the watchdog (toggle reset to watchdog) */
>> +void watchdog_disable(void)
>> +{
>> +     /* assert reset for watchdog */
>> +     setbits_le32(&reset_manager_base->per1modrst,
>> +                  ALT_RSTMGR_PER1MODRST_WD0_SET_MSK);
>> +}
>> +
>> +/* Release NOC ddr scheduler from reset */
>> +void reset_deassert_noc_ddr_scheduler(void)
>> +{
>> +     clrbits_le32(&reset_manager_base->brgmodrst,
>> +                  ALT_RSTMGR_BRGMODRST_DDRSCH_SET_MSK);
>> +}
>> +
>> +/* Check whether Watchdog in reset state? */
>> +int is_wdt_in_reset(void)
>> +{
>> +     u32 val;
>> +
>> +     val = readl(&reset_manager_base->per1modrst);
>> +     val &= ALT_RSTMGR_PER1MODRST_WD0_SET_MSK;
>> +
>> +     /* return 0x1 if watchdog in reset */
>> +     return val;
>> +}
>> +
>> +/* emacbase: base address of emac to enable/disable reset
>> + * state: 0 - disable reset, !0 - enable reset
>> + */
>> +void emac_manage_reset(ulong emacbase, uint state)
>> +{
>> +     ulong eccmask;
>> +     ulong emacmask;
>> +
>> +     switch (emacbase) {
>> +     case SOCFPGA_EMAC0_ADDRESS:
>> +             eccmask = ALT_RSTMGR_PER0MODRST_EMACECC0_SET_MSK;
>> +             emacmask = ALT_RSTMGR_PER0MODRST_EMAC0_SET_MSK;
>> +             break;
>> +     case SOCFPGA_EMAC1_ADDRESS:
>> +             eccmask = ALT_RSTMGR_PER0MODRST_EMACECC1_SET_MSK;
>> +             emacmask = ALT_RSTMGR_PER0MODRST_EMAC1_SET_MSK;
>> +             break;
>> +     case SOCFPGA_EMAC2_ADDRESS:
>> +             eccmask = ALT_RSTMGR_PER0MODRST_EMACECC2_SET_MSK;
>> +             emacmask = ALT_RSTMGR_PER0MODRST_EMAC2_SET_MSK;
>> +             break;
>> +     default:
>> +             error("emac base address unexpected! %lx", emacbase);
>> +             hang();
>> +             break;
>> +     }
>> +
>> +     if (state) {
>> +             /* Enable ECC OCP first */
>> +             setbits_le32(&reset_manager_base->per0modrst, eccmask);
>> +             setbits_le32(&reset_manager_base->per0modrst, emacmask);
>> +     } else {
>> +             /* Disable ECC OCP first */
>> +             clrbits_le32(&reset_manager_base->per0modrst, emacmask);
>> +             clrbits_le32(&reset_manager_base->per0modrst, eccmask);
>> +     }
>> +}
>> +
>> +static int get_bridge_init_val(const void *blob, int compat_id)
>> +{
>> +     int node;
>> +
>> +     node = fdtdec_next_compatible(blob, 0, compat_id);
>> +     if (node < 0)
>> +             return 0;
>> +
>> +     return fdtdec_get_uint(blob, node, "init-val", 0);
>> +}
>> +
>> +/* Enable bridges (hps2fpga, lwhps2fpga, fpga2hps, fpga2sdram) per handoff */
>> +int reset_deassert_bridges_handoff(void)
>> +{
>> +     u32 mask_noc = 0, mask_rstmgr = 0;
>> +     int i;
>> +
>> +     for (i = 0; i < ARRAY_SIZE(bridge_cfg_tbl); i++) {
>> +             if (get_bridge_init_val(gd->fdt_blob,
>> +                                     bridge_cfg_tbl[i].compat_id)) {
>> +                     mask_noc |= bridge_cfg_tbl[i].mask_noc;
>> +                     mask_rstmgr |= bridge_cfg_tbl[i].mask_rstmgr;
>> +             }
>> +     }
>> +
>> +     /* clear idle request to all bridges */
>> +     setbits_le32(&sysmgr_regs->noc_idlereq_clr, mask_noc);
>> +
>> +     /* Release bridges from reset state per handoff value */
>> +     clrbits_le32(&reset_manager_base->brgmodrst, mask_rstmgr);
>> +
>> +     /* Poll until all idleack to 0, timeout at 1000ms */
>> +     return wait_for_bit(__func__, &sysmgr_regs->noc_idleack, mask_noc,
>> +                         false, 1000, false);
>> +}
>> +
>> +void reset_assert_fpga_connected_peripherals(void)
>> +{
>> +     u32 mask0 = 0;
>> +     u32 mask1 = 0;
>> +     u32 fpga_pinux_addr = SOCFPGA_PINMUX_FPGA_INTERFACE_ADDRESS;
>> +     int i;
>> +
>> +     for (i = 0; i < ARRAY_SIZE(per1fpgamasks); i++) {
>> +             if (readl(fpga_pinux_addr)) {
>> +                     mask0 |= per0fpgamasks[i];
>> +                     mask1 |= per1fpgamasks[i];
>> +             }
>> +             fpga_pinux_addr += sizeof(u32);
>> +     }
>> +
>> +     setbits_le32(&reset_manager_base->per0modrst, mask0 & ECC_MASK);
>> +     setbits_le32(&reset_manager_base->per1modrst, mask1);
>> +     setbits_le32(&reset_manager_base->per0modrst, mask0);
>> +}
>> +
>> +/* Release L4 OSC1 Watchdog Timer 0 from reset through reset manager */
>> +void reset_deassert_osc1wd0(void)
>> +{
>> +     clrbits_le32(&reset_manager_base->per1modrst,
>> +                  ALT_RSTMGR_PER1MODRST_WD0_SET_MSK);
>> +}
>> +
>> +/*
>> + * Assert or de-assert SoCFPGA reset manager reset.
>> + */
>> +void socfpga_per_reset(u32 reset, int set)
>> +{
>> +     const u32 *reg;
>> +     u32 rstmgr_bank = RSTMGR_BANK(reset);
>> +
>> +     switch (rstmgr_bank) {
>> +     case 0:
>> +             reg = &reset_manager_base->mpumodrst;
>> +             break;
>> +     case 1:
>> +             reg = &reset_manager_base->per0modrst;
>> +             break;
>> +     case 2:
>> +             reg = &reset_manager_base->per1modrst;
>> +             break;
>> +     case 3:
>> +             reg = &reset_manager_base->brgmodrst;
>> +             break;
>> +     case 4:
>> +             reg = &reset_manager_base->sysmodrst;
>> +             break;
>> +
>> +     default:
>> +             return;
>> +     }
>> +
>> +     if (set)
>> +             setbits_le32(reg, 1 << RSTMGR_RESET(reset));
>> +     else
>> +             clrbits_le32(reg, 1 << RSTMGR_RESET(reset));
>> +}
>> +
>> +/*
>> + * Assert reset on every peripheral but L4WD0.
>> + * Watchdog must be kept intact to prevent glitches
>> + * and/or hangs.
>> + * For the Arria10, we disable all the peripherals except L4 watchdog0,
>> + * L4 Timer 0, and ECC.
>> + */
>> +void socfpga_per_reset_all(void)
>> +{
>> +     const u32 l4wd0 = (1 << RSTMGR_RESET(SOCFPGA_RESET(L4WD0)) |
>> +                       (1 << RSTMGR_RESET(SOCFPGA_RESET(L4SYSTIMER0))));
>> +     unsigned mask_ecc_ocp =
>> +             ALT_RSTMGR_PER0MODRST_EMACECC0_SET_MSK |
>> +             ALT_RSTMGR_PER0MODRST_EMACECC1_SET_MSK |
>> +             ALT_RSTMGR_PER0MODRST_EMACECC2_SET_MSK |
>> +             ALT_RSTMGR_PER0MODRST_USBECC0_SET_MSK |
>> +             ALT_RSTMGR_PER0MODRST_USBECC1_SET_MSK |
>> +             ALT_RSTMGR_PER0MODRST_NANDECC_SET_MSK |
>> +             ALT_RSTMGR_PER0MODRST_QSPIECC_SET_MSK |
>> +             ALT_RSTMGR_PER0MODRST_SDMMCECC_SET_MSK;
>> +
>> +     /* disable all components except ECC_OCP, L4 Timer0 and L4 WD0 */
>> +     writel(~l4wd0, &reset_manager_base->per1modrst);
>> +     setbits_le32(&reset_manager_base->per0modrst, ~mask_ecc_ocp);
>> +
>> +     /* Finally disable the ECC_OCP */
>> +     setbits_le32(&reset_manager_base->per0modrst, mask_ecc_ocp);
>> +}
>> +
>> +#if defined(CONFIG_SOCFPGA_VIRTUAL_TARGET)
>> +void socfpga_bridges_reset(int enable)
>> +{
>> +     /* For SoCFPGA-VT, this is NOP. */
>> +}
>> +#else
>> +void socfpga_bridges_reset(int enable)
>> +{
>> +     /* Disable all the bridges (hps2fpga, lwhps2fpga, fpga2hps,
>> +        fpga2sdram) */
>> +     /* set idle request to all bridges */
>> +     writel(ALT_SYSMGR_NOC_H2F_SET_MSK |
>> +             ALT_SYSMGR_NOC_LWH2F_SET_MSK |
>> +             ALT_SYSMGR_NOC_F2H_SET_MSK |
>> +             ALT_SYSMGR_NOC_F2SDR0_SET_MSK |
>> +             ALT_SYSMGR_NOC_F2SDR1_SET_MSK |
>> +             ALT_SYSMGR_NOC_F2SDR2_SET_MSK,
>> +             &sysmgr_regs->noc_idlereq_set);
>> +
>> +     /* Enable the NOC timeout */
>> +     writel(ALT_SYSMGR_NOC_TMO_EN_SET_MSK, &sysmgr_regs->noc_timeout);
>> +
>> +     /* Poll until all idleack to 1 */
>> +     wait_for_bit(__func__, &sysmgr_regs->noc_idleack,
>> +                  ALT_SYSMGR_NOC_H2F_SET_MSK |
>> +                  ALT_SYSMGR_NOC_LWH2F_SET_MSK |
>> +                  ALT_SYSMGR_NOC_F2H_SET_MSK |
>> +                  ALT_SYSMGR_NOC_F2SDR0_SET_MSK |
>> +                  ALT_SYSMGR_NOC_F2SDR1_SET_MSK |
>> +                  ALT_SYSMGR_NOC_F2SDR2_SET_MSK,
>> +                  true, 10000, false);
>
> You should check return value of all these wait_for_bit() calls,
> otherwise you might ignore errors.
Okay.
>
>> +     /* Poll until all idlestatus to 1 */
>> +     wait_for_bit(__func__, &sysmgr_regs->noc_idlestatus,
>> +                  ALT_SYSMGR_NOC_H2F_SET_MSK |
>> +                  ALT_SYSMGR_NOC_LWH2F_SET_MSK |
>> +                  ALT_SYSMGR_NOC_F2H_SET_MSK |
>> +                  ALT_SYSMGR_NOC_F2SDR0_SET_MSK |
>> +                  ALT_SYSMGR_NOC_F2SDR1_SET_MSK |
>> +                  ALT_SYSMGR_NOC_F2SDR2_SET_MSK,
>> +                  true, 10000, false);
>> +
>> +     /* Put all bridges (except NOR DDR scheduler) into reset state */
>> +     setbits_le32(&reset_manager_base->brgmodrst,
>> +                  (ALT_RSTMGR_BRGMODRST_H2F_SET_MSK |
>> +                  ALT_RSTMGR_BRGMODRST_LWH2F_SET_MSK |
>> +                  ALT_RSTMGR_BRGMODRST_F2H_SET_MSK |
>> +                  ALT_RSTMGR_BRGMODRST_F2SSDRAM0_SET_MSK |
>> +                  ALT_RSTMGR_BRGMODRST_F2SSDRAM1_SET_MSK |
>> +                  ALT_RSTMGR_BRGMODRST_F2SSDRAM2_SET_MSK));
>> +
>> +     /* Disable NOC timeout */
>> +     writel(0, &sysmgr_regs->noc_timeout);
>> +}
>> +#endif
>> diff --git a/include/dt-bindings/reset/altr,rst-mgr-a10.h b/include/dt-bindings/reset/altr,rst-mgr-a10.h
>> new file mode 100644
>> index 0000000..99875de
>> --- /dev/null
>> +++ b/include/dt-bindings/reset/altr,rst-mgr-a10.h
>> @@ -0,0 +1,103 @@
>> +/*
[..]

Regards
Ley Foon

^ permalink raw reply	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 17/20] arm: socfpga: Convert Altera ddr driver to use Kconfig
  2017-03-23  5:36         ` Ley Foon Tan
@ 2017-03-23  7:39           ` Marek Vasut
  2017-03-23  9:54             ` Ley Foon Tan
  0 siblings, 1 reply; 60+ messages in thread
From: Marek Vasut @ 2017-03-23  7:39 UTC (permalink / raw)
  To: u-boot

On 03/23/2017 06:36 AM, Ley Foon Tan wrote:
> On Wed, Mar 22, 2017 at 10:26 PM, Marek Vasut <marex@denx.de> wrote:
>> On 03/22/2017 10:45 AM, Ley Foon Tan wrote:
>>> On Fri, Mar 10, 2017 at 9:53 AM, Marek Vasut <marex@denx.de> wrote:
>>>> On 03/09/2017 01:26 AM, Ley Foon Tan wrote:
>>>>> Convert Altera ddr driver to use Kconfig method. Enable ALTERA_SDRAM
>>>>> by default if it is on Gen5 target. Arria 10 will have different driver.
>>>>>
>>>>> Signed-off-by: Tien Fong Chee <tien.fong.chee@intel.com>
>>>>> Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
>>>>> ---
>>>>>  drivers/Kconfig                  | 2 ++
>>>>>  drivers/ddr/Kconfig              | 1 +
>>>>>  drivers/ddr/altera/Kconfig       | 6 ++++++
>>>>>  include/configs/socfpga_common.h | 5 -----
>>>>>  4 files changed, 9 insertions(+), 5 deletions(-)
>>>>>  create mode 100644 drivers/ddr/Kconfig
>>>>>  create mode 100644 drivers/ddr/altera/Kconfig
>>>>>
>>>>> diff --git a/drivers/Kconfig b/drivers/Kconfig
>>>>> index 0e5d97d..3e6bbac 100644
>>>>> --- a/drivers/Kconfig
>>>>> +++ b/drivers/Kconfig
>>>>> @@ -14,6 +14,8 @@ source "drivers/cpu/Kconfig"
>>>>>
>>>>>  source "drivers/crypto/Kconfig"
>>>>>
>>>>> +source "drivers/ddr/Kconfig"
>>>>> +
>>>>>  source "drivers/demo/Kconfig"
>>>>>
>>>>>  source "drivers/ddr/fsl/Kconfig"
>>>>> diff --git a/drivers/ddr/Kconfig b/drivers/ddr/Kconfig
>>>>> new file mode 100644
>>>>> index 0000000..b764add
>>>>> --- /dev/null
>>>>> +++ b/drivers/ddr/Kconfig
>>>>> @@ -0,0 +1 @@
>>>>> +source "drivers/ddr/altera/Kconfig"
>>>>> diff --git a/drivers/ddr/altera/Kconfig b/drivers/ddr/altera/Kconfig
>>>>> new file mode 100644
>>>>> index 0000000..9554da7
>>>>> --- /dev/null
>>>>> +++ b/drivers/ddr/altera/Kconfig
>>>>> @@ -0,0 +1,6 @@
>>>>> +config ALTERA_SDRAM
>>>>> +     bool "SoCFPGA SDRAM for Arria5/Cyclone5 devices"
>>>>
>>>> Does this controller even support SDRAM ? :)
>>> The existing DDR driver is for Gen5 only. We will have new DDR driver
>>> for Arria 10 in later patchset.
>>
>> I was asking about the SDRAM support in Gen5 controller though :)
> Yes, it support for double data rate 2 (DDR2), DDR3, and low-power
> DDR2 (LPDDR2) SDRAM.

Ah, so a misnomer . I'd prefer to have something like "SoCFPGA DRAM
controller ... or SoCFPGA DDR SDRAM controller" in the Kconfig option to
make it clear.

-- 
Best regards,
Marek Vasut

^ permalink raw reply	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 17/20] arm: socfpga: Convert Altera ddr driver to use Kconfig
  2017-03-23  7:39           ` Marek Vasut
@ 2017-03-23  9:54             ` Ley Foon Tan
  0 siblings, 0 replies; 60+ messages in thread
From: Ley Foon Tan @ 2017-03-23  9:54 UTC (permalink / raw)
  To: u-boot

On Thu, Mar 23, 2017 at 3:39 PM, Marek Vasut <marex@denx.de> wrote:
> On 03/23/2017 06:36 AM, Ley Foon Tan wrote:
>> On Wed, Mar 22, 2017 at 10:26 PM, Marek Vasut <marex@denx.de> wrote:
>>> On 03/22/2017 10:45 AM, Ley Foon Tan wrote:
>>>> On Fri, Mar 10, 2017 at 9:53 AM, Marek Vasut <marex@denx.de> wrote:
>>>>> On 03/09/2017 01:26 AM, Ley Foon Tan wrote:
>>>>>> Convert Altera ddr driver to use Kconfig method. Enable ALTERA_SDRAM
>>>>>> by default if it is on Gen5 target. Arria 10 will have different driver.
>>>>>>
>>>>>> Signed-off-by: Tien Fong Chee <tien.fong.chee@intel.com>
>>>>>> Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
>>>>>> ---
>>>>>>  drivers/Kconfig                  | 2 ++
>>>>>>  drivers/ddr/Kconfig              | 1 +
>>>>>>  drivers/ddr/altera/Kconfig       | 6 ++++++
>>>>>>  include/configs/socfpga_common.h | 5 -----
>>>>>>  4 files changed, 9 insertions(+), 5 deletions(-)
>>>>>>  create mode 100644 drivers/ddr/Kconfig
>>>>>>  create mode 100644 drivers/ddr/altera/Kconfig
>>>>>>
>>>>>> diff --git a/drivers/Kconfig b/drivers/Kconfig
>>>>>> index 0e5d97d..3e6bbac 100644
>>>>>> --- a/drivers/Kconfig
>>>>>> +++ b/drivers/Kconfig
>>>>>> @@ -14,6 +14,8 @@ source "drivers/cpu/Kconfig"
>>>>>>
>>>>>>  source "drivers/crypto/Kconfig"
>>>>>>
>>>>>> +source "drivers/ddr/Kconfig"
>>>>>> +
>>>>>>  source "drivers/demo/Kconfig"
>>>>>>
>>>>>>  source "drivers/ddr/fsl/Kconfig"
>>>>>> diff --git a/drivers/ddr/Kconfig b/drivers/ddr/Kconfig
>>>>>> new file mode 100644
>>>>>> index 0000000..b764add
>>>>>> --- /dev/null
>>>>>> +++ b/drivers/ddr/Kconfig
>>>>>> @@ -0,0 +1 @@
>>>>>> +source "drivers/ddr/altera/Kconfig"
>>>>>> diff --git a/drivers/ddr/altera/Kconfig b/drivers/ddr/altera/Kconfig
>>>>>> new file mode 100644
>>>>>> index 0000000..9554da7
>>>>>> --- /dev/null
>>>>>> +++ b/drivers/ddr/altera/Kconfig
>>>>>> @@ -0,0 +1,6 @@
>>>>>> +config ALTERA_SDRAM
>>>>>> +     bool "SoCFPGA SDRAM for Arria5/Cyclone5 devices"
>>>>>
>>>>> Does this controller even support SDRAM ? :)
>>>> The existing DDR driver is for Gen5 only. We will have new DDR driver
>>>> for Arria 10 in later patchset.
>>>
>>> I was asking about the SDRAM support in Gen5 controller though :)
>> Yes, it support for double data rate 2 (DDR2), DDR3, and low-power
>> DDR2 (LPDDR2) SDRAM.
>
> Ah, so a misnomer . I'd prefer to have something like "SoCFPGA DRAM
> controller ... or SoCFPGA DDR SDRAM controller" in the Kconfig option to
> make it clear.
>
Okay, will change it to "SoCFPGA DDR SDRAM controller".

Thanks.

Regards
Ley Foon

^ permalink raw reply	[flat|nested] 60+ messages in thread

end of thread, other threads:[~2017-03-23  9:54 UTC | newest]

Thread overview: 60+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-03-09  0:26 [U-Boot] [PATCH v2 00/20] Add Intel Arria 10 SoC support Ley Foon Tan
2017-03-09  0:26 ` [U-Boot] [PATCH v2 01/20] arm: socfpga: Restructure clock manager driver Ley Foon Tan
2017-03-09 16:29   ` Dinh Nguyen
2017-03-21  7:26     ` Ley Foon Tan
2017-03-09  0:26 ` [U-Boot] [PATCH v2 02/20] arm: socfpga: Update clock for Gen5 Ley Foon Tan
2017-03-09 16:39   ` Dinh Nguyen
2017-03-09  0:26 ` [U-Boot] [PATCH v2 03/20] arm: socfpga: Restructure reset manager driver Ley Foon Tan
2017-03-09  0:26 ` [U-Boot] [PATCH v2 04/20] arm: socfpga: Restructure misc driver Ley Foon Tan
2017-03-10  1:36   ` Marek Vasut
2017-03-21  7:44     ` Ley Foon Tan
2017-03-21  8:25       ` Marek Vasut
2017-03-22  8:16         ` Ley Foon Tan
2017-03-09  0:26 ` [U-Boot] [PATCH v2 05/20] arm: socfpga: Restructure system manager Ley Foon Tan
2017-03-09  0:26 ` [U-Boot] [PATCH v2 06/20] arm: socfpga: Add A10 defines Ley Foon Tan
2017-03-10  1:38   ` Marek Vasut
2017-03-21  8:05     ` Ley Foon Tan
2017-03-09  0:26 ` [U-Boot] [PATCH v2 07/20] arm: socfpga: Add reset driver support for Arria 10 Ley Foon Tan
2017-03-10  1:40   ` Marek Vasut
2017-03-23  5:55     ` Ley Foon Tan
2017-03-09  0:26 ` [U-Boot] [PATCH v2 08/20] arm: socfpga: Add clock driver " Ley Foon Tan
2017-03-10  1:47   ` Marek Vasut
2017-03-22  6:14     ` Ley Foon Tan
2017-03-09  0:26 ` [U-Boot] [PATCH v2 09/20] arm: socfpga: Add system manager " Ley Foon Tan
2017-03-10  1:47   ` Marek Vasut
2017-03-09  0:26 ` [U-Boot] [PATCH v2 10/20] arm: socfpga: Add sdram header file " Ley Foon Tan
2017-03-09  0:26 ` [U-Boot] [PATCH v2 11/20] arm: socfpga: Add misc support " Ley Foon Tan
2017-03-10  1:49   ` Marek Vasut
2017-03-09  0:26 ` [U-Boot] [PATCH v2 12/20] arm: socfpga: Add pinmux " Ley Foon Tan
2017-03-10  1:50   ` Marek Vasut
2017-03-22  6:26     ` Ley Foon Tan
2017-03-09  0:26 ` [U-Boot] [PATCH v2 13/20] fdt: Add compatible strings " Ley Foon Tan
2017-03-09  0:26 ` [U-Boot] [PATCH v2 14/20] arm: dts: Add dts and dtsi " Ley Foon Tan
2017-03-09  0:26 ` [U-Boot] [PATCH v2 15/20] arm: socfpga: Add SPL support " Ley Foon Tan
2017-03-10  1:52   ` Marek Vasut
2017-03-22  8:28     ` Ley Foon Tan
2017-03-22  8:41       ` Marek Vasut
2017-03-22  9:21         ` Ley Foon Tan
2017-03-22 14:46           ` Marek Vasut
2017-03-09  0:26 ` [U-Boot] [PATCH v2 16/20] drivers: fpga: Add compile switch for Gen5 only registers Ley Foon Tan
2017-03-10  1:53   ` Marek Vasut
2017-03-22  8:30     ` Ley Foon Tan
2017-03-09  0:26 ` [U-Boot] [PATCH v2 17/20] arm: socfpga: Convert Altera ddr driver to use Kconfig Ley Foon Tan
2017-03-10  1:53   ` Marek Vasut
2017-03-22  9:45     ` Ley Foon Tan
2017-03-22 14:26       ` Marek Vasut
2017-03-23  5:36         ` Ley Foon Tan
2017-03-23  7:39           ` Marek Vasut
2017-03-23  9:54             ` Ley Foon Tan
2017-03-09  0:26 ` [U-Boot] [PATCH v2 18/20] arm: socfpga: Add config and defconfig for Arria 10 Ley Foon Tan
2017-03-10  1:55   ` Marek Vasut
2017-03-22  8:39     ` Ley Foon Tan
2017-03-09  0:26 ` [U-Boot] [PATCH v2 19/20] arm: socfpga: Add board files for the Arria10 Ley Foon Tan
2017-03-09  0:26 ` [U-Boot] [PATCH v2 20/20] arm: socfpga: Enable build for Arria 10 Ley Foon Tan
2017-03-09 21:32 ` [U-Boot] [PATCH v2 00/20] Add Intel Arria 10 SoC support Dinh Nguyen
2017-03-10  1:51   ` Marek Vasut
2017-03-16 21:56 ` Marek Vasut
2017-03-17 12:25   ` Ley Foon Tan
2017-03-17 12:28     ` Marek Vasut
2017-03-20  7:33       ` Ley Foon Tan
2017-03-21  8:26         ` Marek Vasut

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.