BIOS boot firmware from SPI with address offset
authorrprinz08 <richard.prinz@min.at>
Sat, 9 May 2020 17:20:32 +0000 (19:20 +0200)
committerrprinz08 <richard.prinz@min.at>
Sat, 9 May 2020 17:20:32 +0000 (19:20 +0200)
litex/soc/software/bios/boot.c

index 8f53fcca3ec2232e966d4f11d18326f917acd636..ba2376cb7eff9d5362724a3fbfc415d5d78174df 100644 (file)
@@ -366,6 +366,11 @@ void netboot(void)
 #endif
 
 #ifdef FLASH_BOOT_ADDRESS
+#ifdef FLASH_BOOT_OFFSET
+unsigned int flash_boot_address = FLASH_BOOT_ADDRESS + FLASH_BOOT_OFFSET;
+#else
+unsigned int flash_boot_address = FLASH_BOOT_ADDRESS;
+#endif
 
 /* On systems with exernal SDRAM we copy out of the SPI flash into the SDRAM
    before running, as it is faster.  If we have no SDRAM then we have to
@@ -374,7 +379,7 @@ void netboot(void)
 #define FIRMWARE_BASE_ADDRESS MAIN_RAM_BASE
 #else
 /* Firmware code starts after (a) length and (b) CRC -- both unsigned ints */
-#define FIRMWARE_BASE_ADDRESS (FLASH_BOOT_ADDRESS + 2 * sizeof(unsigned int))
+#define FIRMWARE_BASE_ADDRESS (flash_boot_address + 2 * sizeof(unsigned int))
 #endif
 
 static unsigned int check_image_in_flash(unsigned int base_address)
@@ -399,7 +404,7 @@ static unsigned int check_image_in_flash(unsigned int base_address)
        return length;
 }
 
-#if defined(MAIN_RAM_BASE) && defined(CONFIG_CPU_TYPE_VEXRISCV) && defined(CONFIG_CPU_VARIANT_LINUX)
+#if defined(MAIN_RAM_BASE) && defined(CONFIG_CPU_TYPE_VEXRISCV) && defined(FLASH_BOOT_ADDRESS)
 static int copy_image_from_flash_to_ram(unsigned int flash_address, unsigned int ram_address)
 {
        unsigned int length;
@@ -408,7 +413,7 @@ static int copy_image_from_flash_to_ram(unsigned int flash_address, unsigned int
        if(length > 0) {
                printf("Copying %d bytes from 0x%08x to 0x%08x...\n", length, flash_address, ram_address);
                // skip length and crc
-               memcpy((void *)ram_address, (void *)flash_address + 8, length);
+               memcpy((void *)ram_address, (unsigned int *)(flash_address + 2 * sizeof(unsigned int)), length);
                return 1;
        }
 
@@ -432,34 +437,34 @@ static int copy_image_from_flash_to_ram(unsigned int flash_address, unsigned int
 void flashboot(void)
 {
        unsigned int length;
+       unsigned int result;
 
 #if defined(MAIN_RAM_BASE) && defined(CONFIG_CPU_TYPE_VEXRISCV) && defined(CONFIG_CPU_VARIANT_LINUX)
-       unsigned int result;
 
        printf("Loading Image from flash...\n");
        result = copy_image_from_flash_to_ram(
-               (FLASH_BOOT_ADDRESS + KERNEL_IMAGE_FLASH_OFFSET),
+               (flash_boot_address + KERNEL_IMAGE_FLASH_OFFSET),
                (MAIN_RAM_BASE + KERNEL_IMAGE_RAM_OFFSET));
 
 
        if(result) {
                printf("Loading rootfs.cpio from flash...\n");
                result &= copy_image_from_flash_to_ram(
-                       (FLASH_BOOT_ADDRESS + ROOTFS_IMAGE_FLASH_OFFSET),
+                       (flash_boot_address + ROOTFS_IMAGE_FLASH_OFFSET),
                        (MAIN_RAM_BASE + ROOTFS_IMAGE_RAM_OFFSET));
        }
 
        if(result) {
                printf("Loading rv32.dtb from flash...\n");
                result &= copy_image_from_flash_to_ram(
-                       (FLASH_BOOT_ADDRESS + DEVICE_TREE_IMAGE_FLASH_OFFSET),
+                       (flash_boot_address + DEVICE_TREE_IMAGE_FLASH_OFFSET),
                        (MAIN_RAM_BASE + DEVICE_TREE_IMAGE_RAM_OFFSET));
        }
 
        if(result) {
                printf("Loading emulator.bin from flash...\n");
                result &= copy_image_from_flash_to_ram(
-                       (FLASH_BOOT_ADDRESS + EMULATOR_IMAGE_FLASH_OFFSET),
+                       (flash_boot_address + EMULATOR_IMAGE_FLASH_OFFSET),
                        (MAIN_RAM_BASE + EMULATOR_IMAGE_RAM_OFFSET));
        }
 
@@ -469,15 +474,15 @@ void flashboot(void)
        }
 #endif
 
-       printf("Booting from flash...\n");
-       length = check_image_in_flash(FLASH_BOOT_ADDRESS);
+       printf("Booting from flash addr 0x%08x...\n", flash_boot_address);
+       length = check_image_in_flash(flash_boot_address);
        if(!length)
                return;
 
 #ifdef MAIN_RAM_BASE
-       printf("Loading %d bytes from flash...\n", length);
-       // skip length and crc
-       memcpy((void *)MAIN_RAM_BASE, (unsigned int *)(FLASH_BOOT_ADDRESS + 2 * sizeof(unsigned int)), length);
+       result = copy_image_from_flash_to_ram(flash_boot_address, MAIN_RAM_BASE);
+       if(!result)
+               return;
 #endif
 
        boot(0, 0, 0, FIRMWARE_BASE_ADDRESS);