drivers: fpga: Add FPGA configuration during bootm for Intel SOCFPGA
authorMuhammad Hazim Izzat Zamri <muhammad.hazim.izzat.zamri@altera.com>
Fri, 14 Mar 2025 02:19:52 +0000 (19:19 -0700)
committerMichal Simek <michal.simek@amd.com>
Wed, 16 Apr 2025 11:42:06 +0000 (13:42 +0200)
Enabling the capability to automatically perform FPGA configuration
when booting Linux FIT image via bootm command. The FPGA
configuration bitstream shall be packed within the FIT image.

The FPGA data (full or partial) is checked by the SDM hardware,
for Intel SDM Mailbox based devices. Hence always return full
bitstream.

Second function is to enable the HPS to FPGA bridges when FPGA load
is completed successfully. This is to ensure the FPGA is accessible
by the HPS.

Signed-off-by: Muhammad Hazim Izzat Zamri <muhammad.hazim.izzat.zamri@altera.com>
Link: https://lore.kernel.org/r/20250314021953.18379-2-muhammad.hazim.izzat.zamri@altera.com
Signed-off-by: Michal Simek <michal.simek@amd.com>
drivers/fpga/altera.c

index ae06f01..136ccfc 100644 (file)
 /*
  *  Altera FPGA support
  */
+#if IS_ENABLED(CONFIG_TARGET_SOCFPGA_AGILEX) || \
+       IS_ENABLED(CONFIG_TARGET_SOCFPGA_STRATIX10)
+#include <asm/arch/misc.h>
+#endif
 #include <errno.h>
 #include <ACEX1K.h>
 #include <log.h>
@@ -47,6 +51,42 @@ static const struct altera_fpga {
 #endif
 };
 
+#if IS_ENABLED(CONFIG_TARGET_SOCFPGA_AGILEX) || \
+       IS_ENABLED(CONFIG_TARGET_SOCFPGA_STRATIX10)
+int fpga_is_partial_data(int devnum, size_t img_len)
+{
+       /*
+        * The FPGA data (full or partial) is checked by
+        * the SDM hardware, for Intel SDM Mailbox based
+        * devices. Hence always return full bitstream.
+        *
+        * For Cyclone V and Arria 10 family, the bitstream
+        * type parameter is not handled by the driver.
+        */
+       return 0;
+}
+
+int fpga_loadbitstream(int devnum, char *fpgadata, size_t size,
+                      bitstream_type bstype)
+{
+       int ret_val;
+
+       ret_val = fpga_load(devnum, (void *)fpgadata, size, bstype);
+
+       /*
+        * Enable the HPS to FPGA bridges when FPGA load is completed
+        * successfully. This is to ensure the FPGA is accessible
+        * by the HPS.
+        */
+       if (!ret_val) {
+               printf("Enable FPGA bridges\n");
+               do_bridge_reset(1, ~0);
+       }
+
+       return ret_val;
+}
+#endif
+
 static int altera_validate(Altera_desc *desc, const char *fn)
 {
        if (!desc) {