Merge tag 'u-boot-atmel-fixes-2020.07-a' of https://gitlab.denx.de/u-boot/custodians...
[oweals/u-boot.git] / arch / arm / mach-k3 / sysfw-loader.c
index 94dbeb9437d9472ca3e469a741c82156bf44c896..513be09c6878eec6fcf3915c9bd08b6fb0eb7eaf 100644 (file)
@@ -7,13 +7,18 @@
  */
 
 #include <common.h>
+#include <image.h>
+#include <log.h>
 #include <spl.h>
 #include <malloc.h>
 #include <remoteproc.h>
+#include <asm/cache.h>
 #include <linux/soc/ti/ti_sci_protocol.h>
 #include <g_dnl.h>
 #include <usb.h>
 #include <dfu.h>
+#include <dm/uclass-internal.h>
+#include <spi_flash.h>
 
 #include <asm/arch/sys_proto.h>
 #include "common.h"
@@ -197,12 +202,33 @@ exit:
 }
 #endif
 
-void k3_sysfw_loader(void (*config_pm_done_callback)(void))
+#if CONFIG_IS_ENABLED(SPI_LOAD)
+static void *k3_sysfw_get_spi_addr(void)
+{
+       struct udevice *dev;
+       fdt_addr_t addr;
+       int ret;
+
+       ret = uclass_find_device_by_seq(UCLASS_SPI, CONFIG_SF_DEFAULT_BUS,
+                                       true, &dev);
+       if (ret)
+               return NULL;
+
+       addr = dev_read_addr_index(dev, 1);
+       if (addr == FDT_ADDR_T_NONE)
+               return NULL;
+
+       return (void *)(addr + CONFIG_K3_SYSFW_IMAGE_SPI_OFFS);
+}
+#endif
+
+void k3_sysfw_loader(void (*config_pm_pre_callback) (void),
+                    void (*config_pm_done_callback)(void))
 {
        struct spl_image_info spl_image = { 0 };
        struct spl_boot_device bootdev = { 0 };
        struct ti_sci_handle *ti_sci;
-       int ret;
+       int ret = 0;
 
        /* Reserve a block of aligned memory for loading the SYSFW image */
        sysfw_load_address = memalign(ARCH_DMA_MINALIGN,
@@ -243,6 +269,13 @@ void k3_sysfw_loader(void (*config_pm_done_callback)(void))
 #endif
                break;
 #endif
+#if CONFIG_IS_ENABLED(SPI_LOAD)
+       case BOOT_DEVICE_SPI:
+               sysfw_load_address = k3_sysfw_get_spi_addr();
+               if (!sysfw_load_address)
+                       ret = -ENODEV;
+               break;
+#endif
 #if CONFIG_IS_ENABLED(YMODEM_SUPPORT)
        case BOOT_DEVICE_UART:
 #ifdef CONFIG_K3_EARLY_CONS
@@ -291,6 +324,9 @@ void k3_sysfw_loader(void (*config_pm_done_callback)(void))
        /* Get handle for accessing SYSFW services */
        ti_sci = get_ti_sci_handle();
 
+       if (config_pm_pre_callback)
+               config_pm_pre_callback();
+
        /* Parse and apply the different SYSFW configuration fragments */
        k3_sysfw_configure_using_fit(sysfw_load_address, ti_sci);
 
@@ -301,22 +337,4 @@ void k3_sysfw_loader(void (*config_pm_done_callback)(void))
         */
        if (config_pm_done_callback)
                config_pm_done_callback();
-
-       /*
-        * Output System Firmware version info. Note that since the
-        * 'firmware_description' field is not guaranteed to be zero-
-        * terminated we manually add a \0 terminator if needed. Further
-        * note that we intentionally no longer rely on the extended
-        * printf() formatter '%.*s' to not having to require a more
-        * full-featured printf() implementation.
-        */
-       char fw_desc[sizeof(ti_sci->version.firmware_description) + 1];
-
-       strncpy(fw_desc, ti_sci->version.firmware_description,
-               sizeof(ti_sci->version.firmware_description));
-       fw_desc[sizeof(fw_desc) - 1] = '\0';
-
-       printf("SYSFW ABI: %d.%d (firmware rev 0x%04x '%s')\n",
-              ti_sci->version.abi_major, ti_sci->version.abi_minor,
-              ti_sci->version.firmware_revision, fw_desc);
 }