All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jit Loon Lim <jit.loon.lim@intel.com>
To: u-boot@lists.denx.de
Cc: Jagan Teki <jagan@amarulasolutions.com>,
	Vignesh R <vigneshr@ti.com>, Marek <marex@denx.de>,
	Simon <simon.k.r.goldschmidt@gmail.com>,
	Tien Fong <tien.fong.chee@intel.com>,
	Kok Kiang <kok.kiang.hea@intel.com>,
	Siew Chin <elly.siew.chin.lim@intel.com>,
	Sin Hui <sin.hui.kho@intel.com>, Raaj <raaj.lokanathan@intel.com>,
	Dinesh <dinesh.maniyam@intel.com>,
	Boon Khai <boon.khai.ng@intel.com>,
	Alif <alif.zakuan.yuslaimi@intel.com>,
	Teik Heng <teik.heng.chong@intel.com>,
	Hazim <muhammad.hazim.izzat.zamri@intel.com>,
	Jit Loon Lim <jit.loon.lim@intel.com>,
	Sieu Mun Tang <sieu.mun.tang@intel.com>,
	Ley Foon Tan <ley.foon.tan@intel.com>
Subject: [PATCH 4/5] arm: socfpga: soc64: Add f2s bridge support
Date: Sun, 13 Nov 2022 22:57:05 +0800	[thread overview]
Message-ID: <20221113145706.5002-4-jit.loon.lim@intel.com> (raw)
In-Reply-To: <20221113145706.5002-1-jit.loon.lim@intel.com>

From: Ley Foon Tan <ley.foon.tan@intel.com>

HSD #1508586908-5: Add F2H and F2SDRAM bridges disable/enable support, based on software
programming flow in HW documentation.

Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
Signed-off-by: Jit Loon Lim <jit.loon.lim@intel.com>
---
 arch/arm/mach-socfpga/reset_manager_s10.c | 122 +++++++++++++++++++++-
 1 file changed, 121 insertions(+), 1 deletion(-)

diff --git a/arch/arm/mach-socfpga/reset_manager_s10.c b/arch/arm/mach-socfpga/reset_manager_s10.c
index 20ab374881..690cfb2b20 100644
--- a/arch/arm/mach-socfpga/reset_manager_s10.c
+++ b/arch/arm/mach-socfpga/reset_manager_s10.c
@@ -17,6 +17,57 @@
 
 DECLARE_GLOBAL_DATA_PTR;
 
