On 17.04.19 22:15, Marek Vasut wrote:
Add optional "mask" argument to the SoCFPGA bridge command, to select
which bridges should be enabled/disabled. This allows the user to avoid
enabling bridges which are not connected into the FPGA fabric. Default
behavior is to enable/disable all bridges.

So does this change the command? Seems like leaving away the new 'mask' argument would now lead to enabling all bridges by overwriting whatever the handoff values were before?

Regards,
Simon


Signed-off-by: Marek Vasut <[email protected]>
Cc: Chin Liang See <[email protected]>
Cc: Dinh Nguyen <[email protected]>
Cc: Simon Goldschmidt <[email protected]>
Cc: Tien Fong Chee <[email protected]>
---
  arch/arm/mach-socfpga/include/mach/misc.h |  2 +-
  arch/arm/mach-socfpga/misc.c              | 17 +++++++++++------
  arch/arm/mach-socfpga/misc_arria10.c      |  2 +-
  arch/arm/mach-socfpga/misc_gen5.c         | 12 +++++++++++-
  arch/arm/mach-socfpga/misc_s10.c          |  2 +-
  5 files changed, 25 insertions(+), 10 deletions(-)

diff --git a/arch/arm/mach-socfpga/include/mach/misc.h 
b/arch/arm/mach-socfpga/include/mach/misc.h
index 86d5d2b62b..c3ca8cdf3b 100644
--- a/arch/arm/mach-socfpga/include/mach/misc.h
+++ b/arch/arm/mach-socfpga/include/mach/misc.h
@@ -39,6 +39,6 @@ void socfpga_init_security_policies(void);
  void socfpga_sdram_remap_zero(void);
  #endif
-void do_bridge_reset(int enable);
+void do_bridge_reset(int enable, unsigned int mask);
#endif /* _MISC_H_ */
diff --git a/arch/arm/mach-socfpga/misc.c b/arch/arm/mach-socfpga/misc.c
index ec8339e045..e1ea8eb73e 100644
--- a/arch/arm/mach-socfpga/misc.c
+++ b/arch/arm/mach-socfpga/misc.c
@@ -126,17 +126,22 @@ int arch_cpu_init(void)
  #ifndef CONFIG_SPL_BUILD
  static int do_bridge(cmd_tbl_t *cmdtp, int flag, int argc, char * const 
argv[])
  {
-       if (argc != 2)
+       unsigned int mask = ~0;
+
+       if (argc < 2 || argc > 3)
                return CMD_RET_USAGE;
argv++; + if (argc == 3)
+               mask = simple_strtoul(argv[1], NULL, 16);
+
        switch (*argv[0]) {
        case 'e':       /* Enable */
-               do_bridge_reset(1);
+               do_bridge_reset(1, mask);
                break;
        case 'd':       /* Disable */
-               do_bridge_reset(0);
+               do_bridge_reset(0, mask);
                break;
        default:
                return CMD_RET_USAGE;
@@ -145,10 +150,10 @@ static int do_bridge(cmd_tbl_t *cmdtp, int flag, int 
argc, char * const argv[])
        return 0;
  }
-U_BOOT_CMD(bridge, 2, 1, do_bridge,
+U_BOOT_CMD(bridge, 3, 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"
+          "enable [mask] - Enable HPS-to-FPGA, FPGA-to-HPS, LWHPS-to-FPGA 
bridges\n"
+          "bridge disable [mask] - Enable HPS-to-FPGA, FPGA-to-HPS, LWHPS-to-FPGA 
bridges\n"
           ""
  );
diff --git a/arch/arm/mach-socfpga/misc_arria10.c b/arch/arm/mach-socfpga/misc_arria10.c
index 63b8c75d31..2e2a40b65d 100644
--- a/arch/arm/mach-socfpga/misc_arria10.c
+++ b/arch/arm/mach-socfpga/misc_arria10.c
@@ -115,7 +115,7 @@ int print_cpuinfo(void)
  }
  #endif
-void do_bridge_reset(int enable)
+void do_bridge_reset(int enable, unsigned int mask)
  {
        if (enable)
                socfpga_reset_deassert_bridges_handoff();
diff --git a/arch/arm/mach-socfpga/misc_gen5.c 
b/arch/arm/mach-socfpga/misc_gen5.c
index 6e11ba6cb2..7876953595 100644
--- a/arch/arm/mach-socfpga/misc_gen5.c
+++ b/arch/arm/mach-socfpga/misc_gen5.c
@@ -249,9 +249,19 @@ static void socfpga_sdram_apply_static_cfg(void)
        : : "r"(val), "r"(&sdr_ctrl->static_cfg) : "memory", "cc");
  }
-void do_bridge_reset(int enable)
+void do_bridge_reset(int enable, unsigned int mask)
  {
+       int i;
+
        if (enable) {
+               socfpga_bridges_set_handoff_regs(!(mask & BIT(0)),
+                                                !(mask & BIT(1)),
+                                                !(mask & BIT(2)));
+               for (i = 0; i < 2; i++) {    /* Reload SW setting cache */
+                       iswgrp_handoff[i] =
+                               readl(&sysmgr_regs->iswgrp_handoff[i]);
+               }
+
                writel(iswgrp_handoff[2], &sysmgr_regs->fpgaintfgrp_module);
                socfpga_sdram_apply_static_cfg();
                writel(iswgrp_handoff[3], &sdr_ctrl->fpgaport_rst);
diff --git a/arch/arm/mach-socfpga/misc_s10.c b/arch/arm/mach-socfpga/misc_s10.c
index 113eace650..60c96090ce 100644
--- a/arch/arm/mach-socfpga/misc_s10.c
+++ b/arch/arm/mach-socfpga/misc_s10.c
@@ -150,7 +150,7 @@ int arch_early_init_r(void)
        return 0;
  }
-void do_bridge_reset(int enable)
+void do_bridge_reset(int enable, unsigned int mask)
  {
        socfpga_bridges_reset(enable);
  }

_______________________________________________
U-Boot mailing list
[email protected]
https://lists.denx.de/listinfo/u-boot

Reply via email to