uboot/arch/microblaze/lib/bootm.c
<<
>>
Prefs
   1/*
   2 * (C) Copyright 2007 Michal Simek
   3 * (C) Copyright 2004 Atmark Techno, Inc.
   4 *
   5 * Michal  SIMEK <monstr@monstr.eu>
   6 * Yasushi SHOJI <yashi@atmark-techno.com>
   7 *
   8 * SPDX-License-Identifier:     GPL-2.0+
   9 */
  10
  11#include <common.h>
  12#include <command.h>
  13#include <fdt_support.h>
  14#include <image.h>
  15#include <u-boot/zlib.h>
  16#include <asm/byteorder.h>
  17
  18DECLARE_GLOBAL_DATA_PTR;
  19
  20int do_bootm_linux(int flag, int argc, char * const argv[],
  21                   bootm_headers_t *images)
  22{
  23        /* First parameter is mapped to $r5 for kernel boot args */
  24        void    (*thekernel) (char *, ulong, ulong);
  25        char    *commandline = getenv("bootargs");
  26        ulong   rd_data_start, rd_data_end;
  27
  28        /*
  29         * allow the PREP bootm subcommand, it is required for bootm to work
  30         */
  31        if (flag & BOOTM_STATE_OS_PREP)
  32                return 0;
  33
  34        if ((flag != 0) && (flag != BOOTM_STATE_OS_GO))
  35                return 1;
  36
  37        int     ret;
  38
  39        char    *of_flat_tree = NULL;
  40#if defined(CONFIG_OF_LIBFDT)
  41        /* did generic code already find a device tree? */
  42        if (images->ft_len)
  43                of_flat_tree = images->ft_addr;
  44#endif
  45
  46        thekernel = (void (*)(char *, ulong, ulong))images->ep;
  47
  48        /* find ramdisk */
  49        ret = boot_get_ramdisk(argc, argv, images, IH_ARCH_MICROBLAZE,
  50                        &rd_data_start, &rd_data_end);
  51        if (ret)
  52                return 1;
  53
  54        bootstage_mark(BOOTSTAGE_ID_RUN_OS);
  55
  56        if (!of_flat_tree && argc > 1)
  57                of_flat_tree = (char *)simple_strtoul(argv[1], NULL, 16);
  58
  59        /* fixup the initrd now that we know where it should be */
  60        if (images->rd_start && images->rd_end && of_flat_tree)
  61                ret = fdt_initrd(of_flat_tree, images->rd_start,
  62                                 images->rd_end);
  63                if (ret)
  64                        return 1;
  65
  66#ifdef DEBUG
  67        printf("## Transferring control to Linux (at address 0x%08lx) ",
  68               (ulong)thekernel);
  69        printf("ramdisk 0x%08lx, FDT 0x%08lx...\n",
  70               rd_data_start, (ulong) of_flat_tree);
  71#endif
  72
  73#ifdef XILINX_USE_DCACHE
  74        flush_cache(0, XILINX_DCACHE_BYTE_SIZE);
  75#endif
  76        /*
  77         * Linux Kernel Parameters (passing device tree):
  78         * r5: pointer to command line
  79         * r6: pointer to ramdisk
  80         * r7: pointer to the fdt, followed by the board info data
  81         */
  82        thekernel(commandline, rd_data_start, (ulong)of_flat_tree);
  83        /* does not return */
  84
  85        return 1;
  86}
  87