+/* F2S manager registers */
+#define F2SDRAM_SIDEBAND_FLAGINSTATUS0	0x14
+#define F2SDRAM_SIDEBAND_FLAGOUTSET0	0x50
+#define F2SDRAM_SIDEBAND_FLAGOUTCLR0	0x54
+
+#ifdef CONFIG_TARGET_SOCFPGA_STRATIX10
+#define FLAGINSTATUS0_MPFE_NOC_IDLE	(BIT(0) | BIT(4) | BIT(8))
+#define FLAGINSTATUS0_MPFE_NOC_IDLEACK	(BIT(1) | BIT(5) | BIT(9))
+#define FLAGINSTATUS0_F2S_CMD_EMPTY	(BIT(2) | BIT(6) | BIT(10))
+#define FLAGINSTATUS0_F2S_RESP_EMPTY	(BIT(3) | BIT(7) | BIT(11))
+
+#define FLGAOUTSET0_MPFE_NOC_IDLEREQ	(BIT(0) | BIT(3) | BIT(6))
+#define FLGAOUTSET0_F2S_EN		(BIT(1) | BIT(4) | BIT(7))
+#define FLGAOUTSET0_F2S_FORCE_DRAIN	(BIT(2) | BIT(5) | BIT(8))
+
+#define FLGAOUTCLR0_F2S_IDLEREQ		(BIT(0) | BIT(3) | BIT(6))
+#else
+#define FLAGINSTATUS0_MPFE_NOC_IDLE	BIT(0)
+#define FLAGINSTATUS0_MPFE_NOC_IDLEACK	BIT(1)
+#define FLAGINSTATUS0_F2S_CMD_EMPTY	BIT(2)
+#define FLAGINSTATUS0_F2S_RESP_EMPTY	BIT(3)
+
+#define FLGAOUTSET0_MPFE_NOC_IDLEREQ	BIT(0)
+#define FLGAOUTSET0_F2S_EN		BIT(1)
+#define FLGAOUTSET0_F2S_FORCE_DRAIN	BIT(2)
+
+#define FLGAOUTCLR0_F2S_IDLEREQ		BIT(0)
+#endif
+
+#define POLL_FOR_ZERO(expr, timeout_ms)		\
+	{					\
+		int timeout = (timeout_ms);	\
+		while ((expr)) {		\
+			if (!timeout)		\
+				break;		\
+			timeout--;		\
+			__socfpga_udelay(1000);	\
+		}				\
+	}
+
+#define POLL_FOR_SET(expr, timeout_ms)		\
+	{					\
+		int timeout = (timeout_ms);	\
+		while (!(expr)) {		\
+			if (!timeout)		\
+				break;		\
+			timeout--;		\
+			__socfpga_udelay(1000);	\
+		}				\
+	}
+
 /* Assert or de-assert SoCFPGA reset manager reset. */
 void socfpga_per_reset(u32 reset, int set)
 {
@@ -57,6 +108,74 @@ void socfpga_per_reset_all(void)
 	writel(0xffffffff, socfpga_get_rstmgr_addr() + RSTMGR_SOC64_PER1MODRST);
 }
 
