board: synquacer: Initialize SCBM SMMU at board_init()
authorMasami Hiramatsu <masami.hiramatsu@linaro.org>
Mon, 12 Jul 2021 10:35:44 +0000 (19:35 +0900)
committerTom Rini <trini@konsulko.com>
Fri, 23 Jul 2021 22:53:45 +0000 (18:53 -0400)
Since the SCBM SMMU is not only connected to the NETSEC
but also shared with the F_SDH30 (eMMC controller), that
should be initialized at board level instead of NETSEC.

Move the SMMU initialization code into board support
and call it from board_init().

Without this fix, if the NETSEC is disabled, the Linux
eMMC ADMA cause an error because SMMU is not initialized.

Signed-off-by: Masami Hiramatsu <masami.hiramatsu@linaro.org>
board/socionext/developerbox/developerbox.c
drivers/net/sni_netsec.c

index 34335baec36ef9a675af55d2399b60d3a8fe6ac8..9552bfcdc3bb64cbc3125057bfb50d615c6555c7 100644 (file)
@@ -62,6 +62,19 @@ DECLARE_GLOBAL_DATA_PTR;
 
 #define LOAD_OFFSET 0x100
 
+/* SCBM System MMU is used for eMMC and NETSEC */
+#define SCBM_SMMU_ADDR                         (0x52e00000UL)
+#define SMMU_SCR0_OFFS                         (0x0)
+#define SMMU_SCR0_SHCFG_INNER                  (0x2 << 22)
+#define SMMU_SCR0_MTCFG                                (0x1 << 20)
+#define SMMU_SCR0_MEMATTR_INNER_OUTER_WB       (0xf << 16)
+
+static void synquacer_setup_scbm_smmu(void)
+{
+       writel(SMMU_SCR0_SHCFG_INNER | SMMU_SCR0_MTCFG | SMMU_SCR0_MEMATTR_INNER_OUTER_WB,
+              SCBM_SMMU_ADDR + SMMU_SCR0_OFFS);
+}
+
 /*
  * Miscellaneous platform dependent initialisations
  */
@@ -71,6 +84,8 @@ int board_init(void)
 
        gd->env_addr = (ulong)&default_environment[0];
 
+       synquacer_setup_scbm_smmu();
+
        return 0;
 }
 
index a9ebf6af9c562a23f070585e5da21334ddb96142..4901321d0cf2f8f46fc49294c0041e56706287c5 100644 (file)
@@ -1059,18 +1059,11 @@ static int netsec_of_to_plat(struct udevice *dev)
        return 0;
 }
 
-#define SMMU_SCR0_SHCFG_INNER             (0x2 << 22)
-#define SMMU_SCR0_MTCFG                   (0x1 << 20)
-#define SMMU_SCR0_MEMATTR_INNER_OUTER_WB  (0xf << 16)
-
 static int netsec_probe(struct udevice *dev)
 {
        struct netsec_priv *priv = dev_get_priv(dev);
        int ret;
 
-       writel(SMMU_SCR0_SHCFG_INNER | SMMU_SCR0_MTCFG | SMMU_SCR0_MEMATTR_INNER_OUTER_WB,
-              (phys_addr_t)0x52E00000);
-
        netsec_reset_hardware(priv, true);
 
        ret = netsec_mdiobus_init(priv, dev->name);