+static __always_inline void socfpga_f2s_bridges_reset(int enable)
+{
+	int timeout_ms = 300;
+	u32 empty;
+
+	if (enable) {
+		clrbits_le32(socfpga_get_rstmgr_addr() + RSTMGR_SOC64_BRGMODRST,
+			     BRGMODRST_FPGA2SOC_BRIDGES);
+		clrbits_le32(SOCFPGA_F2SDRAM_MGR_ADDRESS +
+			     F2SDRAM_SIDEBAND_FLAGOUTSET0,
+			     FLGAOUTSET0_MPFE_NOC_IDLEREQ);
+
+		POLL_FOR_ZERO((readl(SOCFPGA_F2SDRAM_MGR_ADDRESS +
+			      F2SDRAM_SIDEBAND_FLAGINSTATUS0) &
+			      FLAGINSTATUS0_MPFE_NOC_IDLEACK), timeout_ms);
+		clrbits_le32(SOCFPGA_F2SDRAM_MGR_ADDRESS +
+			     F2SDRAM_SIDEBAND_FLAGOUTSET0,
+			     FLGAOUTSET0_F2S_FORCE_DRAIN);
+		setbits_le32(SOCFPGA_F2SDRAM_MGR_ADDRESS +
+			     F2SDRAM_SIDEBAND_FLAGOUTSET0, FLGAOUTSET0_F2S_EN);
+
+		__socfpga_udelay(1); /* wait 1us */
+	} else {
+		setbits_le32(socfpga_get_rstmgr_addr() + RSTMGR_SOC64_HDSKEN,
+			     RSTMGR_HDSKEN_FPGAHSEN);
+		setbits_le32(socfpga_get_rstmgr_addr() + RSTMGR_SOC64_HDSKREQ,
+			     RSTMGR_HDSKREQ_FPGAHSREQ);
+		POLL_FOR_SET(readl(socfpga_get_rstmgr_addr() +
+			     RSTMGR_SOC64_HDSKACK), timeout_ms);
+		clrbits_le32(SOCFPGA_F2SDRAM_MGR_ADDRESS +
+			     F2SDRAM_SIDEBAND_FLAGOUTSET0, FLGAOUTSET0_F2S_EN);
+		__socfpga_udelay(1);
+		setbits_le32(SOCFPGA_F2SDRAM_MGR_ADDRESS +
+			     F2SDRAM_SIDEBAND_FLAGOUTSET0,
+			     FLGAOUTSET0_F2S_FORCE_DRAIN);
+		__socfpga_udelay(1);
+
+		do {
+			/*
+			 * Read response queue status twice to ensure it is
+			 * empty.
+			 */
+			empty = readl(SOCFPGA_F2SDRAM_MGR_ADDRESS +
+				      F2SDRAM_SIDEBAND_FLAGINSTATUS0) &
+				      FLAGINSTATUS0_F2S_RESP_EMPTY;
+			if (empty) {
+				empty = readl(SOCFPGA_F2SDRAM_MGR_ADDRESS +
+					      F2SDRAM_SIDEBAND_FLAGINSTATUS0) &
+					      FLAGINSTATUS0_F2S_RESP_EMPTY;
+				if (empty)
+					break;
+			}
+
+			timeout_ms--;
+			__socfpga_udelay(1000);
+		} while (timeout_ms);
+
+		setbits_le32(socfpga_get_rstmgr_addr() + RSTMGR_SOC64_BRGMODRST,
+			     BRGMODRST_FPGA2SOC_BRIDGES &
+			     ~RSTMGR_BRGMODRST_FPGA2SOC_MASK);
+		clrbits_le32(socfpga_get_rstmgr_addr() + RSTMGR_SOC64_HDSKREQ,
+			     RSTMGR_HDSKREQ_FPGAHSREQ);
+		setbits_le32(SOCFPGA_F2SDRAM_MGR_ADDRESS +
+			     F2SDRAM_SIDEBAND_FLAGOUTCLR0,
+			     FLGAOUTCLR0_F2S_IDLEREQ);
+	}
+}
+
 static __always_inline void socfpga_s2f_bridges_reset(int enable)
 {
 	if (enable) {
@@ -109,13 +228,14 @@ void socfpga_bridges_reset(int enable)
 			hang();
 	} else {
 		socfpga_s2f_bridges_reset(enable);
-
+		socfpga_f2s_bridges_reset(enable);
 	}
 }
 
 void __secure socfpga_bridges_reset_psci(int enable)
 {
 	socfpga_s2f_bridges_reset(enable);
+	socfpga_f2s_bridges_reset(enable);
 }
 
 /*
-- 
2.26.2


  parent reply	other threads:[~2022-11-13 14:58 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-11-13 14:57 [PATCH 1/5] arm: socfpga: Add F2SDRAM_MANAGER base address Jit Loon Lim
2022-11-13 14:57 ` [PATCH 2/5] arm: socfpga: soc64: Update reset manager registers Jit Loon Lim
2022-11-13 14:57 ` [PATCH 3/5] arm: socfpga: soc64: Move bridges reset to common function Jit Loon Lim
2022-11-13 14:57 ` Jit Loon Lim [this message]
2022-11-13 14:57 ` [PATCH 5/5] arm: socfpga: soc64: Avoid hang in bridge reset Jit Loon Lim

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20221113145706.5002-4-jit.loon.lim@intel.com \
    --to=jit.loon.lim@intel.com \
    --cc=alif.zakuan.yuslaimi@intel.com \
    --cc=boon.khai.ng@intel.com \
    --cc=dinesh.maniyam@intel.com \
    --cc=elly.siew.chin.lim@intel.com \
    --cc=jagan@amarulasolutions.com \
    --cc=kok.kiang.hea@intel.com \
    --cc=ley.foon.tan@intel.com \
    --cc=marex@denx.de \
    --cc=muhammad.hazim.izzat.zamri@intel.com \
    --cc=raaj.lokanathan@intel.com \
    --cc=sieu.mun.tang@intel.com \
    --cc=simon.k.r.goldschmidt@gmail.com \
    --cc=sin.hui.kho@intel.com \
    --cc=teik.heng.chong@intel.com \
    --cc=tien.fong.chee@intel.com \
    --cc=u-boot@lists.denx.de \
    --cc=vigneshr@ti.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.